django-components/.github/workflows/release-docs.yml
dependabot[bot] 8642da29df
build(deps): bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-08 11:51:55 +00:00

197 lines
7.9 KiB
YAML

---
name: Docs - build & deploy
on:
push:
tags:
# for versions 0.### (before 1.0.0)
- '0.[0-9]+'
# after 1.0.0
- '[0-9]+.[0-9]+.[0-9]+'
branches:
- master
workflow_dispatch:
jobs:
docs:
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:
contents: write # to let mkdocs write the new docs
pages: write # to deploy to Pages
id-token: write # to verify the deployment originates from an appropriate source
runs-on: ubuntu-latest
# Only run in original repo (not in forks)
if: github.repository == 'django-components/django-components'
steps:
##############################
# SETUP
##############################
# Authenticate with git with the Github App that has permission
# to push to master, in order to push benchmark results.
# See https://stackoverflow.com/a/79142962/9788634
- uses: actions/create-github-app-token@v2
id: app-token
with:
app-id: ${{ vars.RELEASE_BOT_APP_ID }}
private-key: ${{ secrets.RELEASE_BOT_APP_PRIVATE_KEY }}
- name: Checkout
uses: actions/checkout@v6
with:
token: ${{ steps.app-token.outputs.token }}
fetch-depth: 0
- name: Configure git account
run: |
git config user.name components-release-bot
git config user.email "components-release-bot@users.noreply.github.com"
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.13"
cache: 'pip'
- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel
# NOTE: pin virtualenv to <20.31 until asv fixes it.
# See https://github.com/airspeed-velocity/asv/issues/1484
python -m pip install -q pre-commit asv virtualenv==20.30
python -m pip install -r requirements-docs.txt
# Install django-components locally
python -m pip install -e .
###########################################
# RECORD BENCHMARK - ONLY ON PUSH TO MASTER
###########################################
- name: Run benchmarks for tag
if: github.ref_type == 'tag' && github.event_name == 'push'
env:
# See https://github.com/github/docs/issues/21930
# And https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Get the master branch so we can run benchmarks on it
git remote add upstream https://github.com/${{ github.repository }}.git
git fetch origin master:master
git checkout master
# Get tag name
TAG=${GITHUB_REF#refs/tags/}
echo "TAG: $TAG"
# TODO: REMOVE ONCE FIXED UPSTREAM
# Fix for https://github.com/airspeed-velocity/asv_runner/issues/45
# Prepare virtual environment
# Currently, we have to monkeypatch the `timeit` function in the `timeraw` benchmark.
# The problem is that `asv` passes the code to execute via command line, and when the
# code is too big, it fails with `OSError: [Errno 7] Argument list too long`.
# So we have to tweak it to pass the code via STDIN, which doesn't have this limitation.
#
# 1. First create the virtual environment, so that asv generates the directories where
# the monkeypatch can be applied.
echo "Creating virtual environment..."
asv setup -v || true
echo "Virtual environment created."
# 2. Now let's apply the monkeypatch by appending it to the `timeraw.py` files.
# First find all `timeraw.py` files
echo "Applying monkeypatch..."
find .asv/env -type f -path "*/site-packages/asv_runner/benchmarks/timeraw.py" | while read -r file; do
# Add a newline and then append the monkeypatch contents
echo "" >> "$file"
cat "benchmarks/monkeypatch_asv_ci.txt" >> "$file"
done
echo "Monkeypatch applied."
# END OF MONKEYPATCH
# Prepare the profile under which the benchmarks will be saved.
# We assume that the CI machine has a name that is unique and stable.
# See https://github.com/airspeed-velocity/asv/issues/796#issuecomment-1188431794
echo "Preparing benchmarks profile..."
asv machine --yes --machine ci-linux
echo "Benchmarks profile DONE."
# Run benchmarks for the current tag
# - `^` means that we mean the COMMIT of the tag's branch, not the BRANCH itself.
# Without it, we would run benchmarks for the whole branch history.
# With it, we run benchmarks FROM the tag's commit (incl) TO ...
# - `!` means that we want to select range spanning a single commit.
# Without it, we would run benchmarks for all commits FROM the tag's commit
# TO the start of the branch history.
# With it, we run benchmarks ONLY FOR the tag's commit.
echo "Running benchmarks for tag ${TAG}..."
asv run master^! -v
echo "Benchmarks for tag ${TAG} DONE."
# Generate benchmarks site
# This should save it in `docs/benchmarks/`, so we can then use it when
# building docs site with `mkdocs`.
echo "Generating benchmarks site..."
asv publish
echo "Benchmarks site DONE."
# Commit benchmark results
echo "Staging and committing benchmark results..."
git add .asv/results/
git add docs/benchmarks/
git commit -m "Add benchmark results for ${TAG}"
echo "Benchmark results committed."
# Push to the new branch
echo "Pushing benchmark results..."
git push origin master
echo "Benchmark results pushed to master."
###########################################
# BUILD & RELEASE DOCS
###########################################
# Change git authentication to Github Actions, so the rest of the
# workflow will have lower privileges.
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Configure git
run: |
# required for "mike deploy" command below which pushes to gh-pages
git config user.name github-actions
git config user.email github-actions@github.com
# Conditions make sure to select the right step, depending on the job trigger.
# Only one of the steps below will run at a time. The others will be skipped.
- name: Check docs in pull requests with strict mode
if: github.event_name == 'pull_request'
run: |
# TODO: Enable strict mode once docs are clean
echo "Strict check of docs disabled."
# mkdocs build --strict
- name: Build & deploy "dev" docs for a new commit to master
if: github.event_name == 'push' && github.ref_type != 'tag'
run: |
# Fetch and checkout gh-pages to ensure we have the latest version
git fetch origin gh-pages
git checkout gh-pages
git pull origin gh-pages
git checkout master
export SHORT_SHA=$(echo "${GITHUB_SHA}" | cut -c1-7)
mike deploy --push --update-aliases --title "dev (${SHORT_SHA})" dev
- name: Build & deploy docs for a new tag
if: github.ref_type == 'tag' && github.event_name == 'push'
run: |
# Fetch and checkout gh-pages to ensure we have the latest version
git fetch origin gh-pages
git checkout gh-pages
git pull origin gh-pages
git checkout master
mike deploy --push --update-aliases ${{ github.ref_name }} latest
mike set-default latest --push