Files
2026-08-01 20:21:37 +09:00

171 lines
6.1 KiB
YAML

name: Upstream watchdog
on:
schedule:
- cron: "23 3 * * *"
workflow_dispatch:
permissions: {}
concurrency:
group: upstream-watchdog
cancel-in-progress: false
jobs:
verify-upstream:
name: Verify upstream compatibility
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: read
outputs:
build_status: ${{ steps.verify.outputs.build_status }}
drift: ${{ steps.verify.outputs.drift }}
new_version: ${{ steps.verify.outputs.new_version }}
upstream_version: ${{ steps.verify.outputs.upstream_version }}
steps:
- name: Check out repository
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
persist-credentials: false
- name: Set up Node.js
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4
with:
node-version: 22
cache: npm
- name: Install Node.js dependencies
run: npm ci
- name: Install system dependencies
run: sudo apt-get update && sudo apt-get install --yes p7zip-full
- name: Verify current upstream release
id: verify
continue-on-error: true
shell: bash
run: |
set +e
bash scripts/build-app.sh >watchdog-build.log 2>&1
build_status=$?
set -e
echo "build_status=$build_status" >>"$GITHUB_OUTPUT"
baseline_version="$(sed -n "s/^- Nani \`\\([^\`]*\\)\`.*/\\1/p" docs/upstream-analysis.md | head -n 1)"
upstream_version=""
upstream_report=dist/reports/upstream.json
if [ -f "$upstream_report" ]; then
upstream_version="$(node -p 'JSON.parse(require("node:fs").readFileSync(process.argv[1], "utf8")).version' "$upstream_report")"
fi
echo "upstream_version=$upstream_version" >>"$GITHUB_OUTPUT"
if [ -n "$baseline_version" ] && [ -n "$upstream_version" ] && \
[ "$baseline_version" != "$upstream_version" ]; then
echo "new_version=true" >>"$GITHUB_OUTPUT"
else
echo "new_version=false" >>"$GITHUB_OUTPUT"
fi
drift=false
report=dist/reports/patch-report.json
if [ "$build_status" -ne 0 ] && [ -f "$report" ] && node - "$report" <<'NODE'
const fs = require("node:fs");
const report = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
const drift = Array.isArray(report.patches) && report.patches.some(
({ status }) => status === "failed-required" || status === "failed-integrity",
);
process.exit(drift ? 0 : 1);
NODE
then
drift=true
fi
echo "drift=$drift" >>"$GITHUB_OUTPUT"
exit "$build_status"
- name: Fail when upstream verification failed
if: steps.verify.outputs.build_status != '0'
run: exit 1
report:
name: Report upstream changes
needs: verify-upstream
if: >-
always() &&
(needs.verify-upstream.outputs.new_version == 'true' ||
needs.verify-upstream.outputs.drift == 'true')
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
issues: write # Required only for creating or updating watchdog issues.
steps:
- name: Report a new upstream version
if: needs.verify-upstream.outputs.new_version == 'true'
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
env:
BUILD_STATUS: ${{ needs.verify-upstream.outputs.build_status }}
UPSTREAM_VERSION: ${{ needs.verify-upstream.outputs.upstream_version }}
with:
script: |
const title = `[watchdog] Nani ${process.env.UPSTREAM_VERSION} is available`;
const issues = await github.paginate(github.rest.issues.listForRepo, {
owner: context.repo.owner,
repo: context.repo.repo,
state: "all",
per_page: 100,
});
const alreadyReported = issues.some(
(issue) => !issue.pull_request && issue.title === title,
);
if (!alreadyReported) {
const result = process.env.BUILD_STATUS === "0" ? "passed" : "failed";
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title,
body: [
`Nani ${process.env.UPSTREAM_VERSION} differs from the documented baseline.`,
`The Linux compatibility build **${result}**.`,
"",
`Workflow run: https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
].join("\n"),
});
}
- name: Create or update drift issue
if: needs.verify-upstream.outputs.drift == 'true'
uses: actions/github-script@f28e40c7f34bde8b3046d885e986cb6290c5673b # v7
with:
script: |
const title = "[watchdog] Upstream patch drift detected";
const body = [
"The upstream compatibility build detected required patch drift.",
"",
`Workflow run: https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
].join("\n");
const openIssues = await github.paginate(github.rest.issues.listForRepo, {
owner: context.repo.owner,
repo: context.repo.repo,
state: "open",
per_page: 100,
});
const existing = openIssues.find(
(issue) => !issue.pull_request && issue.title === title,
);
if (existing) {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: existing.number,
body,
});
} else {
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title,
body,
});
}