# Most of this is inspired by the mypy primer # See: https://github.com/hauntsaninja/mypy_primer # This is the primer job that runs on every PR name: Primer / Run on: pull_request: paths: - "pylint/**" - "tests/primer/**" - "requirements*" - ".github/workflows/**" # We ignore these specific files because they need to be changed # on 'main' and will always fail the PR run. - "!.github/workflows/primer_run_main.yaml" - "!.github/workflows/primer_comment.yaml" - "!tests/primer/packages_to_prime.json" branches: - main concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true env: # This needs to be the SAME as in the Main and comment job CACHE_VERSION: 3 KEY_PREFIX: venv-primer permissions: contents: read jobs: run-primer: name: Run / ${{ matrix.python-version }} runs-on: ubuntu-latest timeout-minutes: 120 strategy: matrix: python-version: ["3.7", "3.11"] steps: - name: Check out code from GitHub uses: actions/checkout@v3.5.2 with: fetch-depth: 0 - name: Set up Python ${{ matrix.python-version }} id: python uses: actions/setup-python@v4.5.0 with: python-version: ${{ matrix.python-version }} check-latest: true # Restore cached Python environment - name: Restore Python virtual environment id: cache-venv uses: actions/cache@v3.3.1 with: path: venv key: ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{ env.KEY_PREFIX }}-${{ env.CACHE_VERSION }}-${{ hashFiles('pyproject.toml', 'requirements_test.txt', 'requirements_test_min.txt', 'requirements_test_pre_commit.txt') }} # Create environment must match step in 'Primer / Main' - name: Create Python virtual environment if: steps.cache-venv.outputs.cache-hit != 'true' run: | python -m venv venv . venv/bin/activate python -m pip install -U pip setuptools wheel pip install -U -r requirements_test.txt # Cache primer packages - name: Download last 'main' run info id: download-main-run uses: actions/github-script@v6.4.1 with: script: | // Download 'main' pylint output const fs = require('fs'); const runs = await github.rest.actions.listWorkflowRuns({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: ".github/workflows/primer_run_main.yaml", status: "success" }); const lastRunMain = runs.data.workflow_runs.reduce(function(prev, current) { return (prev.run_number > current.run_number) ? prev : current }) console.log("Last run on main:") console.log(lastRunMain.html_url) const artifacts_main = await github.rest.actions.listWorkflowRunArtifacts({ owner: context.repo.owner, repo: context.repo.repo, run_id: lastRunMain.id, }); // Get commitstring const [matchArtifactMain] = artifacts_main.data.artifacts.filter((artifact) => artifact.name == "primer_commitstring"); const downloadWorkflow = await github.rest.actions.downloadArtifact({ owner: context.repo.owner, repo: context.repo.repo, artifact_id: matchArtifactMain.id, archive_format: "zip", }); fs.writeFileSync("primer_commitstring.zip", Buffer.from(downloadWorkflow.data)); // Get output const [matchArtifactMainOutput] = artifacts_main.data.artifacts.filter((artifact) => artifact.name == "primer_output"); const downloadWorkflowTwo = await github.rest.actions.downloadArtifact({ owner: context.repo.owner, repo: context.repo.repo, artifact_id: matchArtifactMainOutput.id, archive_format: "zip", }); fs.writeFileSync("primer_output_main.zip", Buffer.from(downloadWorkflowTwo.data)); return lastRunMain.head_sha; - name: Copy and unzip the commit string run: | unzip primer_commitstring.zip cp commit_string_${{ matrix.python-version }}.txt tests/.pylint_primer_tests/commit_string_${{ matrix.python-version }}.txt - name: Unzip the output of 'main' run: unzip primer_output_main.zip - name: Get commit string id: commitstring run: | . venv/bin/activate output=$(python tests/primer/__main__.py prepare --read-commit-string) echo "commitstring=$output" >> $GITHUB_OUTPUT - name: Restore projects cache id: cache-projects uses: actions/cache@v3.3.1 with: path: tests/.pylint_primer_tests/ key: >- ${{ runner.os }}-${{ matrix.python-version }}-${{ steps.commitstring.outputs.commitstring }}-primer - name: Check cache run: | . venv/bin/activate python tests/primer/__main__.py prepare --check # Merge the 'main' commit of last successful run - name: Pull 'main' shell: bash run: | git config --global user.email "primer@example.com" git config --global user.name "Pylint Primer" git pull origin ${{ steps.download-main-run.outputs.result }} --no-edit --no-commit --no-rebase # Run primer - name: Run pylint primer run: | . venv/bin/activate pip install -e . python tests/primer/__main__.py run --type=pr 2>warnings.txt WARNINGS=$(head -c 65000 < warnings.txt) if [[ $WARNINGS ]] then echo "::warning ::$WARNINGS" fi - name: Upload output of PR uses: actions/upload-artifact@v3.1.2 with: name: primer_output_pr path: tests/.pylint_primer_tests/output_${{ steps.python.outputs.python-version }}_pr.txt - name: Upload output of 'main' uses: actions/upload-artifact@v3.1.2 with: name: primer_output_main path: output_${{ steps.python.outputs.python-version }}_main.txt # Save PR number so we know which PR to comment on - name: Save PR number run: | echo ${{ github.event.pull_request.number }} | tee pr_number.txt - name: Upload PR number uses: actions/upload-artifact@v3.1.2 with: name: pr_number path: pr_number.txt