# @generated DO NOT EDIT MANUALLY
# Template is at:    .github/templates/windows_ci_workflow.yml.j2
# Generation script: .github/scripts/generate_ci_workflows.py
name: periodic-win-vs2019-cuda11.5-py3

on:
  push:
    tags:
      - 'ciflow/all/*'
      - 'ciflow/cuda/*'
      - 'ciflow/scheduled/*'
      - 'ciflow/win/*'
  schedule:
    - cron: 45 4,10,16,22 * * *
  workflow_dispatch:

env:
  BUILD_ENVIRONMENT: periodic-win-vs2019-cuda11.5-py3
  BUILD_WHEEL: 1
  MAX_JOBS: 8
  CUDA_VERSION: "11.5"
  IN_CI: 1
  IS_GHA: 1
  INSTALL_WINDOWS_SDK: 1
  PYTHON_VERSION: "3.8"
  PYTORCH_RETRY_TEST_CASES: 1
  PR_LABELS: ${{ toJson(github.event.pull_request.labels.*.name) }}
  SCCACHE_BUCKET: "ossci-compiler-cache"
  VC_PRODUCT: "BuildTools"
  VC_VERSION: ""
  VS_VERSION: "16.8.6"
  VC_YEAR: "2019"
  ALPINE_IMAGE: "308535385114.dkr.ecr.us-east-1.amazonaws.com/tool/alpine"
  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
  AWS_DEFAULT_REGION: us-east-1
  PR_NUMBER: ${{ github.event.pull_request.number }}
  SHA1: ${{ github.event.pull_request.head.sha || github.sha }}
  TORCH_CUDA_ARCH_LIST: "7.0"
  USE_CUDA: 1

concurrency:
  group: periodic-win-vs2019-cuda11.5-py3-${{ github.event.pull_request.number || github.sha }}-${{ github.event_name == 'workflow_dispatch' }}
  cancel-in-progress: true

