mirror of
https://github.com/netbirdio/docs.git
synced 2026-09-26 16:59:04 +02:00
GitHub Actions runners no longer ship Node 20 for JavaScript actions, and the ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION opt-out is gone, so any action whose own action.yml declares `runs.using: node20` (or older) now fails to start. Each target tag below was verified by reading its action.yml runtime directly, not inferred from the version number. actions/checkout v3, v4, v6 -> v7 actions/setup-node v4 -> v7 actions/cache v4 -> v6 actions/setup-go v5, v6 -> v7 docker/metadata-action v5 -> v6 docker/login-action v3 -> v4 docker/build-push-action v6 -> v7 booxmedialtd/ws-action-parse-semver is knowingly left alone. It declares node12 at v1, its newest tag v1.4.7 and master are node16, and the repo has not been touched since 2023, so there is no version to move to. Replacing it is a real change, not a version bump: it validates through node-semver and fails the job on a non-semver tag, and the obvious substitutes are weaker. A plain shell capture accepts the dispatch input's own placeholder default of refs/tags/vX.Y.Z, and netbirdio/shared-actions/actions/parse-semver falls back to 0.0.0 rather than failing. Either would let the job run on past the bad version, 404 the openapi.yml download, and push a commit deleting all 36 generated API pages, because the curl has no --fail and the Go expander ignores read and parse errors. That swap needs those guards and its own PR. Breaking changes across every major crossed were checked against the actual workflow lines and none apply: setup-node v5/v6 auto-caching needs a packageManager field package.json does not have (and every call site already passes cache: 'npm'); setup-node v7 drops a NODE_AUTH_TOKEN export nothing here uses, as no step sets registry-url; cache v5/v6 and checkout v5 raise the runner floor, and every job runs on ubuntu-latest or macos-latest; checkout v6 relocates persisted credentials, which generate_api_pages already proves harmless by pushing over HTTPS on v6 today; checkout v7 blocks fork PR heads under pull_request_target and workflow_run, neither of which is a trigger in this repo; metadata-action v6 changes '#' handling in list inputs, and the one input is a bare image name; build-push-action v7 removes DOCKER_BUILD_NO_SUMMARY and DOCKER_BUILD_EXPORT_RETENTION_DAYS, neither set anywhere; setup-go v6 reworks toolchain selection, and the only Go dependency here declares go 1.18 against an installed 1.21. The two pull_request-triggered checkouts that run PR-authored code and never touch a remote — pr-build and codespell — also stop persisting a token into the workspace. build_n_push keeps its credentials: the same checkout feeds the promote step's `git ls-remote origin`, so hardening it needs a job split. setup-node's node-version stays at 20. That is a real concern separately, since Node 20 is EOL, but docker/Dockerfile is FROM node:20-slim and build_n_push builds the Next standalone bundle on the runner and copies it into that image, so build-time and runtime Node have to move together and be proven by a real build. It belongs in its own PR.
137 lines
5.3 KiB
YAML
137 lines
5.3 KiB
YAML
name: generate api pages
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
tag:
|
|
description: 'Netbird release tag version'
|
|
required: true
|
|
default: "refs/tags/vX.Y.Z"
|
|
type: string
|
|
|
|
permissions:
|
|
actions: read
|
|
contents: read
|
|
|
|
# One run at a time: overlapping dispatches (several release tags in a day
|
|
# happen — see run history) regenerate the same files and would collide. A
|
|
# queued run superseded by a newer dispatch is fine: every run regenerates the
|
|
# whole directory from its own tag, so the latest dispatch is the end state.
|
|
# NB "latest dispatched", not "newest tag" — re-dispatching an older tag after
|
|
# a newer one regresses the pages to the older spec.
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
|
|
jobs:
|
|
generate_api_pages:
|
|
runs-on: macos-latest
|
|
steps:
|
|
- name: Parse tag input
|
|
id: semver_parser
|
|
uses: booxmedialtd/ws-action-parse-semver@v1
|
|
with:
|
|
input_string: ${{ github.event.inputs.tag }}
|
|
version_extractor_regex: '\/v(.*)$'
|
|
|
|
- uses: actions/checkout@v7
|
|
with:
|
|
token: ${{ secrets.DEV_GITHUB_TOKEN }}
|
|
|
|
# A run queued behind another (see concurrency above) checks out the
|
|
# commit pinned at its dispatch time, not the branch's current tip.
|
|
# Sync before generating so the diff is computed against reality —
|
|
# otherwise the pre-push rebase replays a stale-base snapshot, and a
|
|
# file the newer spec removed could silently survive from the prior run.
|
|
- name: Sync to branch tip
|
|
run: |
|
|
git fetch origin "${GITHUB_REF_NAME}"
|
|
git reset --hard "origin/${GITHUB_REF_NAME}"
|
|
|
|
- name: Create directory
|
|
run: mkdir -p generator/openapi
|
|
|
|
- name: Download openapi.yml
|
|
run: curl -L -o generator/openapi/openapi.yml "https://raw.githubusercontent.com/netbirdio/netbird/v${{ steps.semver_parser.outputs.fullversion }}/shared/management/http/api/openapi.yml"
|
|
|
|
- name: Install Go
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: '1.25'
|
|
|
|
- name: Build Go project
|
|
run: (cd ./generator && go build -o expandOpenAPIRef)
|
|
|
|
- name: Expand openapi.yml
|
|
run: (cd ./generator && ./expandOpenAPIRef)
|
|
|
|
- name: Remove old generated files
|
|
run: rm -rf src/pages/ipa/resources/*
|
|
|
|
- name: Setup Node.js
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '20'
|
|
cache: 'npm'
|
|
|
|
# npm ci: this workflow never changes dependencies, so install exactly
|
|
# the committed lockfile and never mutate it (macos-latest's npm can
|
|
# differ from the one that generated package-lock.json).
|
|
- name: Install dependencies
|
|
run: npm ci
|
|
|
|
- name: Generate api pages for netbird main openapi definition
|
|
run: npx ts-node generator/index.ts gen --input generator/openapi/expanded.yml --output src/pages/ipa/resources
|
|
|
|
- name: Check git diff and untracked files
|
|
id: git_diff
|
|
run: |
|
|
if [ -n "$(git status --porcelain src/pages/ipa/resources)" ]; then
|
|
echo "changed=true" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "changed=false" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
# Concurrency serialises runs but does not guarantee dispatch order. A
|
|
# delayed older run must not overwrite output from a newer dispatch.
|
|
- name: Check whether this is the latest dispatch
|
|
id: freshness
|
|
if: steps.git_diff.outputs.changed == 'true'
|
|
env:
|
|
GH_TOKEN: ${{ github.token }}
|
|
run: |
|
|
latest_run_id="$(
|
|
curl --fail --silent --show-error \
|
|
-H "Accept: application/vnd.github+json" \
|
|
-H "Authorization: Bearer ${GH_TOKEN}" \
|
|
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
--get \
|
|
--data-urlencode "event=workflow_dispatch" \
|
|
--data-urlencode "branch=${GITHUB_REF_NAME}" \
|
|
--data-urlencode "per_page=1" \
|
|
"https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/workflows/generate_api_pages.yml/runs" \
|
|
| python3 -c 'import json, sys; print(json.load(sys.stdin)["workflow_runs"][0]["id"])'
|
|
)"
|
|
|
|
if [ "$GITHUB_RUN_ID" = "$latest_run_id" ]; then
|
|
echo "push=true" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "push=false" >> "$GITHUB_OUTPUT"
|
|
echo "Skipping generated-page commit: run ${GITHUB_RUN_ID} was superseded by ${latest_run_id}"
|
|
fi
|
|
|
|
- name: Commit and push changes
|
|
if: steps.git_diff.outputs.changed == 'true' && steps.freshness.outputs.push == 'true'
|
|
run: |
|
|
git config --global user.email "dev@netbird.io"
|
|
git config --global user.name "netbirddev"
|
|
|
|
# Stage only the regenerated API pages — never sweep up incidental
|
|
# changes like a rewritten package-lock.json.
|
|
git add src/pages/ipa/resources
|
|
git commit -m "Update API pages with v${{ steps.semver_parser.outputs.fullversion }}"
|
|
# The run takes minutes; if the branch moved meanwhile, replay our
|
|
# single generated-files commit on top instead of failing the push.
|
|
# A conflict is only possible against a concurrent edit of the
|
|
# generated files themselves and fails the run loudly.
|
|
git pull --rebase origin "${GITHUB_REF_NAME}"
|
|
git push
|