diff --git a/.github/build-baseline/antora-errors.txt b/.github/build-baseline/antora-errors.txt new file mode 100644 index 0000000000..87d3d7aa73 --- /dev/null +++ b/.github/build-baseline/antora-errors.txt @@ -0,0 +1,4 @@ +# Known Antora errors of the site build, one per line: file message. +# Written by .github/build-baseline/check.sh --update; the build fails on any other. +openidm/modules/integrators-guide/pages/appendix-scripting.adoc dropping cells from incomplete row detected end of table +openig/modules/ROOT/partials/sec-release-levels.adoc level 0 sections can only be used when doctype is book diff --git a/.github/build-baseline/broken-links.jq b/.github/build-baseline/broken-links.jq new file mode 100644 index 0000000000..a5493f2206 --- /dev/null +++ b/.github/build-baseline/broken-links.jq @@ -0,0 +1,28 @@ +# +# The contents of this file are subject to the terms of the Common Development and +# Distribution License (the License). You may not use this file except in compliance with the +# License. +# +# You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the +# specific language governing permission and limitations under the License. +# +# When distributing Covered Software, include this CDDL Header Notice in each file and include +# the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL +# Header, with the fields enclosed by brackets [] replaced by your own identifying +# information: "Portions copyright [year] [name of copyright owner]". +# +# Copyright 2026 3A Systems, LLC. + +# The broken links of a lychee JSON report, one per line: page link, both relative to the +# site root. Used by check.sh and by the job summary of build.yml. + +# A link to the id of its target page itself, e.g. chap-resource-conf#chap-resource-conf: Antora +# renders the page title without an id, so the browser opens the top of the page, which is where +# the link points anyway. lychee's --exclude takes no back references, so these are dropped here. +def top_of_page: + .status.text == "Cannot find fragment" + and (.url | split("#") | (.[0] | split("/") | last | rtrimstr(".html")) == (.[1:] | join("#"))); + +.error_map // {} | to_entries[] | .key as $page | .value[] +| select(top_of_page | not) +| "\($page | ltrimstr("/site/"))\t\(.url | ltrimstr("file:///site/"))" diff --git a/.github/build-baseline/broken-links.txt b/.github/build-baseline/broken-links.txt new file mode 100644 index 0000000000..801410635a --- /dev/null +++ b/.github/build-baseline/broken-links.txt @@ -0,0 +1,47 @@ +# Known broken links of the site build, one per line: page link. +# Written by .github/build-baseline/check.sh --update; the build fails on any other. +openam/admin-guide/chap-monitoring.html openam/admin-guide/chap-monitoring.html#interface-stability +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#chap-cdsso +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#chap-saml-1 +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#configure-policies-with-console +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#configure-session-quotas +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#saml2-and-session-state +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#session-mgmt +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#session-upgrade +openam/admin-guide/chap-session-state.html openam/admin-guide/chap-session-state.html#snmp-sessions +openam/dev-guide/chap-client-dev.html openam/admin-guide/index.html#configure-openid-connect-discovery +openam/dev-guide/chap-client-dev.html openam/admin-guide/index.html#configure-uma-discovery +openam/dev-guide/chap-client-dev.html openam/dev-guide/chap-client-dev.html#chap-sts +openam/dev-guide/chap-client-dev.html openam/dev-guide/index.html#appendix-deprecated-apis +openam/dev-guide/chap-client-dev.html openam/dev-guide/index.html#rest-api-auth +openam/install-guide/chap-prepare-install.html openam/admin-guide/index.html#tuning-jvm-for-openam +openam/jee-users-guide/chap-jee-agent-config.html openam/jee-users-guide/chap-jee-agent-config.html#filter-modes +openam/jee-users-guide/chap-jee-agents-features.html openam/jee-users-guide/index.html#j2ee-agent-cookie-reset-properties +openam/jee-users-guide/chap-jee-agents-features.html openam/jee-users-guide/index.html#j2ee-agent-fqdn-properties +openam/jee-users-guide/chap-jee-agents-features.html openam/jee-users-guide/index.html#j2ee-agent-general-properties +openam/jee-users-guide/chap-jee-agents-features.html openam/jee-users-guide/index.html#j2ee-agent-not-enforced-uri-properties +openam/jee-users-guide/chap-troubleshooting.html openam/jee-users-guide/index.html#install-with-ibm-jvm +openam/reference/chap-endpoints.html openam/dev-guide/index.html#rest-api-uma-well-known +openam/reference/chap-log-messages.html openam/admin-guide/index.html#debug-logging +openam/reference/openam-cli-tools.html openam/install-guide/index.html#install-openam-admin-tools +openam/reference/openam-cli-tools.html openam/reference/openam-cli-tools.html#ssoadm-create-policies +openam/reference/openam-cli-tools.html openam/reference/openam-cli-tools.html#ssoadm-delete-policies +openam/reference/openam-cli-tools.html openam/reference/openam-cli-tools.html#ssoadm-list-policies +openam/reference/openam-cli-tools.html openam/reference/openam-cli-tools.html#ssoadm-update-policies +openam/web-users-guide/chap-msiis-7.html openam/web-users-guide/index.html#chap-web-agents +opendj/admin-guide/chap-admin-tools.html opendj/reference/admin-tools-ref#ldif-diff-1 +opendj/admin-guide/chap-import-export.html opendj/reference/admin-tools-ref#ldif-diff-1 +opendj/admin-guide/chap-import-export.html opendj/reference/admin-tools-ref#make-ldif-template-5 +opendj/server-dev-guide/chap-ldap-operations.html opendj/reference/admin-tools-ref#ldif-diff-1 +openidm/connectors-guide/chap-ldap.html file:///opendj/3.5/server-dev-guide#referential-integrity +openidm/getting-started/chap-where-to-go.html file:///opendj/install-guide +openidm/integrators-guide/chap-auth.html file:///openam/13.5/admin-guide#session-state-cookies +openidm/integrators-guide/chap-auth.html openidm/integrators-guide/index.html#openam-session-module +openidm/integrators-guide/chap-auth.html openidm/integrators-guide/index.html#supported-session-modules +openidm/integrators-guide/chap-passwords.html file:///opendj/3.5/admin-guide/configure-ssl +openidm/integrators-guide/chap-synchronization.html file:///opendj/3.5/admin-guide#read-ecl-as-regular-user +openidm/samples-guide/chap-fullstack-sample.html file:///openam/13/admin-guide#chap-realms +openidm/samples-guide/chap-fullstack-sample.html file:///openam/13/admin-guide#realm-data-store +openidm/samples-guide/chap-fullstack-sample.html file:///openam/install-guide#configure-openam-custom +openidm/samples-guide/chap-ldap-samples.html file:///opendj/install-guide +openidm/samples-guide/chap-workflow-samples.html file:///opendj/install-guide#gui-install diff --git a/.github/build-baseline/check.sh b/.github/build-baseline/check.sh new file mode 100755 index 0000000000..35cfeca825 --- /dev/null +++ b/.github/build-baseline/check.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +# +# The contents of this file are subject to the terms of the Common Development and +# Distribution License (the License). You may not use this file except in compliance with the +# License. +# +# You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the +# specific language governing permission and limitations under the License. +# +# When distributing Covered Software, include this CDDL Header Notice in each file and include +# the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL +# Header, with the fields enclosed by brackets [] replaced by your own identifying +# information: "Portions copyright [year] [name of copyright owner]". +# +# Copyright 2026 3A Systems, LLC. + +# Compares the Antora errors and the broken links of a site build with the known ones listed in +# this directory, and fails on any new one. The known ones come from the product repositories and +# are fixed there; a known one that is gone is reported so that it is removed from the list. +# +# Usage, from the repository root after a build that wrote build/antora.log (Antora JSON log) and +# build/lychee.json (lychee JSON report): +# .github/build-baseline/check.sh check against the known lists +# .github/build-baseline/check.sh --update rewrite the known lists from this build + +set -euo pipefail + +dir=$(cd "$(dirname "$0")" && pwd) +root=$(cd "$dir/../.." && pwd) +update=false +[ "${1:-}" = --update ] && update=true + +# file message, the file relative to the repository root +antora_errors() { + jq -r --arg root "$root/" 'select(.level == "error" or .level == "fatal") + | "\(.file.path // "" | ltrimstr($root))\t\(.msg)"' "$root/build/antora.log" | LC_ALL=C sort +} + +# page link, both relative to the site root +broken_links() { + jq -r -f "$dir/broken-links.jq" "$root/build/lychee.json" | LC_ALL=C sort -u +} + +failed=false + +compare() { + local title=$1 file=$dir/$2 current=$3 new fixed + if $update; then + { + echo "# Known $title of the site build, one per line: $4." + echo "# Written by .github/build-baseline/check.sh --update; the build fails on any other." + printf '%s\n' "$current" | sed '/^$/d' + } > "$file" + echo "$file: $(printf '%s\n' "$current" | sed '/^$/d' | wc -l | tr -d ' ') entries" + return + fi + local known + known=$({ grep -v '^#' "$file" || true; } | LC_ALL=C sort) + new=$(LC_ALL=C comm -23 <(printf '%s\n' "$current" | sed '/^$/d') <(printf '%s\n' "$known" | sed '/^$/d')) + fixed=$(LC_ALL=C comm -13 <(printf '%s\n' "$current" | sed '/^$/d') <(printf '%s\n' "$known" | sed '/^$/d')) + { + echo "### $title" + echo + echo "$(printf '%s' "$new" | grep -c . || true) new, $(printf '%s' "$fixed" | grep -c . || true) no longer found." + echo + } >> "${GITHUB_STEP_SUMMARY:-/dev/null}" + while IFS= read -r line; do + [ -n "$line" ] || continue + msg=${line//%/%25} + msg=${msg//$'\r'/%0D} + echo "::error title=New $title::${msg//$'\t'/ — }" + echo "- new: \`${line//$'\t'/\` — \`}\`" >> "${GITHUB_STEP_SUMMARY:-/dev/null}" + failed=true + done <<< "$new" + while IFS= read -r line; do + [ -n "$line" ] || continue + msg=${line//%/%25} + msg=${msg//$'\r'/%0D} + echo "::notice title=No longer found; remove from .github/build-baseline/$2::${msg//$'\t'/ — }" + echo "- no longer found (remove from \`$2\`): \`${line//$'\t'/\` — \`}\`" >> "${GITHUB_STEP_SUMMARY:-/dev/null}" + done <<< "$fixed" + echo >> "${GITHUB_STEP_SUMMARY:-/dev/null}" +} + +# assigned first, so that a missing or malformed input stops the script (set -e) instead of +# reading as an empty build +errors=$(antora_errors) +links=$(broken_links) +$update || echo "## Compared with the known problems" >> "${GITHUB_STEP_SUMMARY:-/dev/null}" +compare "Antora errors" antora-errors.txt "$errors" "file message" +compare "broken links" broken-links.txt "$links" "page link" + +if $failed; then + echo "The build has new Antora errors or broken links, see above. Fix them; if they come from a" \ + "product repository, report them there and add them to .github/build-baseline." >&2 + exit 1 +fi diff --git a/.github/build-baseline/head-meta.sh b/.github/build-baseline/head-meta.sh new file mode 100755 index 0000000000..377f0f8d18 --- /dev/null +++ b/.github/build-baseline/head-meta.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +# +# The contents of this file are subject to the terms of the Common Development and +# Distribution License (the License). You may not use this file except in compliance with the +# License. +# +# You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the +# specific language governing permission and limitations under the License. +# +# When distributing Covered Software, include this CDDL Header Notice in each file and include +# the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL +# Header, with the fields enclosed by brackets [] replaced by your own identifying +# information: "Portions copyright [year] [name of copyright owner]". +# +# Copyright 2026 3A Systems, LLC. + +# Checks the generated site for the robots.txt Sitemap line and the head meta tags of every +# page, and fails on any problem. +# +# Usage, from the repository root after a site build: +# .github/build-baseline/head-meta.sh [site directory, build/site by default] + +set -euo pipefail + +dir=$(cd "$(dirname "$0")" && pwd) +root=$(cd "$dir/../.." && pwd) +site=${1:-build/site} +problems=() + +# Antora writes site.robots verbatim, so nothing else ties the Sitemap host to site.url +url=$(cd "$root" && node -p "require('js-yaml').load(require('fs').readFileSync('antora-playbook.yml', 'utf8')).site.url") +if ! grep -qxF "Sitemap: $url/sitemap.xml" "$site/robots.txt"; then + problems+=("robots.txt: no line \`Sitemap: $url/sitemap.xml\`") +fi +[ -f "$site/sitemap.xml" ] || problems+=("sitemap.xml: missing") + +# every page, other than a redirect page, carries exactly one of each tag; the API docs are not ours +tags=('> "${GITHUB_STEP_SUMMARY:-/dev/null}" +# "${problems[@]}" of an empty array is unbound in bash 3.2 (macOS) +[ "${#problems[@]}" -eq 0 ] && exit 0 +for p in "${problems[@]}"; do + echo "- $p" >> "${GITHUB_STEP_SUMMARY:-/dev/null}" + msg=${p//%/%25} + echo "::error title=Head meta tags and robots.txt::${msg//$'\r'/%0D}" +done +exit 1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..7310159af2 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,179 @@ +# The contents of this file are subject to the terms of the Common Development and +# Distribution License (the License). You may not use this file except in compliance with the +# License. +# +# You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the +# specific language governing permission and limitations under the License. +# +# When distributing Covered Software, include this CDDL Header Notice in each file and include +# the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL +# Header, with the fields enclosed by brackets [] replaced by your own identifying +# information: "Portions copyright [year] [name of copyright owner]". +# +# Copyright 2026 3A Systems, LLC. + +# Builds the site for a pull request, reports Antora messages and broken links in the job summary, +# and fails on an Antora error or a broken link that is not in the known lists of +# .github/build-baseline: the content has known problems, fixed in the product repositories, which +# would otherwise fail every pull request (#25). Link anchors are checked too (#36), and so are the +# head meta tags of every page and the Sitemap line of robots.txt (#37). +name: Build +on: + pull_request: + branches: [master] + workflow_dispatch: +concurrency: + group: build-${{ github.ref }} + cancel-in-progress: true +permissions: + contents: read +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v7 + - name: Install Node.js + uses: actions/setup-node@v7 + with: + node-version: '24' + cache: npm + - name: Install Antora + run: npm ci + - name: Generate Site + id: site + run: | + mkdir -p build + # Antora appends to an existing log file + rm -f build/antora.log + npx antora antora-playbook.yml --log-format=json --log-file=build/antora.log + npm run copyApiDocs + - name: Report Antora messages + # also when Antora fails: with --log-file its fatal error goes only to the log + if: ${{ !cancelled() && hashFiles('build/antora.log') != '' }} + run: | + log=build/antora.log + # annotate the errors on the pull request + jq -r --arg ws "$GITHUB_WORKSPACE/" 'select(.level == "error" or .level == "fatal") + | "::warning file=\(.file.path // "" | ltrimstr($ws)),line=\(.file.line // 1),title=Antora \(.level)::\(.msg | gsub("%"; "%25") | gsub("\r"; "%0D") | gsub("\n"; "%0A"))"' "$log" + { + echo "## Antora" + echo + echo "| Level | Messages |" + echo "|---|---|" + jq -rs 'group_by(.level)[] | "| \(.[0].level) | \(length) |"' "$log" + echo + echo "### Errors and warnings" + echo + echo "Without \`skipping reference to missing attribute\`, which are counted below." + echo + echo "| Level | Message | File | Line |" + echo "|---|---|---|---|" + jq -r --arg ws "$GITHUB_WORKSPACE/" 'select(.level != "info" and .level != "debug") + | select(.msg | startswith("skipping reference to missing attribute") | not) + | "| \(.level) | \(.msg | gsub("\\|"; "\\\\|") | gsub("\r?\n|\r"; "
")) | \(.file.path // "" | ltrimstr($ws)) | \(.file.line // "") |"' "$log" + echo + echo "### Missing attribute references" + echo + echo "| File | Count |" + echo "|---|---|" + jq -rs --arg ws "$GITHUB_WORKSPACE/" 'map(select(.msg | startswith("skipping reference to missing attribute"))) + | group_by(.file.path)[] | "| \(.[0].file.path // "" | ltrimstr($ws)) | \(length) |"' "$log" + } >> "$GITHUB_STEP_SUMMARY" + - name: Check links + run: | + rc=0 + docker run --rm -v "$PWD/build/site:/site:ro" lycheeverse/lychee:0.24.2 \ + --offline --no-progress --format json --include-fragments \ + --root-dir /site --fallback-extensions html --index-files index.html \ + --exclude-path '/site/(openam|opendj|openidm|openig)/apidocs' \ + --exclude-path '/site/(openicf|commons)' \ + '/site/**/*.html' > build/lychee.json || rc=$? + # 2 means broken links were found; anything else non-zero is a failure of the check itself + if [ "$rc" -ne 0 ] && [ "$rc" -ne 2 ]; then + exit "$rc" + fi + # without the links to the id of their target page itself, see broken-links.jq; lychee reports + # a link once per occurrence on the page, check.sh and this list count it once + all=$(jq -r -f .github/build-baseline/broken-links.jq build/lychee.json) + broken=$(printf '%s\n' "$all" | LC_ALL=C sort -u) + { + echo "## Links" + echo + jq -r --argjson n "$(printf '%s' "$broken" | grep -c . || true)" \ + --argjson all "$(printf '%s' "$all" | grep -c . || true)" \ + '"\(.total) checked, \($n) broken (\(.errors - $all) more point to the top of their target page)."' build/lychee.json + echo + echo "| Page | Link |" + echo "|---|---|" + printf '%s\n' "$broken" | awk -F'\t' 'NF { print "| " $1 " | " $2 " |" }' + } >> "$GITHUB_STEP_SUMMARY" + - name: Self-test the baseline check + run: | + # check.sh must fail on a new Antora error and a new broken link, and pass once they are known + t=$(mktemp -d) + mkdir -p "$t/.github/build-baseline" "$t/build" + cp .github/build-baseline/check.sh .github/build-baseline/broken-links.jq "$t/.github/build-baseline/" + : > "$t/.github/build-baseline/antora-errors.txt" + : > "$t/.github/build-baseline/broken-links.txt" + echo '{"level":"error","msg":"self-test","file":{"path":"'"$t"'/x.adoc"}}' > "$t/build/antora.log" + echo '{"error_map":{"/site/p.html":[{"url":"file:///site/q"}]}}' > "$t/build/lychee.json" + out=$(GITHUB_STEP_SUMMARY=/dev/null "$t/.github/build-baseline/check.sh" 2> /dev/null) && rc=0 || rc=$? + if [ "$rc" -ne 1 ] \ + || ! grep -qxF '::error title=New Antora errors::x.adoc — self-test' <<< "$out" \ + || ! grep -qxF '::error title=New broken links::p.html — q' <<< "$out"; then + echo "check.sh did not report the new Antora error and the new broken link (exit $rc): $out" >&2 + exit 1 + fi + printf 'x.adoc\tself-test\n' > "$t/.github/build-baseline/antora-errors.txt" + printf 'p.html\tq\n' > "$t/.github/build-baseline/broken-links.txt" + GITHUB_STEP_SUMMARY=/dev/null "$t/.github/build-baseline/check.sh" > /dev/null + # a link to the top of its target page is not broken; a broken anchor is, and so is a missing + # page linked at its own id + : > "$t/build/antora.log" + : > "$t/.github/build-baseline/antora-errors.txt" + : > "$t/.github/build-baseline/broken-links.txt" + lychee_error() { + echo '{"error_map":{"/site/a.html":[{"url":"file:///site/'"$1"'","status":{"text":"'"$2"'"}}]}}' \ + > "$t/build/lychee.json" + } + lychee_error 'd/b.html#b' 'Cannot find fragment' + if ! GITHUB_STEP_SUMMARY=/dev/null "$t/.github/build-baseline/check.sh" > /dev/null; then + echo "check.sh failed on a link to the top of its target page" >&2 + exit 1 + fi + for e in 'd/b.html#c:Cannot find fragment' 'd/b.html#b:Cannot find file'; do + lychee_error "${e%%:*}" "${e#*:}" + out=$(GITHUB_STEP_SUMMARY=/dev/null "$t/.github/build-baseline/check.sh" 2> /dev/null) && rc=0 || rc=$? + if [ "$rc" -ne 1 ] || ! grep -qxF "::error title=New broken links::a.html — ${e%%:*}" <<< "$out"; then + echo "check.sh did not report the broken link ${e%%:*}, ${e#*:} (exit $rc): $out" >&2 + exit 1 + fi + done + - name: Self-test the head meta check + run: | + # head-meta.sh must report a missing tag, a doubled tag, a robots.txt without the Sitemap line + # and a missing sitemap.xml; it skips a redirect page, but not a page that quotes one + t=$(mktemp -d) + : > "$t/robots.txt" + printf '%s\n' '' > "$t/r.html" + printf '%s\n' '' '' \ + '' '' \ + '' '' \ + '
<meta http-equiv="refresh" content="0; url=b.html">
' > "$t/a.html" + out=$(GITHUB_STEP_SUMMARY=/dev/null .github/build-baseline/head-meta.sh "$t") && rc=0 || rc=$? + e='::error title=Head meta tags and robots.txt::' + if [ "$rc" -ne 1 ] || [ "$(grep -c '^::error' <<< "$out")" -ne 4 ] \ + || ! grep -q "^${e}robots.txt: no line \`Sitemap: " <<< "$out" \ + || ! grep -qxF "${e}sitemap.xml: missing" <<< "$out" \ + || ! grep -qxF "${e}a.html: 0 x \`&2 + exit 1 + fi + - name: Compare with the known problems + run: .github/build-baseline/check.sh + - name: Check head meta tags and robots.txt + # also when the comparison failed, so that one run reports both + if: ${{ !cancelled() && steps.site.outcome == 'success' }} + run: .github/build-baseline/head-meta.sh build/site diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index dc88529436..338b60b06e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,3 +1,17 @@ +# The contents of this file are subject to the terms of the Common Development and +# Distribution License (the License). You may not use this file except in compliance with the +# License. +# +# You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the +# specific language governing permission and limitations under the License. +# +# When distributing Covered Software, include this CDDL Header Notice in each file and include +# the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL +# Header, with the fields enclosed by brackets [] replaced by your own identifying +# information: "Portions copyright [year] [name of copyright owner]". +# +# Copyright 2024-2026 3A Systems, LLC. + name: Publish to GitHub Pages on: push: @@ -20,27 +34,27 @@ jobs: url: ${{ steps.deployment.outputs.page_url }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v7 - name: Configure Pages - uses: actions/configure-pages@v3 + uses: actions/configure-pages@v6 - name: Install Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v7 with: node-version: '24' - name: Install Antora - run: npm i antora + run: npm ci - name: Generate Site env: ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }} ALGOLIA_SEARCH_API_KEY: ${{ secrets.ALGOLIA_SEARCH_API_KEY }} run: npm run buildAll - name: Upload Artifacts - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: build/site - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 - name: Reindex docs id: reindex working-directory: ./docsearch diff --git a/antora-playbook.yml b/antora-playbook.yml index 87141ef60b..a6a167ca61 100644 --- a/antora-playbook.yml +++ b/antora-playbook.yml @@ -43,8 +43,11 @@ content: edit_url: https://github.com/OpenIdentityPlatform/OpenIDM/edit/master/openidm-doc/src/main/asciidoc ui: bundle: - url: https://gitlab.com/antora/antora-ui-default/-/jobs/artifacts/HEAD/raw/build/ui-bundle.zip?job=bundle-stable - snapshot: true + # Antora default UI, kept in the repository so that a UI change is reviewed like any other. + # Taken from https://gitlab.com/antora/antora-ui-default/-/jobs/15385706035 (bundle-stable, 2026-09-30), + # sha256 e0ac81aad26961a9cd3cf9bce692a598eff4a1bd2822ce73c9cdc13a15a1e70d. + # To update, download .../-/jobs/artifacts/HEAD/raw/build/ui-bundle.zip?job=bundle-stable + url: ./ui/ui-bundle.zip supplemental_files: ./supplemental-ui output: diff --git a/ui/ui-bundle.zip b/ui/ui-bundle.zip new file mode 100644 index 0000000000..4283a6ed09 Binary files /dev/null and b/ui/ui-bundle.zip differ