| name: Apple |
| |
| on: |
| push: |
| branches: |
| - main |
| - release/* |
| pull_request: |
| paths: |
| - .ci/docker/** |
| - .ci/scripts/setup-ios.sh |
| - .github/workflows/apple.yml |
| - install_requirements.sh |
| - backends/apple/** |
| - build/build_apple_frameworks.sh |
| - build/create_frameworks.sh |
| - build/test_ios_ci.sh |
| - examples/demo-apps/apple/** |
| - extension/apple/** |
| - extension/module/** |
| workflow_dispatch: |
| # TODO (huydhn): This is used to validate the test spec. Eventually, we need a proper |
| # perf benchmark workflow like android-perf. This can be cleaned up once that workflow |
| # is ready |
| workflow_call: |
| inputs: |
| test_spec: |
| description: The test spec to drive the test on AWS devices |
| required: false |
| type: string |
| |
| concurrency: |
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}-${{ github.event_name == 'schedule' }} |
| cancel-in-progress: true |
| |
| jobs: |
| build-demo-ios: |
| name: test-demo-ios |
| uses: pytorch/test-infra/.github/workflows/macos_job.yml@main |
| secrets: inherit |
| with: |
| runner: macos-latest-xlarge |
| python-version: '3.11' |
| submodules: 'true' |
| ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} |
| timeout: 90 |
| secrets-env: BUILD_CERTIFICATE_BASE64 EXECUTORCH_DEMO_BUILD_PROVISION_PROFILE_BASE64 KEYCHAIN_PASSWORD |
| upload-artifact: ios-apps |
| script: | |
| BUILD_TOOL=cmake |
| |
| .ci/scripts/setup-conda.sh |
| |
| # Setup Apple certificate for iOS development |
| BUILD_PROVISION_PROFILE_BASE64="${SECRET_EXECUTORCH_DEMO_BUILD_PROVISION_PROFILE_BASE64}" \ |
| BUILD_CERTIFICATE_BASE64="${SECRET_BUILD_CERTIFICATE_BASE64}" \ |
| KEYCHAIN_PASSWORD="${SECRET_KEYCHAIN_PASSWORD}" \ |
| .ci/scripts/setup-ios.sh |
| |
| # Setup MacOS dependencies as there is no Docker support on MacOS atm |
| GITHUB_RUNNER=1 PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| .ci/scripts/setup-macos.sh "${BUILD_TOOL}" |
| |
| export ARTIFACTS_DIR_NAME=artifacts-to-be-uploaded |
| |
| # Build and test iOS Demo App |
| PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| build/test_ios_ci.sh ${ARTIFACTS_DIR_NAME} |
| |
| # Upload the test demo app to S3 |
| upload-demo-ios: |
| needs: build-demo-ios |
| runs-on: linux.2xlarge |
| steps: |
| - name: Download the artifacts from GitHub |
| uses: actions/download-artifact@v3 |
| with: |
| # The name here needs to match the name of the upload-artifact parameter |
| name: ios-apps |
| path: ${{ runner.temp }}/artifacts/ |
| |
| - name: Verify the artifacts |
| shell: bash |
| working-directory: ${{ runner.temp }}/artifacts/ |
| run: | |
| ls -lah ./ |
| |
| - name: Upload the artifacts to S3 |
| uses: seemethere/upload-artifact-s3@v5 |
| with: |
| s3-bucket: gha-artifacts |
| s3-prefix: | |
| ${{ github.repository }}/${{ github.run_id }}/artifact |
| retention-days: 14 |
| if-no-files-found: ignore |
| path: ${{ runner.temp }}/artifacts/ |
| |
| test-demo-ios: |
| # Only PR from ExecuTorch itself has permission to access AWS, forked PRs will fail to |
| # authenticate with the cloud service. So, this job will be skipped on the latter |
| if: ${{ !github.event.pull_request.head.repo.fork }} |
| needs: upload-demo-ios |
| permissions: |
| id-token: write |
| contents: read |
| uses: pytorch/test-infra/.github/workflows/mobile_job.yml@main |
| with: |
| device-type: ios |
| # For iOS testing, the runner just needs to call AWS Device Farm, so there is no need to run this on macOS |
| runner: linux.2xlarge |
| test-infra-ref: '' |
| # This is the ARN of ExecuTorch project on AWS |
| project-arn: arn:aws:devicefarm:us-west-2:308535385114:project:02a2cf0f-6d9b-45ee-ba1a-a086587469e6 |
| # This is the custom device pool that only includes iOS devices |
| device-pool-arn: arn:aws:devicefarm:us-west-2:308535385114:devicepool:02a2cf0f-6d9b-45ee-ba1a-a086587469e6/3b5acd2e-92e2-4778-b651-7726bafe129d |
| # Uploaded to S3 from the previous job |
| ios-ipa-archive: https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifact/ExecuTorchDemo.ipa |
| ios-xctestrun-zip: https://gha-artifacts.s3.amazonaws.com/${{ github.repository }}/${{ github.run_id }}/artifact/ExecuTorchDemo.xctestrun.zip |
| test-spec: ${{ inputs.test_spec || 'https://ossci-ios.s3.amazonaws.com/executorch/default-ios-device-farm-appium-test-spec.yml' }} |
| |
| build-frameworks-ios: |
| name: build-frameworks-ios |
| uses: pytorch/test-infra/.github/workflows/macos_job.yml@main |
| with: |
| runner: macos-latest-xlarge |
| python-version: '3.11' |
| submodules: 'true' |
| ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} |
| upload-artifact: executorch-frameworks-ios |
| timeout: 90 |
| script: | |
| BUILD_TOOL=cmake |
| VERSION="latest" |
| FRAMEWORKS=( |
| "executorch" |
| "backend_coreml" |
| "backend_mps" |
| "backend_xnnpack" |
| "kernels_custom" |
| "kernels_optimized" |
| "kernels_portable" |
| "kernels_quantized" |
| ) |
| |
| .ci/scripts/setup-conda.sh |
| |
| # Setup MacOS dependencies as there is no Docker support on MacOS atm |
| GITHUB_RUNNER=1 PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| .ci/scripts/setup-macos.sh "${BUILD_TOOL}" |
| |
| # Install CoreML Backend Requirements |
| PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| backends/apple/coreml/scripts/install_requirements.sh |
| |
| # Install MPS Backend Requirements |
| PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| backends/apple/mps/install_requirements.sh |
| |
| # Build Release iOS Frameworks |
| PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| build/build_apple_frameworks.sh --coreml --custom --mps --optimized --portable --quantized --xnnpack |
| |
| # Bundle Release iOS Frameworks |
| for FRAMEWORK in "${FRAMEWORKS[@]}"; do ( |
| cd cmake-out && \ |
| zip -r "${RUNNER_TEMP}/artifacts/${FRAMEWORK}-${VERSION}.zip" "${FRAMEWORK}.xcframework" |
| ) done |
| |
| # Build Debug iOS Frameworks |
| PYTHON_EXECUTABLE=python ${CONDA_RUN} --no-capture-output \ |
| build/build_apple_frameworks.sh --coreml --custom --mps --optimized --portable --quantized --xnnpack --Debug |
| |
| # Bundle Debug iOS Frameworks |
| for FRAMEWORK in "${FRAMEWORKS[@]}"; do ( |
| cd cmake-out && \ |
| mv "${FRAMEWORK}.xcframework" "${FRAMEWORK}_debug.xcframework" && \ |
| zip -r "${RUNNER_TEMP}/artifacts/${FRAMEWORK}_debug-${VERSION}.zip" "${FRAMEWORK}_debug.xcframework" |
| ) done |
| |
| upload-frameworks-ios: |
| runs-on: ubuntu-22.04 |
| needs: build-frameworks-ios |
| timeout-minutes: 30 |
| permissions: |
| id-token: write |
| contents: read |
| steps: |
| - uses: actions/checkout@v3 |
| - uses: actions/setup-python@v4 |
| with: |
| python-version: '3.11' |
| cache: pip |
| - name: configure aws credentials |
| uses: aws-actions/configure-aws-credentials@v1.7.0 |
| with: |
| role-to-assume: arn:aws:iam::308535385114:role/gha_executorch_upload-frameworks-ios |
| aws-region: us-east-1 |
| - name: Download the artifact |
| uses: actions/download-artifact@v3 |
| with: |
| # NB: The name here needs to match the upload-artifact name from build-frameworks-ios job |
| name: executorch-frameworks-ios |
| path: ${{ runner.temp }}/frameworks-ios/ |
| - name: Only push to S3 when running the workflow manually from main branch |
| if: ${{ github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' }} |
| shell: bash |
| run: | |
| set -eux |
| echo "UPLOAD_ON_MAIN=1" >> "${GITHUB_ENV}" |
| - name: Upload the artifact to ossci-ios S3 bucket |
| shell: bash |
| run: | |
| set -eux |
| |
| pip install awscli==1.32.18 |
| |
| AWS_CMD="aws s3 cp --dryrun" |
| if [[ "${UPLOAD_ON_MAIN:-0}" == "1" ]]; then |
| AWS_CMD="aws s3 cp" |
| fi |
| |
| for FILENAME in "${RUNNER_TEMP}"/frameworks-ios/*.zip; do |
| [ -e "${FILENAME}" ] || continue |
| shasum -a 256 "${FILENAME}" |
| ${AWS_CMD} "${FILENAME}" s3://ossci-ios/executorch/ --acl public-read |
| done |