--- name: CI on: push: branches: [master] pull_request: # If another push to the same PR or branch happens while this workflow is still running, # cancel the earlier run in favor of the next run. # # There's no point in testing an outdated version of the code. GitHub only allows # a limited number of job runners to be active at the same time, so it's better to cancel # pointless jobs early so that more useful jobs can run sooner. concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: POETRY_VERSION: "1.7.1" jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.10' - id: files uses: Ana06/get-changed-files@v2.2.0 - id: set-matrix run: | python .github/scripts/check_diff.py ${{ steps.files.outputs.all }} >> $GITHUB_OUTPUT outputs: dirs-to-lint: ${{ steps.set-matrix.outputs.dirs-to-lint }} dirs-to-test: ${{ steps.set-matrix.outputs.dirs-to-test }} dirs-to-extended-test: ${{ steps.set-matrix.outputs.dirs-to-extended-test }} lint: name: cd ${{ matrix.working-directory }} needs: [ build ] if: ${{ needs.build.outputs.dirs-to-lint != '[]' }} strategy: matrix: working-directory: ${{ fromJson(needs.build.outputs.dirs-to-lint) }} uses: ./.github/workflows/_lint.yml with: working-directory: ${{ matrix.working-directory }} secrets: inherit test: name: cd ${{ matrix.working-directory }} needs: [ build ] if: ${{ needs.build.outputs.dirs-to-test != '[]' }} strategy: matrix: working-directory: ${{ fromJson(needs.build.outputs.dirs-to-test) }} uses: ./.github/workflows/_test.yml with: working-directory: ${{ matrix.working-directory }} secrets: inherit test_doc_imports: needs: [ build ] if: ${{ needs.build.outputs.dirs-to-test != '[]' }} uses: ./.github/workflows/_test_doc_imports.yml secrets: inherit compile-integration-tests: name: cd ${{ matrix.working-directory }} needs: [ build ] if: ${{ needs.build.outputs.dirs-to-test != '[]' }} strategy: matrix: working-directory: ${{ fromJson(needs.build.outputs.dirs-to-test) }} uses: ./.github/workflows/_compile_integration_test.yml with: working-directory: ${{ matrix.working-directory }} secrets: inherit dependencies: name: cd ${{ matrix.working-directory }} needs: [ build ] if: ${{ needs.build.outputs.dirs-to-test != '[]' }} strategy: matrix: working-directory: ${{ fromJson(needs.build.outputs.dirs-to-test) }} uses: ./.github/workflows/_dependencies.yml with: working-directory: ${{ matrix.working-directory }} secrets: inherit extended-tests: name: "cd ${{ matrix.working-directory }} / make extended_tests #${{ matrix.python-version }}" needs: [ build ] if: ${{ needs.build.outputs.dirs-to-extended-test != '[]' }} strategy: matrix: # note different variable for extended test dirs working-directory: ${{ fromJson(needs.build.outputs.dirs-to-extended-test) }} python-version: - "3.8" - "3.9" - "3.10" - "3.11" runs-on: ubuntu-latest defaults: run: working-directory: ${{ matrix.working-directory }} steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} + Poetry ${{ env.POETRY_VERSION }} uses: "./.github/actions/poetry_setup" with: python-version: ${{ matrix.python-version }} poetry-version: ${{ env.POETRY_VERSION }} working-directory: ${{ matrix.working-directory }} cache-key: extended - name: Install dependencies shell: bash run: | echo "Running extended tests, installing dependencies with poetry..." poetry install -E extended_testing --with test - name: Run extended tests run: make extended_tests - name: Ensure the tests did not create any additional files shell: bash run: | set -eu STATUS="$(git status)" echo "$STATUS" # grep will exit non-zero if the target message isn't found, # and `set -e` above will cause the step to fail. echo "$STATUS" | grep 'nothing to commit, working tree clean' ci_success: name: "CI Success" needs: [build, lint, test, compile-integration-tests, dependencies, extended-tests] if: | always() runs-on: ubuntu-latest env: JOBS_JSON: ${{ toJSON(needs) }} RESULTS_JSON: ${{ toJSON(needs.*.result) }} EXIT_CODE: ${{!contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') && '0' || '1'}} steps: - name: "CI Success" run: | echo $JOBS_JSON echo $RESULTS_JSON echo "Exiting with $EXIT_CODE" exit $EXIT_CODE