Skip to content

Harden release workflow and apply review follow-ups (1.1.1) - #3

Merged
TimInTech merged 1 commit into
mainfrom
fix/review-followups
Sep 13, 2026
Merged

TimInTech merged 1 commit into
mainfrom
fix/review-followups

Conversation

@TimInTech

Copy link
Copy Markdown
Owner

Summary

Release workflow security

  • All actions are pinned to commit SHAs (Dependabot keeps SHA pins and version comments up to date).
  • actions/checkout no longer persists credentials in .git/config where only read access is needed.
  • package-updates.yml is split into two jobs:
    • check (read-only token): build, package comparison, amd64 smoke test, aarch64 build with unbound-checkconf under QEMU, app linter.
    • release (contents: write): only first-party actions/checkout, rebuilds, verifies version and SHA-256 of apk-packages.txt against the check job, then commits and pushes. A package change between the jobs fails the run instead of releasing an unverified set.

App (1.1.1)

  • unbound-anchor -4, matching do-ip6: no.
  • unbound.conf drops keys that restate Unbound defaults (do-ip4, prefer-ip6, do-udp, do-tcp, chroot, harden-glue, harden-dnssec-stripped, use-caps-for-id, edns-buffer-size, num-threads).

Docs

  • No fixed Alpine version in DOCS.md (Dependabot bumps would make it stale).
  • Verification section explains that dig @host goes through Pi-hole; documentation IP 192.0.2.10 instead of a real LAN IP.
  • Note on public names that resolve to private addresses (private-address).
  • README maintenance section describes the new job split.

Verification (local)

  • ShellCheck v0.11.0 and actionlint 1.7.7: clean; git diff --check: clean.
  • unbound-checkconf -o for all 24 relevant keys: identical effective values for old and new unbound.conf.
  • tests/smoke.sh --hardened against the new image: resolution, DNSSEC (AD flag, SERVFAIL for dnssec-failed.org), unprivileged start (uid 100), restart — PASS.
  • End-to-end run of package-updates.yml on a temporary branch with a simulated package change (see PR comment).

🤖 Generated with Claude Code

https://claude.ai/code/session_0175nKroeTB8UBzm1SJQa4Eg

- Pin all GitHub Actions to commit SHAs and stop persisting checkout credentials.
- Split package updates into a read-only check job (amd64 smoke test, aarch64
  build with config check, app linter) and a release job that holds the write
  token, runs no third-party actions and verifies it releases the checked
  package set.
- unbound-anchor uses IPv4 only, matching do-ip6: no.
- Drop unbound.conf keys that restate defaults; effective values unchanged.
- Docs: no fixed Alpine version, verification through Pi-hole explained, note
  on public names with private addresses, documentation IP instead of a LAN IP.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0175nKroeTB8UBzm1SJQa4Eg
@TimInTech

Copy link
Copy Markdown
Owner Author

End-to-end run of the new package-updates.yml (run 34772831442) on the temporary branch test/package-update-e2e (this PR plus a simulated zlib change in apk-packages.txt):

  • check (read-only): amd64 build, package comparison, fingerprint, amd64 smoke test, QEMU/Buildx, aarch64 build, unbound-checkconf on aarch64, app linter — all success.
  • release (write): rebuild, version/SHA-256 match against check, commit and push — success; github-actions[bot] pushed 6bf1a7e Release 1.1.2 with updated Alpine packages with the expected changelog entry (zlib 1.3.1-r0 → 1.3.2-r0).

The test branch was deleted afterwards. PR CI (lint, amd64 + aarch64 build, smoke test) is green.

🤖 Generated with Claude Code

@TimInTech
TimInTech merged commit b6bdb89 into main Sep 13, 2026
4 checks passed
@TimInTech
TimInTech deleted the fix/review-followups branch September 13, 2026 18:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant