name: Pull Request on: push: branches: - main - temp pull_request: branches: - main check_run: types: [rerequested, requested_action] env: PYTHON_VERSION: 3.8 MOCHA_REPORTER_JUNIT: true # Use the mocha-multi-reporters and send output to both console (spec) and JUnit (mocha-junit-reporter). Also enables a reporter which exits the process running the tests if it haven't already. CACHE_NPM_DEPS: cache-npm CACHE_OUT_DIRECTORY: cache-out-directory CACHE_PIP_DEPS: cache-pip # Key for the cache created at the end of the the 'Cache ./pythonFiles/lib/python' step. CACHE_PYTHONFILES: cache-pvsc-pythonFiles ARTIFACT_NAME_VSIX: ms-ai-tools-jupyter-insiders-vsix VSIX_NAME: ms-ai-tools-jupyter-insiders.vsix COVERAGE_REPORTS: tests-coverage-reports VSC_PYTHON_FORCE_LOGGING: true # Enable this to turn on console output for the logger TEST_RESULTS_DIRECTORY: . jobs: build-vsix: name: Build VSIX runs-on: ubuntu-latest # if: github.repository == 'microsoft/vscode-jupyter' steps: - name: Checkout uses: actions/checkout@v2 - name: Use Python ${{env.PYTHON_VERSION}} uses: actions/setup-python@v2 with: python-version: ${{env.PYTHON_VERSION}} - name: Upgrade pip run: python -m pip install -U pip - name: Install Dependencies uses: ./.github/actions/install-dependencies id: install-dependencies with: install_python_dependencies: true install_npm_dependencies: true - name: Build VSIX uses: ./.github/actions/build-vsix id: build-vsix - name: Rename VSIX if: steps.build-vsix.outputs.path != env.VSIX_NAME run: mv ${{ steps.build-vsix.outputs.path }} ${{ env.VSIX_NAME }} - uses: actions/upload-artifact@v2 with: name: ${{env.ARTIFACT_NAME_VSIX}} path: ${{env.VSIX_NAME}} lint: name: Lint runs-on: ubuntu-latest if: github.repository == 'microsoft/vscode-jupyter' steps: - name: Checkout uses: actions/checkout@v2 - name: Cache pip files uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{runner.os}}-${{env.CACHE_PIP_DEPS}}-${{env.PYTHON_VERSION}} - name: Cache npm files uses: actions/cache@v2 with: path: ~/.npm key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - name: Install dependencies (npm ci) run: npm ci --prefer-offline - name: Run linting on TypeScript code run: npx tslint --project tsconfig.json - name: Run prettier on TypeScript code run: npx prettier 'src/**/*.ts*' --check - name: Run prettier on JavaScript code run: npx prettier 'build/**/*.js' --check - name: Use Python ${{env.PYTHON_VERSION}} uses: actions/setup-python@v2 with: python-version: ${{env.PYTHON_VERSION}} - name: Run Black on Python code run: | python -m pip install -U black python -m black . --check working-directory: pythonFiles - name: Run gulp prePublishNonBundle run: npx gulp prePublishNonBundle - name: Cache the out/ directory uses: actions/cache@v2 with: path: ./out key: ${{runner.os}}-${{env.CACHE_OUT_DIRECTORY}}-${{hashFiles('src/**')}} - name: Check dependencies run: npm run checkDependencies ### Non-smoke tests ts_tests: name: Type Script Tests # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. runs-on: ${{ matrix.os }} # if: github.repository == 'microsoft/vscode-jupyter' strategy: fail-fast: false matrix: # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. os: [ubuntu-latest, windows-latest, macos-latest] test-suite: [ts-unit] env: NODE_VERSION: 12.15.0 steps: - name: Checkout uses: actions/checkout@v2 - name: Use Python ${{env.PYTHON_VERSION}} uses: actions/setup-python@v2 with: python-version: ${{env.PYTHON_VERSION}} - name: Upgrade pip run: python -m pip install -U pip - name: Install Dependencies uses: ./.github/actions/install-dependencies id: install-dependencies with: install_python_dependencies: true install_npm_dependencies: true - name: Cache npm files uses: actions/cache@v2 with: path: ~/.npm key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - name: Cache compiled TS files # Use an id for this step so that its cache-hit output can be accessed and checked in the next step. id: out-cache uses: actions/cache@v2 with: path: ./out key: ${{runner.os}}-${{env.CACHE_OUT_DIRECTORY}}-${{hashFiles('src/**')}} - name: Install dependencies (npm ci) run: npm ci - name: Compile if not cached run: npx gulp prePublishNonBundle if: steps.out-cache.outputs.cache-hit == false - name: Use Node ${{env.NODE_VERSION}} uses: actions/setup-node@v2.1.1 with: node-version: ${{env.NODE_VERSION}} # Run TypeScript unit tests only for Python 3.X. - name: Run TypeScript unit tests run: npm run test:unittests:cover ### Non-smoke tests tests: name: Tests (with Python) # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. runs-on: ${{ matrix.os }} if: github.repository == 'microsoft/vscode-jupyter' strategy: fail-fast: false matrix: # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. os: [ubuntu-latest] # Run the tests on the oldest and most recent versions of Python. python: [3.8] # test-suite: [python-unit, single-workspace, functional] test-suite: [functional] env: # Something in Node 12.16.0 breaks the TS debug adapter, and ubuntu-latest bundles Node 12.16.1. # We can remove this when we switch over to the python-based DA in https://github.com/microsoft/vscode-jupyter/issues/7136. # See https://github.com/microsoft/ptvsd/issues/2068 # At this point pinning is only needed for consistency. We no longer have TS debug adapter. NODE_VERSION: 12.15.0 steps: - name: Checkout uses: actions/checkout@v2 - name: Cache pip files uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{runner.os}}-${{env.CACHE_PIP_DEPS}}-${{env.PYTHON_VERSION}} - name: Cache npm files uses: actions/cache@v2 with: path: ~/.npm key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} - name: Cache compiled TS files # Use an id for this step so that its cache-hit output can be accessed and checked in the next step. id: out-cache uses: actions/cache@v2 with: path: ./out key: ${{runner.os}}-${{env.CACHE_OUT_DIRECTORY}}-${{hashFiles('src/**')}} - name: Install dependencies (npm ci) run: npm ci - name: Compile if not cached run: npx gulp prePublishNonBundle if: steps.out-cache.outputs.cache-hit == false - name: Use Python ${{matrix.python}} uses: actions/setup-python@v2 with: python-version: ${{matrix.python}} - name: Use Node ${{env.NODE_VERSION}} uses: actions/setup-node@v2.1.1 with: node-version: ${{env.NODE_VERSION}} # - name: pip install ipython requirements # run: | # python -m pip install numpy # if: matrix.test-suite == 'python-unit' - name: Install functional test requirements run: | python -m pip install numpy python -m pip install --upgrade -r ./build/functional-test-requirements.txt if: matrix.test-suite == 'functional' - name: Set CI_PYTHON_PATH and CI_DISABLE_AUTO_SELECTION run: | echo "::set-env name=CI_PYTHON_PATH::python" echo "::set-env name=CI_DISABLE_AUTO_SELECTION::1" shell: bash if: matrix.test-suite != 'ts-unit' # # Upload unit test coverage reports for later use in the "reports" job. # - name: Upload unit test coverage reports # uses: actions/upload-artifact@v1 # with: # name: ${{runner.os}}-${{env.COVERAGE_REPORTS}} # path: .nyc_output # if: matrix.test-suite == 'ts-unit' && startsWith(matrix.python, 3.) # # Run the Python and IPython tests in our codebase. # - name: Run Python and IPython unit tests # run: | # python pythonFiles/tests/run_all.py # python -m IPython pythonFiles/tests/run_all.py # if: matrix.test-suite == 'python-unit' # - name: Run single-workspace tests # env: # CI_PYTHON_VERSION: ${{matrix.python}} # uses: GabrielBB/xvfb-action@v1.4 # with: # run: npm run testSingleWorkspace # if: matrix.test-suite == 'single-workspace' - name: Run functional tests run: npm run test:functional if: matrix.test-suite == 'functional' # smoke-tests: # name: Smoke tests # # The value of runs-on is the OS of the current job (specified in the strategy matrix below) instead of being hardcoded. # runs-on: ${{ matrix.os }} # if: github.repository == 'microsoft/vscode-jupyter' # needs: [build-vsix] # strategy: # fail-fast: false # matrix: # # We're not running CI on macOS for now because it's one less matrix entry to lower the number of runners used, # # macOS runners are expensive, and we assume that Ubuntu is enough to cover the UNIX case. # os: [ubuntu-latest, windows-latest] # python: [3.8] # steps: # # Need the source to have the tests available. # - name: Checkout # uses: actions/checkout@v2 # - name: Cache pip files # uses: actions/cache@v2 # with: # path: ~/.cache/pip # key: ${{runner.os}}-${{env.CACHE_PIP_DEPS}}-${{env.PYTHON_VERSION}} # - name: Cache npm files # uses: actions/cache@v2 # with: # path: ~/.npm # key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} # - name: Use Python ${{matrix.python}} # uses: actions/setup-python@v2 # with: # python-version: ${{matrix.python}} # - name: Install dependencies (npm ci) # run: npm ci --prefer-offline # - name: pip install ipython requirements # run: | # python -m pip install numpy # python -m pip install --upgrade -r ./build/ipython-test-requirements.txt # - name: pip install jupyter # run: | # python -m pip install --upgrade jupyter # # Save time by reusing bits from the VSIX. # - name: Download VSIX # uses: actions/download-artifact@v2 # with: # name: ${{env.ARTIFACT_NAME_VSIX}} # # Compile the test files. # - name: Prepare for smoke tests # run: npx tsc -p ./ # shell: bash # - name: Set CI_PYTHON_PATH and CI_DISABLE_AUTO_SELECTION # run: | # echo "::set-env name=CI_PYTHON_PATH::python" # echo "::set-env name=CI_DISABLE_AUTO_SELECTION::1" # shell: bash # - name: Run smoke tests # env: # DISPLAY: 10 # uses: GabrielBB/xvfb-action@v1.4 # with: # run: node --no-force-async-hooks-checks ./out/test/smokeTest.js # coverage: # name: Coverage reports upload # runs-on: ubuntu-latest # if: github.repository == 'microsoft/vscode-jupyter' # needs: [tests, smoke-tests] # steps: # - name: Checkout # uses: actions/checkout@v2 # - name: Cache npm files # uses: actions/cache@v2 # with: # path: ~/.npm # key: ${{runner.os}}-${{env.CACHE_NPM_DEPS}}-${{hashFiles('package-lock.json')}} # - name: Install dependencies (npm ci) # run: npm ci --prefer-offline # # It isn't possible to specify a regex for artifact names, so we have to download each artifact manually. # # The name pattern is ${{runner.os}}-${{env.COVERAGE_REPORTS}}, and possible values for runner.os are `Linux`, `Windows`, or `macOS`. # # See https://help.github.com/en/actions/reference/contexts-and-expression-syntax-for-github-actions#runner-context # - name: Download Ubuntu test coverage artifacts # uses: actions/download-artifact@v1 # with: # name: Linux-${{env.COVERAGE_REPORTS}} # - name: Extract Ubuntu coverage artifacts to ./nyc_output # run: | # mkdir .nyc_output # mv Linux-${{env.COVERAGE_REPORTS}}/* .nyc_output # rm -r Linux-${{env.COVERAGE_REPORTS}} # - name: Generate coverage reports # run: npm run test:cover:report # continue-on-error: true # - name: Upload coverage to codecov # uses: codecov/codecov-action@v1 # with: # token: ${{ secrets.CODECOV_TOKEN }} # file: ./coverage/cobertura-coverage.xml # upload: # name: Upload VSIX to Azure Blob Storage # runs-on: ubuntu-latest # if: github.repository == 'microsoft/vscode-jupyter' # needs: [tests, smoke-tests, build-vsix] # env: # BLOB_CONTAINER_NAME: extension-builds # BLOB_NAME: ms-ai-tools-jupyter-gha-insiders.vsix # So named to avoid clobbering Azure Pipelines upload. # steps: # - name: Download VSIX # uses: actions/download-artifact@v2 # with: # name: ${{ env.ARTIFACT_NAME_VSIX }} # - name: Azure Login # uses: azure/login@v1 # with: # creds: ${{ secrets.AZURE_CREDENTIALS }} # - name: Upload to Blob Storage # run: az storage blob upload --file ${{ env.VSIX_NAME }} --account-name pvsc --container-name ${{ env.BLOB_CONTAINER_NAME }} --name ${{ env.BLOB_NAME }} --auth-mode login # - name: Get URL to uploaded VSIX # run: az storage blob url --account-name pvsc --container-name ${{ env.BLOB_CONTAINER_NAME }} --name ${{ env.BLOB_NAME }} --auth-mode login