Monitoring release health through version tags and dashboards, validating newly published packages with a post-release script, and preparing a safe rollback strategy if a version turns out to be problematic.

In episode 17 commit messages were disciplined and releases run automatically. But a release is not the end of the work — a release is the start of supervision. A published version isn't necessarily healthy; health must be proven.
This episode covers release monitoring & post-release checks: observability through version tags and dashboards, automatic validation after publishing, and rollback readiness when a version turns out to be problematic.
Every release leaves behind artifacts that can be monitored:
v1.4.0, v1.4.0-rc.2. The tag list is the fastest release chronology; git tag --sort=-v:refname shows the newest versions.git tag --sort=-v:refname | head -5
v1.6.2
v1.6.1
v1.6.0For teams that need automation, GitHub webhooks can send release events to a communication channel or dashboard — with a notification plugin like @semantic-release/slack or a Discord webhook via successCmd from @semantic-release/exec.
A failed publish isn't always obvious. Indicators to monitor:
Recommended pattern: separate the "release" job and the "post-release validation" job that run sequentially with needs. If validation fails, the team knows immediately before users report it.
The following workflow releases to npm then validates that the version is truly published and the service is healthy:
name: Release
on:
push:
branches: [main]
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install --frozen-lockfile
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
post-release-check:
runs-on: ubuntu-latest
needs: release
steps:
- name: Check the published version in the registry
run: |
VERSION=$(curl -s https://registry.npmjs.org/@devnull/learn-semantic-release/latest \
| jq -r .version)
echo "Published version: $VERSION"
test -n "$VERSION"
- name: Smoke test the production endpoint
run: |
curl -sf https://api.example.com/health | jq -e '.status == "ok"'What happens:
release job publishes the new version via semantic-release.post-release-check job waits for the release to finish with needs: release, then fetches the latest version from the registry with curl and validates that it exists.For a stricter scenario, the validation can also download that version's tarball and run a clean-install test (npm install in a fresh container).
Tip
Test the validation job with dryRun: run
npx semantic-release --dry-run --no-ci on a PR branch, then make
sure the validation commands pick up the same version number the changelog
predicts. This keeps the validation script from misleading you in
production.
A rollback plan must be decided before an incident, not during one. Some strategies:
npm deprecate paket@versi "mengandung bug" marks the broken version without deleting it.git revert <sha> undoes the change; since a revert produces a revert: commit, semantic-release automatically ships a new version.v1.5.0.Warning
Never delete an already-published version tag or force-push to "make a wrong version disappear". A deleted tag makes the release history inconsistent, severs the GitHub Release links, and breaks the semver consumers already use. The correct strategy: ship a new fix version or deprecate the old one — history stays intact and consumers can always move up to a healthy version.
Simulate rollback readiness periodically: record the last commit per version, document the steps to deploy the previous version, and make sure every image is tagged with the same version as the release.
Episode 18 recap:
With monitoring and rollback readiness, your release pipeline is not only automatic but also trustworthy. In episode 19 we'll open up GitOps and Release Automation — aligning releases with GitOps-based automatic deployment. See you there!