mirror of
https://github.com/uutils/coreutils.git
synced 2026-10-16 02:48:27 -07:00
* .github/workflows/GnuTests.yml (Fetch reference results): Retry the branch lookup and treat only a 404 as "nothing published yet"; a transient API error used to look like a missing baseline and silently skip both comparisons, letting a regression through unnoticed. (Publish to the reference branch): Same for the published run id, which guards the force-push. A suppressed error read as run id 0 would let this run overwrite a reference a newer run had already placed. * .github/workflows/NotifyTracking.yml: Do not name a cadence for the tracking repository's fallback schedule, which is its own to change.
82 lines
3.7 KiB
YAML
82 lines
3.7 KiB
YAML
name: NotifyTracking
|
|
|
|
# spell-checker:ignore zizmor
|
|
# spell-checker:ignore (misc) busybox toybox multisize
|
|
|
|
## Tell uutils/coreutils-tracking to refresh as soon as a workflow that
|
|
## produces one of its inputs has finished on the default branch, so its graphs
|
|
## follow the data rather than wait for its scheduled refresh.
|
|
##
|
|
## 'GnuTests' publishes 'test-summary' and 'aggregated-result'; 'make' publishes
|
|
## 'busybox-result.json', 'toybox-result.json', 'size-result' and
|
|
## 'individual-size-result'. The tracking workflow picks up whatever is newest
|
|
## for each of them, so a notification from either is enough to run it.
|
|
|
|
on:
|
|
workflow_run:
|
|
workflows: ["GnuTests", "make"]
|
|
types:
|
|
- completed # zizmor: ignore[dangerous-triggers]
|
|
|
|
permissions: {}
|
|
|
|
jobs:
|
|
dispatch:
|
|
name: Trigger the tracking refresh
|
|
## Nothing is checked out and no result is read here, so the untrusted
|
|
## content a 'workflow_run' trigger can carry is never executed.
|
|
##
|
|
## A failed run still counts. 'GnuTests' uploads its results and only then
|
|
## fails the comparison when it finds a new failure, and 'publish-reference'
|
|
## publishes regardless; requiring success here would leave the graphs
|
|
## un-refreshed for exactly the regressions they exist to show.
|
|
if: >
|
|
github.repository == 'uutils/coreutils'
|
|
&& github.event.workflow_run.event == 'push'
|
|
&& github.event.workflow_run.head_branch == github.event.repository.default_branch
|
|
&& github.event.workflow_run.conclusion != 'cancelled'
|
|
&& github.event.workflow_run.conclusion != 'skipped'
|
|
runs-on: ubuntu-latest
|
|
## The 'secrets' context is not available in a step's 'if:', so fold the
|
|
## check into a job-level env var, which is.
|
|
env:
|
|
HAVE_APP_CREDENTIALS: ${{ secrets.TRACKING_APP_ID != '' && secrets.TRACKING_APP_PRIVATE_KEY != '' }}
|
|
steps:
|
|
## A GITHUB_TOKEN is scoped to the repository it runs in, so writing to a
|
|
## sibling repository needs a credential of its own even within the same
|
|
## organization. This uses an organization-owned GitHub App rather than a
|
|
## personal access token: it is not tied to an individual account and does
|
|
## not silently expire. Install it on uutils/coreutils-tracking only, with
|
|
## 'contents: write', which is what the repository_dispatch endpoint needs.
|
|
- name: Mint a token for the tracking repository
|
|
id: app-token
|
|
if: env.HAVE_APP_CREDENTIALS == 'true'
|
|
uses: actions/create-github-app-token@v3
|
|
with:
|
|
app-id: ${{ secrets.TRACKING_APP_ID }}
|
|
private-key: ${{ secrets.TRACKING_APP_PRIVATE_KEY }}
|
|
owner: uutils
|
|
repositories: coreutils-tracking
|
|
|
|
- name: Send the repository_dispatch
|
|
shell: bash
|
|
env:
|
|
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
|
SOURCE_WORKFLOW: ${{ github.event.workflow_run.name }}
|
|
SOURCE_RUN_ID: ${{ github.event.workflow_run.id }}
|
|
SOURCE_SHA: ${{ github.event.workflow_run.head_sha }}
|
|
run: |
|
|
## Send the repository_dispatch
|
|
## A missing token is not an error: the tracking repository still
|
|
## refreshes on its own schedule, this only makes it prompt.
|
|
if [[ -z "${GH_TOKEN}" ]]; then
|
|
echo "::warning ::TRACKING_APP_ID / TRACKING_APP_PRIVATE_KEY are not set; leaving the tracking repository to its scheduled refresh."
|
|
exit 0
|
|
fi
|
|
gh api --method POST 'repos/uutils/coreutils-tracking/dispatches' \
|
|
-f 'event_type=refresh-data' \
|
|
-f "client_payload[workflow]=${SOURCE_WORKFLOW}" \
|
|
-f "client_payload[run_id]=${SOURCE_RUN_ID}" \
|
|
-f "client_payload[sha]=${SOURCE_SHA}"
|
|
echo "::notice ::Asked uutils/coreutils-tracking to refresh after '${SOURCE_WORKFLOW}' (${SOURCE_SHA})."
|