diff --git a/.github/workflows/_check.yml b/.github/workflows/_check.yml deleted file mode 100644 index a6139c19..00000000 --- a/.github/workflows/_check.yml +++ /dev/null @@ -1,27 +0,0 @@ -on: - workflow_call: - outputs: - branch-pr: - description: The PR number if the branch is in one - value: ${{ jobs.pr.outputs.branch-pr }} - -jobs: - pr: - runs-on: "ubuntu-latest" - outputs: - branch-pr: ${{ steps.script.outputs.result }} - steps: - - uses: actions/github-script@v7 - id: script - if: github.event_name == 'push' - with: - script: | - const prs = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - head: context.repo.owner + ':${{ github.ref_name }}' - }) - if (prs.data.length) { - console.log(`::notice ::Skipping CI on branch push as it is already run in PR #${prs.data[0]["number"]}`) - return prs.data[0]["number"] - } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f198a244..463f2c79 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,22 +2,17 @@ name: CI on: push: + branches: + - main pull_request: jobs: - check: - uses: ./.github/workflows/_check.yml - lint: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_tox.yml with: tox: pre-commit test: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_test.yml with: python-version: dev @@ -26,8 +21,6 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} docs: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_docs.yml permissions: contents: write @@ -38,10 +31,3 @@ jobs: uses: ./.github/workflows/_example.yml secrets: EXAMPLE_DEPLOY_KEY: ${{ secrets.EXAMPLE_DEPLOY_KEY }} - - release: - if: github.ref_type == 'tag' - needs: docs - uses: ./.github/workflows/_release.yml - permissions: - contents: write diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..5d22260b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,31 @@ +name: CI + +on: + push: + tags: + - '*' + +jobs: + lint: + uses: ./.github/workflows/_tox.yml + with: + tox: pre-commit + + test: + uses: ./.github/workflows/_test.yml + with: + python-version: dev + runs-on: ubuntu-latest + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + docs: + uses: ./.github/workflows/_docs.yml + permissions: + contents: write + + release: + needs: docs + uses: ./.github/workflows/_release.yml + permissions: + contents: write diff --git a/docs/explanations/decisions/0021-ci-only-pr.md b/docs/explanations/decisions/0021-ci-only-pr.md new file mode 100644 index 00000000..f5d555be --- /dev/null +++ b/docs/explanations/decisions/0021-ci-only-pr.md @@ -0,0 +1,24 @@ +# 21. Run CI on pull requests and main branch only + +Date: 2025-05-06 + +## Status + +Accepted + +## Context + +CI has been being run on branches that do not have open pull requests, which has: added spurious jobs to the organisation's compute limit; made workflow definitions more complex; made the results page harder to parse; and allowed known working development branches to become stale or forgotten. + +Running CI only on branches that have open pull requests will: reduce compute jobs created for code that is known to not be working; simplify workflow definitions; simplify the CI results page; encourage early creation of pull requests, adding visibility to development. + +Draft pull requests will still have CI jobs run, ensuring that code quality is maintained while allowing reviewers to ignore changes that are not ready for human review. + +## Decision + +CI will only be run on all PRs when changes are made, and on the main branch when PRs are merged into it: not on branches that do not have open PRs. +Opening a draft PR will allow CI to be run, with the understanding that the PR may not be ready for review. + +## Consequences + +The `check` job will be removed and CI will run on all PRs and on the `main` branch. diff --git "a/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/_check.yml" "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/_check.yml" deleted file mode 120000 index 9c0f79a5..00000000 --- "a/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/_check.yml" +++ /dev/null @@ -1 +0,0 @@ -../../../.github/workflows/_check.yml \ No newline at end of file diff --git "a/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/_test_all.yml" "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/_test_all.yml" new file mode 100644 index 00000000..35e5d8c3 --- /dev/null +++ "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/_test_all.yml" @@ -0,0 +1,20 @@ +on: + workflow_call: + +jobs: + test: + strategy: + matrix: + runs-on: ["ubuntu-latest"] # can add windows-latest, macos-latest + python-version: ["3.10", "3.11", "3.12"] + include: + # Include one that runs in the dev environment + - runs-on: "ubuntu-latest" + python-version: "dev" + fail-fast: false + uses: ./.github/workflows/_test.yml + with: + runs-on: ${{ matrix.runs-on }} + python-version: ${{ matrix.python-version }} + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git "a/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/ci.yml.jinja" "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/ci.yml.jinja" index c6ed106f..153b8e60 100644 --- "a/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/ci.yml.jinja" +++ "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/ci.yml.jinja" @@ -2,66 +2,32 @@ name: CI on: push: + branches: + - main pull_request: jobs: - check: - uses: ./.github/workflows/_check.yml lint: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_tox.yml with: tox: pre-commit,type-checking -{% raw %} + test: - needs: check - if: needs.check.outputs.branch-pr == '' - strategy: - matrix: - runs-on: ["ubuntu-latest"] # can add windows-latest, macos-latest - python-version: ["3.10", "3.11", "3.12"] - include: - # Include one that runs in the dev environment - - runs-on: "ubuntu-latest" - python-version: "dev" - fail-fast: false - uses: ./.github/workflows/_test.yml - with: - runs-on: ${{ matrix.runs-on }} - python-version: ${{ matrix.python-version }} - secrets: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} -{% endraw %}{% if docker %} + uses: ./.github/workflows/_test_all.yml + +{% if docker %} + container: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_container.yml permissions: contents: read packages: write {% endif %}{% if sphinx %} + docs: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_docs.yml {% endif %} + dist: - needs: check - if: needs.check.outputs.branch-pr == '' uses: ./.github/workflows/_dist.yml - {% if pypi %} - pypi: - if: github.ref_type == 'tag' - needs: dist - uses: ./.github/workflows/_pypi.yml - permissions: - id-token: write - {% endif %} - release: - if: github.ref_type == 'tag' - needs: [dist{% if sphinx %}, docs{% endif %}] - uses: ./.github/workflows/_release.yml - permissions: - contents: write diff --git "a/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/release.yml.jinja" "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/release.yml.jinja" new file mode 100644 index 00000000..4a6ffc8f --- /dev/null +++ "b/template/{% if git_platform==\"github.com\" %}.github{% endif %}/workflows/release.yml.jinja" @@ -0,0 +1,49 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + +jobs: + + lint: + uses: ./.github/workflows/_tox.yml + with: + tox: pre-commit,type-checking + + test: + uses: ./.github/workflows/_test_all.yml + with: + tox: pre-commit,type-checking +{% if docker %} + + container: + uses: ./.github/workflows/_container.yml + permissions: + contents: read + packages: write +{% endif %}{% if sphinx %} + + docs: + uses: ./.github/workflows/_docs.yml +{% endif %} + + dist: + uses: ./.github/workflows/_dist.yml +{% if pypi %} + + pypi: + if: github.ref_type == 'tag' + needs: dist + uses: ./.github/workflows/_pypi.yml + permissions: + id-token: write +{% endif %} + + release: + needs: [dist{% if sphinx %}, docs{% endif %}] + uses: ./.github/workflows/_release.yml + permissions: + contents: write