@@ -2,6 +2,7 @@ name: Build Developer Guide Docs
22
33on :
44 pull_request :
5+ types : [opened, synchronize, reopened, ready_for_review]
56 paths :
67 - ' docs/developer-guide/**'
78 - ' .github/workflows/developer-guide-docs.yml'
@@ -21,23 +22,60 @@ jobs:
2122 - name : Check out repository
2223 uses : actions/checkout@v4
2324
24- - name : Update publication metadata for release
25- if : ${{ github.event_name == 'release' && github.event.action == 'published' }}
26- env :
27- RELEASE_TAG : ${{ github.event.release.tag_name }}
25+ - name : Determine publication metadata
2826 run : |
2927 set -euo pipefail
3028 REV_DATE="$(date -u +%Y-%m-%d)"
31- VERSION="${RELEASE_TAG :-}"
29+ VERSION="${GITHUB_HEAD_REF :-}"
3230 if [ -z "$VERSION" ] && [ -n "${GITHUB_REF_NAME:-}" ]; then
3331 VERSION="$GITHUB_REF_NAME"
3432 fi
33+ if [ -z "$VERSION" ] && [ -n "${GITHUB_SHA:-}" ]; then
34+ VERSION="${GITHUB_SHA:0:7}"
35+ fi
3536 VERSION="${VERSION#v}"
3637 if [ -z "$VERSION" ]; then
3738 VERSION="UNKNOWN"
3839 fi
39- sed -i -E "s/^:revdate: .*/:revdate: ${REV_DATE}/" docs/developer-guide/developer-guide.asciidoc
40- sed -i -E "s/^:revnumber: .*/:revnumber: ${VERSION}/" docs/developer-guide/developer-guide.asciidoc
40+ if date -u -d "$REV_DATE" '+%B %-d, %Y' >/tmp/rev_human 2>/dev/null; then
41+ REV_HUMAN_DATE="$(cat /tmp/rev_human)"
42+ else
43+ REV_HUMAN_DATE="$(date -u '+%B %-d, %Y')"
44+ fi
45+ echo "Developer guide workflow metadata:" >&2
46+ echo " REV_DATE=$REV_DATE" >&2
47+ echo " REV_NUMBER=$VERSION" >&2
48+ echo " REV_HUMAN_DATE=$REV_HUMAN_DATE" >&2
49+ {
50+ echo "REV_DATE=$REV_DATE"
51+ echo "REV_NUMBER=$VERSION"
52+ echo "REV_HUMAN_DATE=$REV_HUMAN_DATE"
53+ } >> "$GITHUB_ENV"
54+
55+ - name : Render publication cover artwork
56+ run : |
57+ set -euo pipefail
58+ sudo apt-get update
59+ sudo apt-get install -y --no-install-recommends librsvg2-bin
60+ SOURCE="docs/developer-guide/book-cover.svg"
61+ GENERATED_SVG="docs/developer-guide/book-cover.generated.svg"
62+ GENERATED_PNG="docs/developer-guide/book-cover.generated.png"
63+ cp "$SOURCE" "$GENERATED_SVG"
64+ export GENERATED_SVG
65+ python3 scripts/developer-guide/prepare_cover_artwork.py \
66+ "$GENERATED_SVG" \
67+ --rev-number "$REV_NUMBER" \
68+ --rev-human-date "$REV_HUMAN_DATE" \
69+ --rev-date "$REV_DATE"
70+ echo "Rasterizing cover artwork to ${GENERATED_PNG}" >&2
71+ rsvg-convert -w 2551 -h 3579 "$GENERATED_SVG" -o "$GENERATED_PNG"
72+ ls -l "$GENERATED_PNG"
73+ file "$GENERATED_PNG"
74+ {
75+ echo "COVER_IMAGE_ATTR=$(basename "$GENERATED_PNG")"
76+ echo "GENERATED_COVER_IMAGE=$GENERATED_PNG"
77+ echo "GENERATED_COVER_SVG=$GENERATED_SVG"
78+ } >> "$GITHUB_ENV"
4179
4280 - name : Set up Ruby
4381 uses : ruby/setup-ruby@v1
@@ -55,19 +93,47 @@ jobs:
5593 HTML_BUILD_DIR="${OUTPUT_ROOT}/html"
5694 PDF_BUILD_DIR="${OUTPUT_ROOT}/pdf"
5795 PACKAGE_DIR="${OUTPUT_ROOT}/html-package"
96+ COVER_IMAGE_ATTR_VALUE="${COVER_IMAGE_ATTR:-book-cover.svg}"
97+ GENERATED_COVER_IMAGE="${GENERATED_COVER_IMAGE:-}"
98+ GENERATED_COVER_SVG="${GENERATED_COVER_SVG:-}"
99+ echo "Building with cover image attribute: ${COVER_IMAGE_ATTR_VALUE}" >&2
58100 mkdir -p "$HTML_BUILD_DIR" "$PDF_BUILD_DIR"
59- asciidoctor -D "$HTML_BUILD_DIR" -o developer-guide.html docs/developer-guide/developer-guide.asciidoc
60- asciidoctor-pdf -D "$PDF_BUILD_DIR" -o developer-guide.pdf docs/developer-guide/developer-guide.asciidoc
101+ asciidoctor \
102+ -a revdate="$REV_DATE" \
103+ -a revnumber="$REV_NUMBER" \
104+ -a cover-image="$COVER_IMAGE_ATTR_VALUE" \
105+ -D "$HTML_BUILD_DIR" \
106+ -o developer-guide.html \
107+ docs/developer-guide/developer-guide.asciidoc
108+ asciidoctor-pdf \
109+ -a revdate="$REV_DATE" \
110+ -a revnumber="$REV_NUMBER" \
111+ -a cover-image="$COVER_IMAGE_ATTR_VALUE" \
112+ -D "$PDF_BUILD_DIR" \
113+ -o developer-guide.pdf \
114+ docs/developer-guide/developer-guide.asciidoc
61115 rm -rf "$PACKAGE_DIR"
62116 mkdir -p "$PACKAGE_DIR"
117+ if [ -n "$GENERATED_COVER_IMAGE" ] && [ -f "$GENERATED_COVER_IMAGE" ]; then
118+ cp "$GENERATED_COVER_IMAGE" "$HTML_BUILD_DIR/$(basename "$GENERATED_COVER_IMAGE")"
119+ fi
63120 cp "$HTML_BUILD_DIR/developer-guide.html" "$PACKAGE_DIR/"
64121 for asset_dir in docs/developer-guide/*; do
65122 base_name="$(basename "$asset_dir")"
66123 if [ -d "$asset_dir" ] && [ "$base_name" != "sketch" ]; then
67124 cp -R "$asset_dir" "$PACKAGE_DIR/"
68125 fi
69126 done
127+ if [ -n "$GENERATED_COVER_IMAGE" ] && [ -f "$GENERATED_COVER_IMAGE" ]; then
128+ cp "$GENERATED_COVER_IMAGE" "$PACKAGE_DIR/$(basename "$GENERATED_COVER_IMAGE")"
129+ fi
70130 (cd "$PACKAGE_DIR" && zip -r "../developer-guide-html.zip" .)
131+ if [ -n "$GENERATED_COVER_IMAGE" ] && [ -f "$GENERATED_COVER_IMAGE" ]; then
132+ rm -f "$GENERATED_COVER_IMAGE"
133+ fi
134+ if [ -n "$GENERATED_COVER_SVG" ] && [ -f "$GENERATED_COVER_SVG" ]; then
135+ rm -f "$GENERATED_COVER_SVG"
136+ fi
71137
72138 - name : Upload HTML artifact
73139 uses : actions/upload-artifact@v4
@@ -92,6 +158,24 @@ jobs:
92158 const marker = '<!-- developer-guide-artifacts -->';
93159 const { owner, repo } = context.repo;
94160 const runId = context.runId;
161+ const prNumber = context.payload.pull_request?.number;
162+ const runHeadSha = context.payload.pull_request?.head?.sha;
163+
164+ if (prNumber && runHeadSha) {
165+ const { data: pr } = await github.rest.pulls.get({
166+ owner,
167+ repo,
168+ pull_number: prNumber
169+ });
170+
171+ if (pr.head.sha !== runHeadSha) {
172+ console.log(
173+ `Skipping PR comment update because workflow run head ${runHeadSha} is not the latest PR head ${pr.head.sha}.`
174+ );
175+ return;
176+ }
177+ }
178+
95179 const artifacts = await github.rest.actions.listWorkflowRunArtifacts({
96180 owner,
97181 repo,
0 commit comments