name: Documentation on: push: branches-ignore: - 'translations**' pull_request: workflow_dispatch: concurrency: group: docs-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true permissions: contents: read pages: write id-token: write env: DEFAULT_UV_VERSION: "0.10.x" DEFAULT_PYTHON_VERSION: "3.12" jobs: changes: name: Detect Docs Changes runs-on: ubuntu-slim outputs: docs_changed: ${{ steps.force.outputs.run_all == 'true' || steps.filter.outputs.docs == 'true' }} steps: - name: Checkout uses: actions/checkout@v6.0.2 with: fetch-depth: 0 - name: Decide run mode id: force run: | if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then echo "run_all=true" >> "$GITHUB_OUTPUT" elif [[ "${{ github.event_name }}" == "push" && ( "${{ github.ref_name }}" == "main" || "${{ github.ref_name }}" == "dev" ) ]]; then echo "run_all=true" >> "$GITHUB_OUTPUT" else echo "run_all=false" >> "$GITHUB_OUTPUT" fi - name: Set diff range id: range if: steps.force.outputs.run_all != 'true' run: | if [[ "${{ github.event_name }}" == "pull_request" ]]; then echo "base=${{ github.event.pull_request.base.sha }}" >> "$GITHUB_OUTPUT" elif [[ "${{ github.event.created }}" == "true" ]]; then echo "base=${{ github.event.repository.default_branch }}" >> "$GITHUB_OUTPUT" else echo "base=${{ github.event.before }}" >> "$GITHUB_OUTPUT" fi echo "ref=${{ github.sha }}" >> "$GITHUB_OUTPUT" - name: Detect changes id: filter if: steps.force.outputs.run_all != 'true' uses: dorny/paths-filter@v3.0.2 with: base: ${{ steps.range.outputs.base }} ref: ${{ steps.range.outputs.ref }} filters: | docs: - 'docs/**' - 'zensical.toml' - 'pyproject.toml' - 'uv.lock' - '.github/workflows/ci-docs.yml' build: needs: changes if: needs.changes.outputs.docs_changed == 'true' name: Build Documentation runs-on: ubuntu-24.04 steps: - uses: actions/configure-pages@v5.0.0 - name: Checkout uses: actions/checkout@v6.0.2 - name: Set up Python id: setup-python uses: actions/setup-python@v6.2.0 with: python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install uv uses: astral-sh/setup-uv@v7.3.1 with: version: ${{ env.DEFAULT_UV_VERSION }} enable-cache: true python-version: ${{ env.DEFAULT_PYTHON_VERSION }} - name: Install Python dependencies run: | uv sync --python ${{ steps.setup-python.outputs.python-version }} --dev --frozen - name: Build documentation run: | uv run \ --python ${{ steps.setup-python.outputs.python-version }} \ --dev \ --frozen \ zensical build --clean - name: Upload GitHub Pages artifact uses: actions/upload-pages-artifact@v4.0.0 with: path: site name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} deploy: name: Deploy Documentation needs: [changes, build] if: github.event_name == 'push' && github.ref == 'refs/heads/main' && needs.changes.outputs.docs_changed == 'true' runs-on: ubuntu-24.04 environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy GitHub Pages uses: actions/deploy-pages@v4.0.5 id: deployment with: artifact_name: github-pages-${{ github.run_id }}-${{ github.run_attempt }} gate: name: Docs CI Gate needs: [changes, build] if: always() runs-on: ubuntu-slim steps: - name: Check gate run: | if [[ "${{ needs.changes.outputs.docs_changed }}" != "true" ]]; then echo "No docs-relevant changes detected." exit 0 fi if [[ "${{ needs.build.result }}" != "success" ]]; then echo "::error::Docs build job result: ${{ needs.build.result }}" exit 1 fi echo "Docs checks passed."