Merge pull request #14767 from milzi234/master #4838
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This workflow builds and publishes documentation for PowerDNS products. | |
# It is controlled by the following variables and secrets: | |
# Variables: | |
# - PUBLISH_DOCS_TO_AWS: Set to 'true' to enable publishing to AWS | |
# - PUBLISH_DOCS_TO_NETLIFY: Set to 'true' to enable publishing to Netlify | |
# - PUBLISH_DOCS_TO_WEB1: Set to 'true' to enable publishing to Web1 | |
# - AWS_REGION: AWS region for S3 and CloudFront | |
# - AWS_S3_BUCKET_DOCS: S3 bucket name for documentation | |
# - AWS_CLOUDFRONT_DISTRIBUTION_ID_DNSDIST: CloudFront distribution ID for DNSdist docs | |
# - AWS_CLOUDFRONT_DISTRIBUTION_ID_DOCS: CloudFront distribution ID for PowerDNS docs | |
# - NETLIFY_SITE_ID_DOCS: Netlify site ID for PowerDNS docs | |
# - NETLIFY_SITE_ID_DNSDIST: Netlify site ID for DNSdist docs | |
# - REC_DOCS_DIR: Directory for Recursor docs on Web1 | |
# - AUTH_DOCS_DIR: Directory for Authoritative Server docs on Web1 | |
# - WEB1_HOSTKEY: SSH host key for Web1 | |
# - DOCS_HOST: Hostname for documentation server | |
# Secrets: | |
# - AWS_ACCESS_KEY_ID: AWS access key ID | |
# - AWS_SECRET_ACCESS_KEY: AWS secret access key | |
# - NETLIFY_API_TOKEN: API token for Netlify | |
# - WEB1_DOCS_SECRET: SSH key for Web1 access | |
--- | |
name: 'Documentation' | |
on: | |
push: | |
branches: [master] | |
workflow_dispatch: {} | |
permissions: | |
contents: read | |
env: | |
FORCE_JAVASCRIPT_ACTIONS_TO_NODE20: true | |
jobs: | |
build-docs: | |
name: Build docs | |
runs-on: ubuntu-22.04 | |
env: | |
SERVICE_IP_ADDR: 127.0.0.1 | |
BRANCH_NAME: ${{ github.ref_name }} | |
services: | |
database: | |
image: epicwink/proxpi | |
ports: | |
- 5000:5000 | |
options: >- | |
--restart always | |
outputs: | |
pdns_version: ${{ steps.get-version.outputs.pdns_version }} | |
pip-list-auth: ${{ steps.pip-logs-auth.outputs.list-auth }} | |
pip-list-rec: ${{ steps.pip-logs-rec.outputs.list-rec }} | |
pip-list-dnsdist: ${{ steps.pip-logs-dnsdist.outputs.list-dnsdist }} | |
steps: | |
- uses: PowerDNS/pdns/set-ubuntu-mirror@meta | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v5 | |
with: | |
python-version: '3.11' | |
- run: pip config set global.index-url http://${{ env.SERVICE_IP_ADDR }}:5000/index/ | |
- run: pip config set global.trusted-host ${{ env.SERVICE_IP_ADDR }} | |
- id: proxpi-docker | |
run: echo "id=$(docker ps | grep "epicwink/proxpi" | awk '{print $1}')" >> "$GITHUB_OUTPUT" | |
- run: build-scripts/gh-actions-setup-inv-no-dist-upgrade | |
- run: inv install-doc-deps | |
- run: inv install-doc-deps-pdf | |
- id: get-version | |
run: | | |
echo "pdns_version=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT | |
# Build Auth docs | |
- run: inv ci-docs-build | |
- run: mv html auth-html-docs | |
working-directory: ./docs/_build | |
- run: tar cf auth-html-docs.tar auth-html-docs | |
working-directory: ./docs/_build | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: authoritative-html-docs-${{steps.get-version.outputs.pdns_version}} | |
path: ./docs/_build/auth-html-docs.tar | |
- run: inv ci-docs-build-pdf | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: PowerDNS-Authoritative-${{steps.get-version.outputs.pdns_version}}.pdf | |
path: ./docs/_build/latex/PowerDNS-Authoritative.pdf | |
- run: docker logs ${{ steps.proxpi-docker.outputs.id }} 2>&1 | grep whl | awk '{print $8}' | cut -d "/" -f 4 | awk -F'-' '{print $1"=="$2}' | sort -u --ignore-case > /tmp/proxpi-auth.log | |
- id: pip-logs-auth | |
run: echo "list-auth=$(cat /tmp/proxpi-auth.log | base64 -w0)" >> "$GITHUB_OUTPUT" | |
- run: sudo sh -c "truncate -s 0 /var/lib/docker/containers/${{ steps.proxpi-docker.outputs.id }}*/${{ steps.proxpi-docker.outputs.id }}*-json.log" | |
- name: Copy PDF to HTML docs directory | |
run: | | |
cp ./docs/_build/latex/PowerDNS-Authoritative.pdf ./docs/_build/auth-html-docs/ | |
# Build Rec docs | |
- run: inv ci-metrics-rec-generate | |
working-directory: ./pdns/recursordist | |
- run: inv ci-docs-rec-generate | |
working-directory: ./pdns/recursordist/settings | |
- run: inv ci-docs-build | |
working-directory: ./pdns/recursordist | |
- run: mv html rec-html-docs | |
working-directory: ./pdns/recursordist/docs/_build | |
- run: tar cf rec-html-docs.tar rec-html-docs | |
working-directory: ./pdns/recursordist/docs/_build | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: recursor-html-docs-${{steps.get-version.outputs.pdns_version}} | |
path: ./pdns/recursordist/docs/_build/rec-html-docs.tar | |
- run: inv ci-docs-build-pdf | |
working-directory: ./pdns/recursordist | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: PowerDNS-Recursor-${{steps.get-version.outputs.pdns_version}}.pdf | |
path: ./pdns/recursordist/docs/_build/latex/PowerDNS-Recursor.pdf | |
- run: docker logs ${{ steps.proxpi-docker.outputs.id }} 2>&1 | grep whl | awk '{print $8}' | cut -d "/" -f 4 | awk -F'-' '{print $1"=="$2}' | sort -u --ignore-case > /tmp/proxpi-rec.log | |
- id: pip-logs-rec | |
run: echo "list-rec=$(cat /tmp/proxpi-rec.log | base64 -w0)" >> "$GITHUB_OUTPUT" | |
- run: sudo sh -c "truncate -s 0 /var/lib/docker/containers/${{ steps.proxpi-docker.outputs.id }}*/${{ steps.proxpi-docker.outputs.id }}*-json.log" | |
- name: Copy PDF to HTML docs directory | |
run: | | |
cp ./pdns/recursordist/docs/_build/latex/PowerDNS-Recursor.pdf ./pdns/recursordist/docs/_build/rec-html-docs/ | |
# Build DNSdist docs | |
- run: inv ci-docs-build | |
working-directory: ./pdns/dnsdistdist | |
- run: mv html dnsdist-html-docs | |
working-directory: ./pdns/dnsdistdist/docs/_build | |
- run: tar cf dnsdist-html-docs.tar dnsdist-html-docs | |
working-directory: ./pdns/dnsdistdist/docs/_build | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: dnsdist-html-docs-${{steps.get-version.outputs.pdns_version}} | |
path: ./pdns/dnsdistdist/docs/_build/dnsdist-html-docs.tar | |
- run: inv ci-docs-build-pdf | |
working-directory: ./pdns/dnsdistdist | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: dnsdist-${{steps.get-version.outputs.pdns_version}}.pdf | |
path: ./pdns/dnsdistdist/docs/_build/latex/dnsdist.pdf | |
- run: docker logs ${{ steps.proxpi-docker.outputs.id }} 2>&1 | grep whl | awk '{print $8}' | cut -d "/" -f 4 | awk -F'-' '{print $1"=="$2}' | sort -u --ignore-case > /tmp/proxpi-dnsdist.log | |
- id: pip-logs-dnsdist | |
run: echo "list-dnsdist=$(cat /tmp/proxpi-dnsdist.log | base64 -w0)" >> "$GITHUB_OUTPUT" | |
- name: Copy PDF to HTML docs directory | |
run: | | |
cp ./pdns/dnsdistdist/docs/_build/latex/dnsdist.pdf ./pdns/dnsdistdist/docs/_build/dnsdist-html-docs/ | |
# Build website | |
- name: Build website | |
run: | | |
tar cf website.tar website | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: website-${{steps.get-version.outputs.pdns_version}} | |
path: website.tar | |
publish-to-netlify: | |
name: Publish to Netlify | |
needs: build-docs | |
if: ${{ vars.PUBLISH_DOCS_TO_NETLIFY == 'true' && github.ref_name == 'master' }} | |
runs-on: ubuntu-22.04 | |
env: | |
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_API_TOKEN }} | |
NETLIFY_SITE_ID_DOCS: ${{ vars.NETLIFY_SITE_ID_DOCS }} | |
NETLIFY_SITE_ID_DNSDIST: ${{ vars.NETLIFY_SITE_ID_DNSDIST }} | |
steps: | |
- name: Check required secrets | |
run: | | |
missing_secrets=() | |
[ -z "$NETLIFY_AUTH_TOKEN" ] && missing_secrets+=("NETLIFY_API_TOKEN") | |
[ -z "$NETLIFY_SITE_ID_DOCS" ] && missing_secrets+=("NETLIFY_SITE_ID_DOCS") | |
[ -z "$NETLIFY_SITE_ID_DNSDIST" ] && missing_secrets+=("NETLIFY_SITE_ID_DNSDIST") | |
if [ ${#missing_secrets[@]} -ne 0 ]; then | |
echo "Error: The following secrets are missing: ${missing_secrets[*]}" | |
exit 1 | |
fi | |
- name: Install Netlify | |
run: npm install [email protected] -g | |
- uses: actions/download-artifact@v4 | |
with: | |
path: artifacts | |
- name: Deploy docs to Netlify | |
run: | | |
mkdir -p docs_site/temp | |
tar -xf artifacts/website-${{needs.build-docs.outputs.pdns_version}}/website.tar -C docs_site/temp | |
mv docs_site/temp/website/docs.powerdns.com/* docs_site/ | |
rm -rf docs_site/temp | |
tar -xf artifacts/authoritative-html-docs-${{needs.build-docs.outputs.pdns_version}}/auth-html-docs.tar -C docs_site | |
tar -xf artifacts/recursor-html-docs-${{needs.build-docs.outputs.pdns_version}}/rec-html-docs.tar -C docs_site | |
mv docs_site/auth-html-docs docs_site/authoritative | |
mv docs_site/rec-html-docs docs_site/recursor | |
netlify deploy \ | |
--dir ./docs_site \ | |
--site $NETLIFY_SITE_ID_DOCS \ | |
--auth $NETLIFY_AUTH_TOKEN \ | |
--prod | |
- name: Deploy DNSdist docs to Netlify | |
run: | | |
tar -xf artifacts/dnsdist-html-docs-${{needs.build-docs.outputs.pdns_version}}/dnsdist-html-docs.tar | |
netlify deploy \ | |
--dir ./dnsdist-html-docs \ | |
--site $NETLIFY_SITE_ID_DNSDIST \ | |
--auth $NETLIFY_AUTH_TOKEN \ | |
--prod | |
publish-to-web1: | |
name: Publish to Web1 | |
needs: build-docs | |
if: ${{ github.ref_name == 'master' && vars.PUBLISH_DOCS_TO_WEB1 == 'true' }} | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Check required secrets | |
run: | | |
missing_secrets=() | |
[ -z "${{ secrets.WEB1_DOCS_SECRET }}" ] && missing_secrets+=("WEB1_DOCS_SECRET") | |
[ -z "${{ vars.WEB1_HOSTKEY }}" ] && missing_secrets+=("WEB1_HOSTKEY") | |
[ -z "${{ vars.DOCS_HOST }}" ] && missing_secrets+=("DOCS_HOST") | |
[ -z "${{ vars.AUTH_DOCS_DIR }}" ] && missing_secrets+=("AUTH_DOCS_DIR") | |
[ -z "${{ vars.REC_DOCS_DIR }}" ] && missing_secrets+=("REC_DOCS_DIR") | |
if [ ${#missing_secrets[@]} -ne 0 ]; then | |
echo "Error: The following secrets/variables are missing: ${missing_secrets[*]}" | |
exit 1 | |
fi | |
- uses: actions/download-artifact@v4 | |
with: | |
path: artifacts | |
- id: setup-ssh | |
run: |- | |
inv ci-docs-add-ssh --ssh-key="$SSH_KEY" --host-key="$HOST_KEY" | |
env: | |
SSH_KEY: ${{secrets.WEB1_DOCS_SECRET}} | |
HOST_KEY: ${{vars.WEB1_HOSTKEY}} | |
- name: Publish Auth docs | |
run: | | |
mkdir -p ./docs/_build | |
cp artifacts/authoritative-html-docs-${{needs.build-docs.outputs.pdns_version}}/auth-html-docs.tar ./docs/_build/ | |
bzip2 ./docs/_build/auth-html-docs.tar | |
inv ci-docs-upload-master --docs-host="${DOCS_HOST}" --pdf="PowerDNS-Authoritative.pdf" --username="docs_powerdns_com" --product="auth" --directory="/${AUTH_DOCS_DIR}/" | |
env: | |
DOCS_HOST: ${{vars.DOCS_HOST}} | |
AUTH_DOCS_DIR: ${{vars.AUTH_DOCS_DIR}} | |
- name: Publish Recursor docs | |
run: | | |
mkdir -p ./pdns/recursordist/docs/_build | |
cp artifacts/recursor-html-docs-${{needs.build-docs.outputs.pdns_version}}/rec-html-docs.tar ./pdns/recursordist/docs/_build/ | |
bzip2 ./pdns/recursordist/docs/_build/rec-html-docs.tar | |
inv ci-docs-upload-master --docs-host="${DOCS_HOST}" --pdf="PowerDNS-Recursor.pdf" --username="docs_powerdns_com" --product="rec" --directory="/${REC_DOCS_DIR}/" | |
env: | |
DOCS_HOST: ${{vars.DOCS_HOST}} | |
REC_DOCS_DIR: ${{vars.REC_DOCS_DIR}} | |
- name: Publish DNSdist docs | |
run: | | |
mkdir -p ./pdns/dnsdistdist/docs/_build | |
cp artifacts/dnsdist-html-docs-${{needs.build-docs.outputs.pdns_version}}/dnsdist-html-docs.tar ./pdns/dnsdistdist/docs/_build/ | |
bzip2 ./pdns/dnsdistdist/docs/_build/dnsdist-html-docs.tar | |
inv ci-docs-upload-master --docs-host="${DOCS_HOST}" --pdf="dnsdist.pdf" --username="dnsdist_org" --product="dnsdist" | |
env: | |
DOCS_HOST: ${{vars.DOCS_HOST}} | |
publish-to-aws: | |
name: Publish to AWS | |
needs: build-docs | |
if: ${{ github.ref_name == 'master' && vars.PUBLISH_DOCS_TO_AWS == 'true' }} | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Check required secrets | |
run: | | |
missing_secrets=() | |
[ -z "${{ secrets.AWS_ACCESS_KEY_ID }}" ] && missing_secrets+=("AWS_ACCESS_KEY_ID") | |
[ -z "${{ secrets.AWS_SECRET_ACCESS_KEY }}" ] && missing_secrets+=("AWS_SECRET_ACCESS_KEY") | |
[ -z "${{ vars.AWS_REGION }}" ] && missing_secrets+=("AWS_REGION") | |
[ -z "${{ vars.AWS_S3_BUCKET_DOCS }}" ] && missing_secrets+=("AWS_S3_BUCKET_DOCS") | |
[ -z "${{ vars.AWS_CLOUDFRONT_DISTRIBUTION_ID_DNSDIST }}" ] && missing_secrets+=("AWS_CLOUDFRONT_DISTRIBUTION_ID_DNSDIST") | |
[ -z "${{ vars.AWS_CLOUDFRONT_DISTRIBUTION_ID_DOCS }}" ] && missing_secrets+=("AWS_CLOUDFRONT_DISTRIBUTION_ID_DOCS") | |
if [ ${#missing_secrets[@]} -ne 0 ]; then | |
echo "Error: The following secrets/variables are missing: ${missing_secrets[*]}" | |
exit 1 | |
fi | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-node@v3 | |
with: | |
node-version: '20' | |
- name: Install AWS SDK v3 | |
run: npm install @aws-sdk/client-s3 @aws-sdk/client-cloudfront | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
path: artifacts | |
- name: Publish to AWS | |
env: | |
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
AWS_REGION: ${{ vars.AWS_REGION }} | |
AWS_S3_BUCKET_DOCS: ${{ vars.AWS_S3_BUCKET_DOCS }} | |
AWS_CLOUDFRONT_DISTRIBUTION_ID_DNSDIST: ${{ vars.AWS_CLOUDFRONT_DISTRIBUTION_ID_DNSDIST }} | |
AWS_CLOUDFRONT_DISTRIBUTION_ID_DOCS: ${{ vars.AWS_CLOUDFRONT_DISTRIBUTION_ID_DOCS }} | |
run: | | |
if [ -n "$AWS_CLOUDFRONT_DISTRIBUTION_ID_DNSDIST" ]; then | |
tar -xf artifacts/dnsdist-html-docs-${{needs.build-docs.outputs.pdns_version}}/dnsdist-html-docs.tar | |
node .github/scripts/publish.js publish dnsdist.org dnsdist-html-docs / | |
fi | |
if [ -n "$AWS_CLOUDFRONT_DISTRIBUTION_ID_DOCS" ]; then | |
tar -xf artifacts/recursor-html-docs-${{needs.build-docs.outputs.pdns_version}}/rec-html-docs.tar | |
node .github/scripts/publish.js publish docs.powerdns.com rec-html-docs /recursor | |
tar -xf artifacts/authoritative-html-docs-${{needs.build-docs.outputs.pdns_version}}/auth-html-docs.tar | |
node .github/scripts/publish.js publish docs.powerdns.com auth-html-docs /authoritative | |
tar -xf artifacts/website-${{needs.build-docs.outputs.pdns_version}}/website.tar | |
node .github/scripts/publish.js publish docs.powerdns.com website/docs.powerdns.com / | |
fi | |
validate-pip-hashes: | |
name: Validate list of packages and hashes | |
runs-on: ubuntu-22.04 | |
needs: build-docs | |
steps: | |
- uses: actions/checkout@v4 | |
- run: for i in `echo "${{ needs.build-docs.outputs.pip-list-auth }}" | base64 -d | sed 's/_/-/' | egrep -v "pip==|setuptools==|wheel==|setuptools-git=="`; do grep -qq -i $i docs/requirements.txt || ( echo "$i not found" && exit 1 ); done | |
- run: for i in `echo "${{ needs.build-docs.outputs.pip-list-rec }}" | base64 -d | sed 's/_/-/' | egrep -v "pip==|setuptools==|wheel==|setuptools-git=="`; do grep -qq -i $i docs/requirements.txt || ( echo "$i not found" && exit 1 ); done | |
working-directory: ./pdns/recursordist | |
- run: for i in `echo "${{ needs.build-docs.outputs.pip-list-dnsdist }}" | base64 -d | sed 's/_/-/' | egrep -v "pip==|setuptools==|wheel==|setuptools-git=="`; do grep -qq -i $i docs/requirements.txt || ( echo "$i not found" && exit 1 ); done | |
working-directory: ./pdns/dnsdistdist |