diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 273936f..84fc5ae 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,4 +1,4 @@ -run-name: build ${{ github.event.inputs.repository }}:${{ github.event.inputs.reference }} +run-name: build ${{ inputs.repository }}:${{ inputs.reference }} on: workflow_dispatch: inputs: @@ -18,6 +18,32 @@ on: description: 'Publish to GitHub Pages' required: false default: false + python_version: + description: 'Python version used to generate docs' + required: false + default: '3' + workflow_call: + inputs: + reference: + description: 'Commit reference from CPython repository' + default: '3.14' + type: string + dist_version: + description: 'Dist version (compatible with patchlevel.py output)' + default: '3.14' + type: string + repository: + description: 'Repository to checkout' + default: 'python/cpython' + type: string + publish: + description: 'Publish to GitHub Pages' + default: 'false' + type: string + python_version: + description: 'Python version used to generate docs' + default: '3' + type: string permissions: contents: write jobs: @@ -26,11 +52,11 @@ jobs: steps: - uses: actions/setup-python@master with: - python-version: 3 + python-version: ${{ inputs.python_version }} - uses: actions/checkout@master with: - repository: ${{ github.event.inputs.repository }} - ref: ${{ github.event.inputs.reference }} + repository: ${{ inputs.repository }} + ref: ${{ inputs.reference }} - run: make venv working-directory: ./Doc - run: make dist-html @@ -38,25 +64,25 @@ jobs: - uses: actions/upload-artifact@master if: always() with: - name: docs-html.zip - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-html.zip + name: python-${{ inputs.dist_version }}-docs-html.zip + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-html.zip if-no-files-found: ignore - uses: actions/upload-artifact@master if: always() with: - name: docs-html.tar.bz2 - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-html.tar.bz2 + name: python-${{ inputs.dist_version }}-docs-html.tar.bz2 + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-html.tar.bz2 if-no-files-found: ignore build-text: runs-on: ubuntu-latest steps: - uses: actions/setup-python@master with: - python-version: 3 + python-version: ${{ inputs.python_version }} - uses: actions/checkout@master with: - repository: ${{ github.event.inputs.repository }} - ref: ${{ github.event.inputs.reference }} + repository: ${{ inputs.repository }} + ref: ${{ inputs.reference }} - run: make venv working-directory: ./Doc - run: make dist-text @@ -64,25 +90,25 @@ jobs: - uses: actions/upload-artifact@master if: always() with: - name: docs-text.zip - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-text.zip + name: python-${{ inputs.dist_version }}-docs-text.zip + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-text.zip if-no-files-found: ignore - uses: actions/upload-artifact@master if: always() with: - name: docs-text.tar.bz2 - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-text.tar.bz2 + name: python-${{ inputs.dist_version }}-docs-text.tar.bz2 + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-text.tar.bz2 if-no-files-found: ignore build-texinfo: runs-on: ubuntu-latest steps: - uses: actions/setup-python@master with: - python-version: 3 + python-version: ${{ inputs.python_version }} - uses: actions/checkout@master with: - repository: ${{ github.event.inputs.repository }} - ref: ${{ github.event.inputs.reference }} + repository: ${{ inputs.repository }} + ref: ${{ inputs.reference }} - run: make venv working-directory: ./Doc - run: sudo apt-get update && sudo apt-get install -y texinfo @@ -91,25 +117,25 @@ jobs: - uses: actions/upload-artifact@master if: always() with: - name: docs-texinfo.zip - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-texinfo.zip + name: python-${{ inputs.dist_version }}-docs-texinfo.zip + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-texinfo.zip if-no-files-found: ignore - uses: actions/upload-artifact@master if: always() with: - name: docs-texinfo.tar.bz2 - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-texinfo.tar.bz2 + name: python-${{ inputs.dist_version }}-docs-texinfo.tar.bz2 + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-texinfo.tar.bz2 if-no-files-found: ignore build-epub: runs-on: ubuntu-latest steps: - uses: actions/setup-python@master with: - python-version: 3 + python-version: ${{ inputs.python_version }} - uses: actions/checkout@master with: - repository: ${{ github.event.inputs.repository }} - ref: ${{ github.event.inputs.reference }} + repository: ${{ inputs.repository }} + ref: ${{ inputs.reference }} - run: make venv working-directory: ./Doc - run: make dist-epub @@ -117,19 +143,19 @@ jobs: - uses: actions/upload-artifact@master if: always() with: - name: docs.epub - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs.epub + name: python-${{ inputs.dist_version }}-docs.epub + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs.epub if-no-files-found: ignore build-pdf: runs-on: ubuntu-latest steps: - uses: actions/setup-python@master with: - python-version: 3 + python-version: ${{ inputs.python_version }} - uses: actions/checkout@master with: - repository: ${{ github.event.inputs.repository }} - ref: ${{ github.event.inputs.reference }} + repository: ${{ inputs.repository }} + ref: ${{ inputs.reference }} - run: make venv working-directory: ./Doc - run: sudo apt-get update && sudo apt-get install -y latexmk texlive-xetex fonts-freefont-otf xindy librsvg2-bin @@ -138,32 +164,37 @@ jobs: - uses: actions/upload-artifact@master if: always() with: - name: pdf-logs.zip + name: python-${{ inputs.dist_version }}-pdf-logs.zip path: | ./Doc/build/latex/*.log ./Doc/build/latex/*.tex - uses: actions/upload-artifact@master if: always() with: - name: docs-pdf-a4.zip - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-pdf-a4.zip + name: python-${{ inputs.dist_version }}-docs-pdf-a4.zip + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-pdf-a4.zip if-no-files-found: ignore - uses: actions/upload-artifact@master if: always() with: - name: docs-pdf-a4.tar.bz2 - path: ./Doc/dist/python-${{ github.event.inputs.dist_version }}-docs-pdf-a4.tar.bz2 + name: python-${{ inputs.dist_version }}-docs-pdf-a4.tar.bz2 + path: ./Doc/dist/python-${{ inputs.dist_version }}*-docs-pdf-a4.tar.bz2 if-no-files-found: ignore publish: needs: [build-html, build-text, build-texinfo, build-epub, build-pdf] - if: ${{ !cancelled() && github.event.inputs.publish == 'true' }} + if: ${{ !cancelled() && inputs.publish == 'true' }} runs-on: ubuntu-latest + concurrency: + group: gh-pages-publish + cancel-in-progress: false steps: - name: Checkout gh-pages branch - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: ref: gh-pages path: gh-pages + - name: Pull latest gh-pages + run: git -C gh-pages pull --rebase origin gh-pages - name: Download all artifacts uses: actions/download-artifact@master with: @@ -172,32 +203,32 @@ jobs: run: | mkdir -p gh-pages/3 # PDF - cp artifacts/docs-pdf-a4.zip/python-${{ github.event.inputs.dist_version }}-docs-pdf-a4.zip gh-pages/3/ 2>/dev/null || true - cp artifacts/docs-pdf-a4.tar.bz2/python-${{ github.event.inputs.dist_version }}-docs-pdf-a4.tar.bz2 gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-pdf-a4.zip/* gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-pdf-a4.tar.bz2/* gh-pages/3/ 2>/dev/null || true # HTML - cp artifacts/docs-html.zip/python-${{ github.event.inputs.dist_version }}-docs-html.zip gh-pages/3/ 2>/dev/null || true - cp artifacts/docs-html.tar.bz2/python-${{ github.event.inputs.dist_version }}-docs-html.tar.bz2 gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-html.zip/* gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-html.tar.bz2/* gh-pages/3/ 2>/dev/null || true # Text - cp artifacts/docs-text.zip/python-${{ github.event.inputs.dist_version }}-docs-text.zip gh-pages/3/ 2>/dev/null || true - cp artifacts/docs-text.tar.bz2/python-${{ github.event.inputs.dist_version }}-docs-text.tar.bz2 gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-text.zip/* gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-text.tar.bz2/* gh-pages/3/ 2>/dev/null || true # Texinfo - cp artifacts/docs-texinfo.zip/python-${{ github.event.inputs.dist_version }}-docs-texinfo.zip gh-pages/3/ 2>/dev/null || true - cp artifacts/docs-texinfo.tar.bz2/python-${{ github.event.inputs.dist_version }}-docs-texinfo.tar.bz2 gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-texinfo.zip/* gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs-texinfo.tar.bz2/* gh-pages/3/ 2>/dev/null || true # EPUB - cp artifacts/docs.epub/python-${{ github.event.inputs.dist_version }}-docs.epub gh-pages/3/ 2>/dev/null || true + cp artifacts/python-${{ inputs.dist_version }}-docs.epub/* gh-pages/3/ 2>/dev/null || true - name: Commit generated archives id: commit run: | cd gh-pages git config user.name github-actions git config user.email github-actions@github.com - git add 3/python-${{ github.event.inputs.dist_version }}-docs-* || true + git add 3/ if git diff --cached --quiet; then echo "No documentation archives to commit" - echo "has_changes=false" >> $GITHUB_OUTPUT + echo "has_changes=false" >> "$GITHUB_OUTPUT" else - git commit -m "Update documentation archives for ${{ github.event.inputs.dist_version }}" - echo "has_changes=true" >> $GITHUB_OUTPUT + git commit -m "Update documentation archives for ${{ inputs.dist_version }}" + echo "has_changes=true" >> "$GITHUB_OUTPUT" fi - name: Push commit if: steps.commit.outputs.has_changes == 'true' diff --git a/.github/workflows/schedule.yaml b/.github/workflows/schedule.yaml new file mode 100644 index 0000000..ecfe4ea --- /dev/null +++ b/.github/workflows/schedule.yaml @@ -0,0 +1,32 @@ +name: scheduled docs generation +on: + schedule: + - cron: '0 5 * * *' + workflow_dispatch: + push: +permissions: + contents: write +jobs: + get-versions: + runs-on: ubuntu-latest + outputs: + versions: ${{ steps.get-versions.outputs.versions }} + steps: + - name: Get supported Python versions + id: get-versions + run: | + versions=$(curl -sf https://peps.python.org/api/release-cycle.json | \ + jq -c '[to_entries[] | select(.value.status != "end-of-life" and .value.status != "planned") | {version: .key, branch: (.value.branch // .key), python_version: (if .key == "3.10" then "3.12" else "3" end)}]') + echo "versions=$versions" >> "$GITHUB_OUTPUT" + build: + needs: get-versions + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(needs.get-versions.outputs.versions) }} + uses: ./.github/workflows/build.yaml + with: + reference: ${{ matrix.branch }} + dist_version: ${{ matrix.version }} + python_version: ${{ matrix.python_version }} + publish: ${{ 'true' }}