GitHub Actions
Know when a scheduled workflow stops running, not just when it fails.
GitHub tells you when a workflow fails. It says nothing when a scheduled workflow stops running, which happens when a repository goes quiet for 60 days, when the default branch changes, or when a cron line is edited wrongly. A heartbeat closes that gap. The full list of ways a schedule stops is worth a read.
The short way: the action
There is an official action. It is one composite step that shells out to curl — no Node bundle and no Docker image to pull — and it understands GitHub's own job.status values.
- uses: nicholasbergesen/vivere-ping-action@v1
if: always()
with:
url: ${{ secrets.VIVERE_PING_URL }}
status: ${{ job.status }}
Source and full options: nicholasbergesen/vivere-ping-action (MIT).
The explicit way: curl
Store the ping URL as a repository secret named VIVERE_PING_URL, then add a final step that always runs:
name: nightly-report
on:
schedule:
- cron: "0 3 * * *"
workflow_dispatch:
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: curl -fsS -m 10 --retry 3 "${{ secrets.VIVERE_PING_URL }}/start"
- name: Build the report
run: ./scripts/report.sh
- name: Report result to Vivere
if: always()
run: |
code=0; [ "${{ job.status }}" = "success" ] || code=1
curl -fsS -m 10 --retry 3 -X POST --data-binary "job ${{ job.status }} run ${{ github.run_id }}" "${{ secrets.VIVERE_PING_URL }}/$code"
Give the monitor the same cron expression (0 3 * * *, timezone UTC, since GitHub schedules in UTC) and a generous grace: GitHub often starts scheduled workflows 10–30 minutes late under load, so use at least 45m.