| # @generated DO NOT EDIT MANUALLY |
| # Template is at: .github/templates/bazel_ci_workflow.yml.j2 |
| # Generation script: .github/scripts/generate_ci_workflows.py |
| name: linux-xenial-py3.6-gcc7-bazel-test |
| |
| on: |
| pull_request: |
| types: [opened, synchronize, reopened, unassigned] |
| push: |
| branches: |
| - master |
| - release/* |
| workflow_dispatch: |
| |
| env: |
| BUILD_ENVIRONMENT: linux-xenial-py3.6-gcc7-bazel-test |
| DOCKER_IMAGE_BASE: 308535385114.dkr.ecr.us-east-1.amazonaws.com/pytorch/pytorch-linux-bionic-cuda10.2-cudnn7-py3.9-gcc7 |
| SCCACHE_BUCKET: ossci-compiler-cache-circleci-v2 |
| XLA_CLANG_CACHE_S3_BUCKET_NAME: ossci-compiler-clang-cache-circleci-xla |
| TORCH_CUDA_ARCH_LIST: 5.2 |
| IN_CI: 1 |
| IS_GHA: 1 |
| # This is used for the phase of adding wheel tests only, will be removed once completed |
| IN_WHEEL_TEST: 1 |
| # Used for custom_opertor, jit_hooks, custom_backend, see .jenkins/pytorch/build.sh |
| CUSTOM_TEST_ARTIFACT_BUILD_DIR: build/custom_test_artifacts |
| ALPINE_IMAGE: "308535385114.dkr.ecr.us-east-1.amazonaws.com/tool/alpine" |
| PR_LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }} |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| AWS_DEFAULT_REGION: us-east-1 |
| CIRCLE_PR_NUMBER: ${{ github.event.pull_request.number }} |
| CIRCLE_SHA1: ${{ github.event.pull_request.head.sha || github.sha }} |
| concurrency: |
| group: linux-xenial-py3.6-gcc7-bazel-test-${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }} |
| cancel-in-progress: true |
| |
| jobs: |
| |
| ciflow_should_run: |
| runs-on: ubuntu-18.04 |
| timeout-minutes: 240 |
| env: |
| IS_PROBOT_TRIGGER_EVENT: ${{ (github.event.action == 'unassigned') && (github.event.assigneed.login == 'pytorchbot') }} |
| LABEL_CONDITIONS: ${{ contains(github.event.pull_request.labels.*.name, 'ciflow/all') || contains(github.event.pull_request.labels.*.name, 'ciflow/bazel') || contains(github.event.pull_request.labels.*.name, 'ciflow/cpu') || contains(github.event.pull_request.labels.*.name, 'ciflow/default') || contains(github.event.pull_request.labels.*.name, 'ciflow/linux') }} |
| LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }} |
| if: ${{ (github.repository == 'pytorch/pytorch') && ( |
| (github.event_name == 'push') || |
| (github.event_name == 'schedule') || |
| (contains(github.event.pull_request.labels.*.name, 'ciflow/all') || contains(github.event.pull_request.labels.*.name, 'ciflow/bazel') || contains(github.event.pull_request.labels.*.name, 'ciflow/cpu') || contains(github.event.pull_request.labels.*.name, 'ciflow/default') || contains(github.event.pull_request.labels.*.name, 'ciflow/linux')) || |
| ((github.event_name == 'pull_request' && github.event.action != 'unassigned') && !contains(join(github.event.pull_request.labels.*.name), 'ciflow/'))) |
| }} |
| steps: |
| - name: noop |
| run: echo running ciflow_should_run |
| - name: print labels |
| run: echo "${LABELS}" |
| |
| # building and testing in a single job since bazel runs only small subset of tests |
| build-and-test: |
| runs-on: linux.2xlarge |
| needs: [ciflow_should_run] |
| env: |
| JOB_BASE_NAME: linux-xenial-py3.6-gcc7-bazel-test-build-and-test |
| NUM_TEST_SHARDS: 1 |
| steps: |
| - name: Display EC2 information |
| shell: bash |
| run: | |
| set -euo pipefail |
| function get_ec2_metadata() { |
| # Pulled from instance metadata endpoint for EC2 |
| # see https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html |
| category=$1 |
| curl -fsSL "http://169.254.169.254/latest/meta-data/${category}" |
| } |
| echo "ami-id: $(get_ec2_metadata ami-id)" |
| echo "instance-id: $(get_ec2_metadata instance-id)" |
| echo "instance-type: $(get_ec2_metadata instance-type)" |
| - name: Log in to ECR |
| env: |
| AWS_RETRY_MODE: standard |
| AWS_MAX_ATTEMPTS: 5 |
| run: | |
| AWS_ACCOUNT_ID=$(aws sts get-caller-identity|grep Account|cut -f4 -d\") |
| aws ecr get-login-password --region "$AWS_DEFAULT_REGION" | docker login --username AWS \ |
| --password-stdin "$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com" |
| - name: Chown workspace |
| run: | |
| retry () { |
| "$@" || (sleep 1 && "$@") || (sleep 2 && "$@") |
| } |
| retry docker pull "${ALPINE_IMAGE}" |
| # Ensure the working directory gets chowned back to the current user |
| docker run --pull=never --rm -v "$(pwd)":/v -w /v "${ALPINE_IMAGE}" chown -R "$(id -u):$(id -g)" . |
| - name: Clean workspace |
| run: | |
| rm -rf "${GITHUB_WORKSPACE:?}/*" |
| rm -f ~/.ssh/authorized_keys |
| - name: "[FB EMPLOYEES] Enable SSH (Click me for login details)" |
| uses: seemethere/add-github-ssh-key@v1 |
| with: |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
| - name: Preserve github env variables for use in docker |
| run: | |
| env | grep '^GITHUB' > "/tmp/github_env_${GITHUB_RUN_ID}" |
| - name: Checkout PyTorch |
| uses: zhouzhuojie/checkout@05b13c9a0d21f08f6d5e64a1d5042246d13619d9 |
| with: |
| # deep clone, to allow use of git merge-base |
| fetch-depth: 0 |
| submodules: recursive |
| - name: Calculate docker image tag |
| id: calculate-tag |
| run: | |
| DOCKER_TAG=$(git rev-parse HEAD:.circleci/docker) |
| echo "DOCKER_TAG=${DOCKER_TAG}" >> "${GITHUB_ENV}" |
| echo "DOCKER_IMAGE=${DOCKER_IMAGE_BASE}:${DOCKER_TAG}" >> "${GITHUB_ENV}" |
| echo "::set-output name=docker_tag::${DOCKER_TAG}" |
| echo "::set-output name=docker_image::${DOCKER_IMAGE_BASE}:${DOCKER_TAG}" |
| - name: Check if image should be built |
| id: check |
| env: |
| BASE_REVISION: ${{ github.event.pull_request.base.sha || github.sha }} |
| run: | |
| set -x |
| # Check if image already exists, if it does then skip building it |
| if docker manifest inspect "${DOCKER_IMAGE_BASE}:${DOCKER_TAG}"; then |
| exit 0 |
| fi |
| if [[ "$BASE_REVISION" = "$(git rev-parse HEAD)" ]]; then |
| # if we're on the base branch then use the parent commit |
| MERGE_BASE=$(git rev-parse HEAD~) |
| else |
| # otherwise we're on a PR, so use the most recent base commit |
| MERGE_BASE=$(git merge-base HEAD "$BASE_REVISION") |
| fi |
| # Covers the case where a previous tag doesn't exist for the tree |
| # this is only really applicable on trees that don't have `.circleci/docker` at its merge base, i.e. nightly |
| if ! git rev-parse "$MERGE_BASE:.circleci/docker"; then |
| echo "Directory '.circleci/docker' not found in commit $MERGE_BASE, you should probably rebase onto a more recent commit" |
| exit 1 |
| fi |
| PREVIOUS_DOCKER_TAG=$(git rev-parse "$MERGE_BASE:.circleci/docker") |
| # If no image exists but the hash is the same as the previous hash then we should error out here |
| if [[ "${PREVIOUS_DOCKER_TAG}" = "${DOCKER_TAG}" ]]; then |
| echo "ERROR: Something has gone wrong and the previous image isn't available for the merge-base of your branch" |
| echo " contact the PyTorch team to restore the original images" |
| exit 1 |
| fi |
| echo ::set-output name=rebuild::yes |
| - name: Build and push docker image |
| if: ${{ steps.check.outputs.rebuild }} |
| env: |
| DOCKER_SKIP_S3_UPLOAD: 1 |
| working-directory: .circleci/docker |
| run: | |
| export IMAGE_NAME=${DOCKER_IMAGE_BASE#308535385114.dkr.ecr.us-east-1.amazonaws.com/pytorch/} |
| ./build_docker.sh |
| - name: Pull Docker image |
| run: | |
| retry () { |
| "$@" || (sleep 1 && "$@") || (sleep 2 && "$@") |
| } |
| retry docker pull "${DOCKER_IMAGE}" |
| - name: Determine shm-size |
| run: | |
| shm_size="1g" |
| case "${BUILD_ENVIRONMENT}" in |
| *cuda*) |
| shm_size="2g" |
| ;; |
| *rocm*) |
| shm_size="8g" |
| ;; |
| esac |
| echo "SHM_SIZE=${shm_size}" >> "${GITHUB_ENV}" |
| - name: Output disk space left |
| run: | |
| sudo df -H |
| - name: Preserve github env variables for use in docker |
| run: | |
| env | grep '^GITHUB' > "/tmp/github_env_${GITHUB_RUN_ID}" |
| - name: Build |
| run: | |
| # detached container should get cleaned up by teardown_ec2_linux |
| container_name=$(docker run \ |
| -e BUILD_ENVIRONMENT \ |
| -e JOB_BASE_NAME \ |
| -e MAX_JOBS="$(nproc --ignore=2)" \ |
| -e SCCACHE_BUCKET \ |
| -e CUSTOM_TEST_ARTIFACT_BUILD_DIR \ |
| -e PR_LABELS \ |
| -e SKIP_SCCACHE_INITIALIZATION=1 \ |
| -e TORCH_CUDA_ARCH_LIST \ |
| -e http_proxy="http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128" -e https_proxy="http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128" -e no_proxy="localhost,127.0.0.1,github.com,amazonaws.com,s3.amazonaws.com,169.254.169.254,169.254.170.2,/var/run/docker.sock" \ |
| --env-file="/tmp/github_env_${GITHUB_RUN_ID}" \ |
| --security-opt seccomp=unconfined \ |
| --cap-add=SYS_PTRACE \ |
| --tty \ |
| --detach \ |
| --user jenkins \ |
| -v "${GITHUB_WORKSPACE}:/var/lib/jenkins/workspace" \ |
| -w /var/lib/jenkins/workspace \ |
| "${DOCKER_IMAGE}" |
| ) |
| docker exec -t "${container_name}" sh -c 'sudo chown -R jenkins . && sudo chown -R jenkins /dev && .jenkins/pytorch/build.sh' |
| - name: Parse ref |
| id: parse-ref |
| run: .github/scripts/parse_ref.py |
| - name: Display and upload binary build size statistics (Click Me) |
| # temporary hack: set CIRCLE_* vars, until we update |
| # tools/stats/print_test_stats.py to natively support GitHub Actions |
| env: |
| AWS_DEFAULT_REGION: us-east-1 |
| SCRIBE_GRAPHQL_ACCESS_TOKEN: ${{ secrets.SCRIBE_GRAPHQL_ACCESS_TOKEN }} |
| CIRCLE_BRANCH: ${{ steps.parse-ref.outputs.branch }} |
| CIRCLE_PR_NUMBER: ${{ github.event.pull_request.number }} |
| CIRCLE_SHA1: ${{ github.event.pull_request.head.sha || github.sha }} |
| CIRCLE_TAG: ${{ steps.parse-ref.outputs.tag }} |
| CIRCLE_WORKFLOW_ID: '${{ github.run_id }}_${{ github.run_number }}' |
| run: | |
| COMMIT_TIME=$(git log --max-count=1 --format=%ct || echo 0) |
| export COMMIT_TIME |
| pip3 install requests==2.26 boto3==1.16.34 |
| python3 -m tools.stats.upload_binary_size_to_scuba || exit 0 |
| - name: Test |
| # Time out the test phase after 3.5 hours |
| timeout-minutes: 210 |
| run: | |
| # detached container should get cleaned up by teardown_ec2_linux |
| export SHARD_NUMBER=0 |
| # TODO: Stop building test binaries as part of the build phase |
| # Make sure we copy test results from bazel-testlogs symlink to |
| # a regular directory ./test/test-reports |
| container_name=$(docker run \ |
| -e BUILD_ENVIRONMENT \ |
| -e CUSTOM_TEST_ARTIFACT_BUILD_DIR \ |
| -e GITHUB_ACTIONS \ |
| -e IN_CI \ |
| -e SHARD_NUMBER \ |
| -e NUM_TEST_SHARDS \ |
| -e JOB_BASE_NAME \ |
| -e MAX_JOBS="$(nproc --ignore=2)" \ |
| -e SCCACHE_BUCKET \ |
| -e PR_LABELS \ |
| -e http_proxy="http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128" -e https_proxy="http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128" -e no_proxy="localhost,127.0.0.1,github.com,amazonaws.com,s3.amazonaws.com,169.254.169.254,169.254.170.2,/var/run/docker.sock" \ |
| --env-file="/tmp/github_env_${GITHUB_RUN_ID}" \ |
| --security-opt seccomp=unconfined \ |
| --cap-add=SYS_PTRACE \ |
| --shm-size="${SHM_SIZE}" \ |
| --tty \ |
| --detach \ |
| --user jenkins \ |
| -v "${GITHUB_WORKSPACE}:/var/lib/jenkins/workspace" \ |
| -w /var/lib/jenkins/workspace \ |
| "${DOCKER_IMAGE}" |
| ) |
| docker exec -t "${container_name}" sh -c 'sudo chown -R jenkins . && sudo chown -R jenkins /dev && .jenkins/pytorch/test.sh && cp -Lr ./bazel-testlogs ./test/test-reports' |
| - name: Chown workspace |
| if: always() |
| run: | |
| # Ensure the working directory gets chowned back to the current user |
| docker run --rm -v "$(pwd)":/v -w /v "${ALPINE_IMAGE}" chown -R "$(id -u):$(id -g)" . |
| - name: Zip test reports for upload |
| if: always() |
| env: |
| FILE_SUFFIX: 'bazel-${{ github.job }}' |
| run: | |
| # Remove any previous test reports if they exist |
| rm -f test-reports-*.zip |
| zip -r "test-reports-${FILE_SUFFIX}.zip" test -i '*.xml' |
| - uses: seemethere/upload-artifact-s3@v3 |
| name: Store Test Reports on S3 |
| if: always() |
| with: |
| retention-days: 14 |
| if-no-files-found: error |
| path: |
| test-reports-*.zip |
| - name: Display and upload test statistics (Click Me) |
| if: always() |
| # temporary hack: set CIRCLE_* vars, until we update |
| # tools/stats/print_test_stats.py to natively support GitHub Actions |
| env: |
| AWS_DEFAULT_REGION: us-east-1 |
| CIRCLE_BRANCH: ${{ steps.parse-ref.outputs.branch }} |
| JOB_BASE_NAME: linux-xenial-py3.6-gcc7-bazel-test-test |
| CIRCLE_PR_NUMBER: ${{ github.event.pull_request.number }} |
| CIRCLE_SHA1: ${{ github.event.pull_request.head.sha || github.sha }} |
| CIRCLE_TAG: ${{ steps.parse-ref.outputs.tag }} |
| CIRCLE_WORKFLOW_ID: '${{ github.run_id }}_${{ github.run_number }}' |
| shell: bash |
| run: | |
| python3 -m pip install -r requirements.txt |
| python3 -m pip install boto3==1.16.34 |
| python3 -m tools.stats.print_test_stats --upload-to-s3 --compare-with-s3 test |
| - name: Hold runner for 2 hours or until ssh sessions have drained |
| # Always hold for active ssh sessions |
| if: always() |
| run: .github/scripts/wait_for_ssh_to_drain.sh |
| - name: Chown workspace |
| if: always() |
| run: | |
| # Ensure the working directory gets chowned back to the current user |
| docker run --rm -v "$(pwd)":/v -w /v "${ALPINE_IMAGE}" chown -R "$(id -u):$(id -g)" . |
| - name: Kill containers, clean up images |
| if: always() |
| run: | |
| # ignore expansion of "docker ps -q" since it could be empty |
| # shellcheck disable=SC2046 |
| docker stop $(docker ps -q) || true |
| # Prune all of the docker images |
| docker system prune -af |