Vivere

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.