Highlights
Compose projects as a job source. Register a Docker Compose project with [compose-project "name"], and Ofelia schedules the top-level jobs: of that project, read with compose-go. A job runs the project model accepted at registration, not Compose files edited afterwards. With --state-file, Compose jobs support missed_fires: one and concurrency: queue. See the jobs reference. ADR-004 and ADR-005 record the decisions (#888, #891, #892, #897, #905, #906, #907), by @CybotTM.
A -compose image variant contains the Compose CLI for those jobs: ghcr.io/netresearch/ofelia:1.1.0-compose, also tagged 1.1-compose, 1-compose and latest-compose. The default image is unchanged (#889), by @CybotTM.
Check your schedules before upgrading. go-cron moves from 0.17.0 to 0.19.0. A schedule whose step or range starts above the field maximum, such as 60/5 * * * * or 0 25-1 * * *, is now rejected; 0.17.0 accepted both. The daemon still starts, logs that job as rejected and does not run it. With [global] enable-strict-validation = true it cannot load the config file and schedules none of its jobs. Run ofelia validate or ofelia doctor to find such a schedule.
Fixed
- A canceled
job-localrun terminates its command and every process it started (SIGTERM to the process group, SIGKILL after 10 seconds). A canceledjob-execrun records whether the command is still running, has exited, or could not be inspected (#890), by @CybotTM. - A job disabled through the API or the web UI stays disabled when a config reload replaces it (#893), by @CybotTM.
[global] max-runtimeapplies at run time: a changed value reaches every job that inherits it on the next reload, and also bounds runs in progress (#895), by @CybotTM.- A replacement job does not start beside a removed job that is still stopping. Manual starts return
409 Conflictduring that interval; a deferredrun-on-startupfire runs after it ends (#896, #900), by @CybotTM. - Compose run executions are bounded by their own
max-runtimeor the global value, and their labelled workload containers are stopped and removed on cancellation (#887, #894), by @CybotTM. - The web API reads a job's last run and history without a data race (#899) — reported in #898, fixed by @CybotTM.
Changed
- go-cron 0.19.0, with the parse change above and go-cron's fixes for schedules that cross a daylight saving transition; see its 0.18.0 and 0.19.0 notes (#914), by @CybotTM.
- The image's Alpine base moves to 3.24.3 (#908).
Full changelog: v1.0.2...v1.1.0
Container image
ghcr.io/netresearch/ofelia:1.1.0
ghcr.io/netresearch/ofelia:1.1
ghcr.io/netresearch/ofelia:1
Verify your download
Per-asset signatures are bundled. Verify any single file:
cosign verify-blob \
--bundle ofelia-linux-amd64.sigstore.json \
--certificate-identity-regexp "^https://github\.com/netresearch/\.github/\.github/workflows/release-go-app\.yml@" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ofelia-linux-amd64Verify checksums against the signed manifest:
cosign verify-blob \
--bundle checksums.txt.sigstore.json \
--certificate-identity-regexp "^https://github\.com/netresearch/\.github/\.github/workflows/release-go-app\.yml@" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
checksums.txt
sha256sum -c checksums.txt --ignore-missingVerify build provenance. Releases are built by a reusable
workflow, so the signing identity is that workflow rather than
this repository -- --signer-workflow is required and
verification fails without it:
gh attestation verify <artifact> \
--repo netresearch/ofelia \
--signer-workflow netresearch/.github/.github/workflows/release-go-app.ymlVerify container image:
cosign verify ghcr.io/netresearch/ofelia:1.1.0 \
--certificate-identity-regexp "^https://github\.com/netresearch/\.github/\.github/workflows/release-go-app\.yml@" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
gh attestation verify oci://ghcr.io/netresearch/ofelia:1.1.0 \
--repo netresearch/ofelia \
--signer-workflow netresearch/.github/.github/workflows/release-go-app.yml