Highlights
Webhook notifications from Docker labels (#481)
Docker labels like ofelia.webhook.slack-alerts.preset=slack are now fully functional. Define named webhooks, global webhook settings, and per-job webhook assignments entirely via container labels — no INI file required. INI-defined webhooks take precedence over labels for security, and webhook configs are dynamically synced on container changes. Reported by @julian-heng in #467.
Allow job-run on stopped containers (#461)
The job-run type can now be defined on stopped containers via --docker-include-stopped. Running container definitions take precedence over stopped ones. Other job types (exec, local, service-run, compose) from stopped containers are ignored. Contributed by @nekrich.
Replace logrus with stdlib log/slog (#480)
Replaced the logrus dependency with Go's standard library log/slog package. This reduces external dependencies, improves structured logging, and aligns with the Go ecosystem's direction.
Go 1.26 modernization (#475, #477)
Upgraded to Go 1.26 with modern features: errors.AsType[T], reflect.Type.Fields() iterators, t.TempDir() in tests, and go-cron v0.11.0 scheduler enhancements (JobWithContext, WaitForJobByName, UpsertJob).
Mutation testing at 85%+ efficacy (#479)
Added mutation tests across all packages to validate test suite quality, reaching 85%+ test efficacy.
Changes
Features
- feat: allow job-run on non-service and stopped containers (#461) — @nekrich
- feat: modernize scheduler to leverage go-cron v0.11.0 features (#476)
- feat(api): expose job running status via
IsJobRunningByName - feat: implement
JobWithContexton jobWrapper for per-entry context - feat: wait for running jobs before removal with
WaitForJobByName - feat(hooks): add YAML and actionlint pre-commit checks (#474)
Bug Fixes
- fix: parse webhook config from Docker labels (#481, #467) — reported by @julian-heng
- fix: protect INI webhooks from label overwrite during sync
- fix: propagate
context.Contextthrough RunJob and workflow APIs - fix(ci): update golangci-lint to v2.9.0 for Go 1.26 support
- fix(ci): skip auto-approve for external contributors (#464)
- fix(ci): fix dependency review YAML and increase smoke test timeout
Refactoring
- refactor: replace logrus with stdlib
log/slog(#480) - refactor: modernize dependencies and adopt newer API features (#478)
- refactor: remove go-dockerclient dependency
- refactor: adopt Go 1.26 features and clean up test temp files (#477)
- refactor: use
errors.AsType[T]from Go 1.26 - refactor: replace hand-rolled cron validation with
cron.ValidateSpec - refactor: use
UpdateEntryJobByNamefor atomic job updates in web API - refactor: unify Docker label decoding with INI config path
Testing
- test: add mutation tests to reach 85%+ test efficacy (#479)
- test: add comprehensive webhook label tests and documentation (#482)
- test: add IPv6 URL coverage for Go 1.26 stricter parsing
Performance
- perf: add
WithCapacityto cron scheduler initialization
CI/CD
- chore(deps): upgrade Go to 1.26 and all dependencies (#475)
- chore(ci): update CodeQL Action from v3 to v4
- chore(ci): add codecov config, make project coverage informational (#465)
- chore: limit the number of Docker events (#466) — @nekrich
Full Changelog: v0.19.2...v0.20.0
Contributors
Thanks to the contributors who made this release possible:
- @nekrich — code contributor: stopped container support (#461), Docker events limit (#466)
- @julian-heng — bug reporter: webhook labels ignored (#467)