Skip to content

Documentation

Documentation #11792

Workflow file for this run

on:
workflow_dispatch:
inputs:
deployment_id:
type: string
description: The workflow id of the deployment that contains the produced documentation to publish.
required: true
version:
required: true
type: string
description: 'The version that the documentation corresponds to, e.g. 0.3.1 or latest.'
github_repository:
type: string
required: false
description: The repository on which generated to documentation artifacts.
workflow_run:
workflows:
- Deployments
- CI
types:
- completed
name: Documentation
concurrency:
group: ${{ github.workflow }}${{ github.event.workflow_run.name }} # only one docs publishing can be run at a time, since all docs are published to the same location!
cancel-in-progress: false
jobs:
publish_docs:
name: Publish documentation
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.name == 'CI' || (github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.actor.id == '135836288')
permissions:
contents: write
issues: write
pull-requests: write
actions: read
environment:
name: ${{ (github.event.workflow_run.name == 'CI' && 'default') || 'github-pages' }}
url: ${{ vars.deployment_url || format('https://github.com/{0}', github.repository) }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ (github.event.workflow_run.name == 'CI' && vars.preview_branch) || vars.live_branch }}
token: ${{ (github.event.workflow_run.name == 'CI' && github.token) || secrets.REPO_BOT_ACCESS_TOKEN }}
- name: Download artifacts
id: artifacts
run: |
if ${{ github.event_name == 'workflow_dispatch' }}; then
artifacts_url=https://api.github.com/repos/${{ inputs.github_repository || github.repository }}/actions/runs/${{ inputs.deployment_id }}/artifacts
else
artifacts_url=${{ github.event.workflow_run.artifacts_url }}
fi
artifacts=$(gh api --paginate $artifacts_url -q '.artifacts[] | {name: .name, url: .archive_download_url}')
artifact_name=cuda_quantum_docs
docs_found=${{ github.event.workflow_run.name == 'CI' || false }}
for artifact in `echo "$artifacts"`; do
name=`echo $artifact | jq -r '.name'`
if [ "$name" == "$artifact_name" ]; then
url=`echo $artifact | jq -r '.url'`
gh api $url > cuda_quantum_docs.zip
docs_found=true && echo "docs_archive=cuda_quantum_docs.zip" >> $GITHUB_OUTPUT
elif [ "$name" == "metadata_ci" ]; then
url=`echo $artifact | jq -r '.url'`
gh api $url > metadata.zip
unzip -d metadata metadata.zip
for file in `find metadata/ -type f`; do
cat "$file" >> metadata.txt
done
rm -rf metadata metadata.zip
fi
done
run_id=`echo $artifacts_url | rev | cut -d / -f 2 | rev`
workflow_run=https://github.com/${{ inputs.github_repository || github.repository }}/actions/runs/$run_id
if $docs_found; then
echo "Downloaded $artifact_name artifact from $workflow_run." >> $GITHUB_STEP_SUMMARY
else
echo "::error file=documentation.yml::Failed to find $artifact_name artifact from $workflow_run."
exit 1;
fi
if [ -f metadata.txt ]; then
pr_number=`cat metadata.txt | grep -o 'pr-number: \S*' | cut -d ' ' -f 2`
pr_base=`cat metadata.txt | grep -o 'pr-base: \S*' | cut -d ' ' -f 2`
rm metadata.txt && echo "pr_number=$pr_number" >> $GITHUB_OUTPUT
fi
if ${{ github.event_name == 'workflow_dispatch' }}; then
echo "target_folder=${{ inputs.version }}" >> $GITHUB_OUTPUT
else
# Docs will be checked in under a different folder in the preview.
head_branch=${pr_base:-${{ github.event.workflow_run.head_branch }}}
if [ "$head_branch" == "main" ]; then
echo "target_folder=latest" >> $GITHUB_OUTPUT
elif ${{ github.event.workflow_run.name != 'CI' }} && [ "$head_branch" != "${head_branch#experimental/}" ]; then
echo "Documentation for experimental features will not be published."
echo "Instead, please edit the README in docker/release/ to describe the feature and link any additional resources."
elif ${{ github.event.workflow_run.name != 'CI' }} && [ "$head_branch" != "${head_branch#features/}" ]; then
echo "Documentation for feature branches will not be published."
elif ${{ github.event.workflow_run.name != 'CI' }} && [ "$head_branch" != "${head_branch#staging/}" ]; then
# Only publish docs if no release branch exists for that version.
version=`echo ${head_branch#staging/} | (egrep -o "^v?([0-9]{1,}\.)+[0-9]{1,}$" || true)`
gh api repos/${{ github.repository }}/branches \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
--paginate --jq '.[].name | select(startswith("releases/"))' \
> release_branches.txt
if [ -n "$(cat release_branches.txt | (egrep -o "^releases/v?${version}$" || true))" ]; then
echo "A release branch exists for version $version. Documentation from staging branch will not be published." >> $GITHUB_STEP_SUMMARY
else
echo "target_folder=${version#v}" >> $GITHUB_OUTPUT
if [ -z "${version:-$pr_number}" ]; then
echo "Unrecognized docs version. Documentation will not be published." >> $GITHUB_STEP_SUMMARY
fi
fi
else
version=`echo ${head_branch#releases/} | (egrep -o "^v?([0-9]{1,}\.)+[0-9]{1,}$" || true)`
echo "target_folder=${version#v}" >> $GITHUB_OUTPUT
if [ -z "${version:-$pr_number}" ]; then
echo "Unrecognized docs version. Documentation will not be published." >> $GITHUB_STEP_SUMMARY
fi
fi
fi
env:
GH_TOKEN: ${{ secrets.REPO_BOT_ACCESS_TOKEN || github.token }}
- name: Push docs update
id: push_docs
if: steps.artifacts.outputs.docs_archive != '' && (steps.artifacts.outputs.target_folder != '' || steps.artifacts.outputs.pr_number != '')
run: |
pr_number=${{ steps.artifacts.outputs.pr_number }}
target_folder=${pr_number:+pr-$pr_number}
target_folder="${target_folder:-${{ steps.artifacts.outputs.target_folder }}}"
rm -rf "$target_folder"
unzip -d "$target_folder" "${{ steps.artifacts.outputs.docs_archive }}"
git config --global user.name "cuda-quantum-bot"
git config --global user.email "[email protected]"
if [ -f create_redirects.sh ]; then
bash create_redirects.sh >> $GITHUB_STEP_SUMMARY
fi
git add "$target_folder"
docs_changed=`git diff --cached --exit-code > /dev/null && echo false || echo true`
if ${{ github.event_name == 'workflow_dispatch' }}; then
git commit -m "Docs update triggered manually for version ${{ inputs.version }} (workflow: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})."
elif [ -n "$pr_number" ]; then
git commit --allow-empty -m "Docs preview for PR #$pr_number."
else
git commit --allow-empty -m "Docs update triggered by deployment on head branch ${{ github.event.workflow_run.head_branch }}, commit ${{ github.event.workflow_run.head_sha }}."
fi
git config pull.rebase true
git pull --no-edit && git push
# For the docs preview, we determine whether docs changed compared to the eventual target folder.
if [ "$target_folder" != "${{ steps.artifacts.outputs.target_folder }}" ]; then
rm -rf "${{ steps.artifacts.outputs.target_folder }}"
mv "$target_folder" "${{ steps.artifacts.outputs.target_folder }}"
git add "${{ steps.artifacts.outputs.target_folder }}"
docs_changed=`git diff --cached --exit-code > /dev/null && echo false || echo true`
fi
pr_comment='**CUDA Quantum Docs Bot:** '
if $docs_changed; then
branch_name=`git rev-parse --abbrev-ref HEAD`
preview_link=https://htmlpreview.github.io/?https://github.com/${{ github.repository }}/blob/${branch_name}/${target_folder}/index.html
pr_comment+="A preview of the documentation can be found [here]($preview_link)."
echo "$pr_comment" >> $GITHUB_STEP_SUMMARY
else
pr_comment+='This PR contains no documentation changes.'
echo "No documentation changes." >> $GITHUB_STEP_SUMMARY
fi
echo "pr_comment=$pr_comment" >> $GITHUB_OUTPUT
- name: Comment on PR
if: steps.artifacts.outputs.pr_number != '' && steps.push_docs.outcome != 'skipped'
continue-on-error: true # PR may be locked by the time this workflow runs if auto-merge is set to true
uses: peter-evans/create-or-update-comment@v3
with:
issue-number: ${{ steps.artifacts.outputs.pr_number }}
body: ${{ steps.push_docs.outputs.pr_comment }}
edit-mode: replace