jobs:
  build:
    runs-on: "windows.4xlarge"
    timeout-minutes: 240
    env:
      JOB_BASE_NAME: periodic-win-vs2019-cuda11.5-py3-build
      http_proxy: "http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128"
      https_proxy: "http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128"
    steps:
      - name: print labels
        run: echo "${PR_LABELS}"
      - name: "[FB EMPLOYEES] Enable SSH (Click me for login details)"
        uses: seemethere/add-github-ssh-key@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Checkout PyTorch
        uses: zhouzhuojie/checkout@05b13c9a0d21f08f6d5e64a1d5042246d13619d9
        with:
          # deep clone, to allow use of git merge-base
          fetch-depth: 0
          submodules: recursive
      - name: Clean PyTorch checkout
        run: |
          # Remove any artifacts from the previous checkouts
          git clean -fxd
      - 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: Install Visual Studio 2019 toolchain
        shell: powershell
        run: |
          .\.circleci\scripts\vs_install.ps1
      - name: Install Cuda
        shell: bash
        run: |
          .circleci/scripts/windows_cuda_install.sh
      - name: Install Cudnn
        shell: bash
        run: |
          .circleci/scripts/windows_cudnn_install.sh
      - name: Parse ref
        id: parse-ref
        run: .github/scripts/parse_ref.py
      - name: Build
        shell: bash
        env:
          PYTORCH_FINAL_PACKAGE_DIR: /c/${{ github.run_id }}/build-results/
          BRANCH: ${{ steps.parse-ref.outputs.branch }}
        run: |
          .jenkins/pytorch/win-build.sh
      # Upload to github so that people can click and download artifacts
      - name: Upload artifacts to s3
        uses: seemethere/upload-artifact-s3@v3
        with:
          retention-days: 14
          if-no-files-found: error
          name: ${{ env.BUILD_ENVIRONMENT }}
          path: C:\${{ github.run_id }}\build-results
      - name: Wait until all sessions have drained
        shell: powershell
        if: always()
        timeout-minutes: 120
        run: |
          .github\scripts\wait_for_ssh_to_drain.ps1
      - name: Kill active ssh sessions if still around (Useful if workflow was cancelled)
        shell: powershell
        if: always()
        run: |
          .github\scripts\kill_active_ssh_sessions.ps1
      - name: Cleanup build-results and workspaces
        if: always()
        shell: bash
        env:
          PYTORCH_FINAL_PACKAGE_DIR: /c/${{ github.run_id }}/build-results/
        # Should remove the entirety of pytorch-${{ github.run_id }}
        run: |
          rm -rf "${PYTORCH_FINAL_PACKAGE_DIR}"
          rm -rf ./*

  generate-test-matrix:
    needs: build
    runs-on: ubuntu-18.04
    timeout-minutes: 240
    env:
      TEST_RUNNER_TYPE: windows.8xlarge.nvidia.gpu
      NUM_TEST_SHARDS: 2
      NUM_TEST_SHARDS_ON_PULL_REQUEST: 2
      PR_BODY: ${{ github.event.pull_request.body }}
      NOGPU_RUNNER_TYPE: windows.4xlarge
      ENABLE_FORCE_ON_CPU_TEST: 1
      RUN_SMOKE_TESTS_ONLY_ON_PR: False
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
      render-matrix: ${{ steps.set-matrix.outputs.render-matrix }}
      ignore-disabled-issues: ${{ steps.set-matrix.outputs.ignore-disabled-issues }}
    container:
      image: python:3.9
    steps:
      - name: Install dependencies
        run: pip install typing-extensions==3.10
      - name: Clone pytorch/pytorch
        uses: zhouzhuojie/checkout@05b13c9a0d21f08f6d5e64a1d5042246d13619d9
      - name: Generating test matrix
        id: set-matrix
        run: .github/scripts/generate_pytorch_test_matrix.py

  test:
    timeout-minutes: 240
    env:
      JOB_BASE_NAME: periodic-win-vs2019-cuda11.5-py3-test
      SHARD_NUMBER: ${{ matrix.shard }}
      NUM_TEST_SHARDS: ${{ matrix.num_shards }}
      TEST_CONFIG: ${{ matrix.config }}
      http_proxy: "http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128"
      https_proxy: "http://internal-tf-lb-20210727220640487900000002-835786077.us-east-1.elb.amazonaws.com:3128"
      PYTORCH_IGNORE_DISABLED_ISSUES: ${{ needs.generate-test-matrix.outputs.ignore-disabled-issues }}
    needs: [build, generate-test-matrix]
    strategy:
      matrix: ${{ fromJson(needs.generate-test-matrix.outputs.matrix) }}
      fail-fast: false
    runs-on: ${{ matrix.runner }}
    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: "[FB EMPLOYEES] Enable SSH (Click me for login details)"
        uses: seemethere/add-github-ssh-key@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Checkout PyTorch
        uses: zhouzhuojie/checkout@05b13c9a0d21f08f6d5e64a1d5042246d13619d9
        with:
          # deep clone, to allow use of git merge-base
          fetch-depth: 0
          submodules: recursive
      - name: Clean PyTorch checkout
        run: |
          # Remove any artifacts from the previous checkouts
          git clean -fxd
      - name: Install Visual Studio 2019 toolchain
        shell: powershell
        run: |
          .\.circleci\scripts\vs_install.ps1
      - name: Install Cuda
        if: ${{ matrix.config != 'force_on_cpu' }}
        shell: bash
        run: |
          .circleci/scripts/windows_cuda_install.sh
      - name: Install Cudnn
        if: ${{ matrix.config != 'force_on_cpu' }}
        shell: bash
        run: |
          .circleci/scripts/windows_cudnn_install.sh
      - uses: seemethere/download-artifact-s3@0504774707cbc8603d7dca922e8026eb8bf3b47b
        name: Download PyTorch Build Artifacts
        with:
          name: ${{ env.BUILD_ENVIRONMENT }}
          path: C:\${{ github.run_id }}\build-results
      - name: Check build-results folder
        shell: powershell
        run: |
          tree /F C:\$Env:GITHUB_RUN_ID\build-results
      # Needed for coverage in win-test.sh
      - uses: actions/setup-python@v2
        name: Setup Python3
        with:
          python-version: '3.x'
      - name: Test
        shell: bash
        env:
          PYTORCH_FINAL_PACKAGE_DIR: /c/${{ github.run_id }}/build-results/
        # Time out the test phase after 3.5 hours
        timeout-minutes: 210
        run: |
            .jenkins/pytorch/win-test.sh
      - name: Zip JSONs for upload
        if: always()
        env:
          FILE_SUFFIX: '${{ github.job }}-${{ matrix.config }}-${{ matrix.shard }}-${{ matrix.num_shards }}-${{ matrix.runner }}'
        shell: powershell
        run: |
          # -ir => recursive include all files in pattern
          7z a "test-jsons-$Env:FILE_SUFFIX.zip" -ir'!test\*.json'
      - uses: seemethere/upload-artifact-s3@v3
        name: Store Test Downloaded JSONs on S3
        if: always()
        with:
          retention-days: 14
          if-no-files-found: warn
          path:
            test-jsons-*.zip
      - name: Zip test reports for upload
        if: always()
        env:
          FILE_SUFFIX: '${{ github.job }}-${{ matrix.config }}-${{ matrix.shard }}-${{ matrix.num_shards }}-${{ matrix.runner }}'
        shell: powershell
        run: |
          # -ir => recursive include all files in pattern
          7z a "test-reports-$Env:FILE_SUFFIX.zip" -ir'!test\*.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: Install render_test_results dependencies
        if: always()
        shell: bash
        run: |
          python3 -m pip install junitparser==2.1.1 rich==10.9.0
      - name: "[[ Click me for rendered test results (useful for finding failing tests) ]]"
        if: always()
        shell: bash
        # Encoding is weird on windows, just try to default to utf-8 if possible
        env:
          PYTHONIOENCODING: "utf-8"
        run: |
          python3 tools/render_junit.py test/
      - name: Wait until all sessions have drained
        shell: powershell
        if: always()
        timeout-minutes: 120
        run: |
          .github\scripts\wait_for_ssh_to_drain.ps1
      - name: Kill active ssh sessions if still around (Useful if workflow was cancelled)
        shell: powershell
        if: always()
        run: |
          .github\scripts\kill_active_ssh_sessions.ps1
      - name: Parse ref
        id: parse-ref
        run: .github/scripts/parse_ref.py
      - 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
          BRANCH: ${{ steps.parse-ref.outputs.branch }}
          JOB_BASE_NAME: periodic-win-vs2019-cuda11.5-py3-test
          PR_NUMBER: ${{ github.event.pull_request.number }}
          SHA1: ${{ github.event.pull_request.head.sha || github.sha }}
          TAG: ${{ steps.parse-ref.outputs.tag }}
          WORKFLOW_ID: '${{ github.run_id }}'
        shell: bash
        run: |
          python3 -m pip install -r requirements.txt
          python3 -m pip install boto3==1.19.12
          python3 -m tools.stats.print_test_stats --upload-to-s3 --compare-with-s3 test
      - name: Cleanup workspace
        if: always()
        shell: bash
        # Should remove the entirety of pytorch-${{ github.run_id }}
        run: |
          rm -rf ./*
