Compare commits

...

56 Commits

Author SHA1 Message Date
renovate-bot 1232f820e8 chore(deps): update module github.com/go-co-op/gocron to v2 (#56)
CD / Create tag (push) Successful in 45s
CD / test (push) Successful in 53s
CD / Build and push (amd64) (push) Successful in 31s
CD / Build and push (arm64) (push) Successful in 4m6s
CD / Create manifest (push) Successful in 28s
This PR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [github.com/go-co-op/gocron](https://github.com/go-co-op/gocron) | `v1.37.0` → `v2.22.0` | ![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fgo-co-op%2fgocron/v2.22.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fgo-co-op%2fgocron/v1.37.0/v2.22.0?slim=true) |

---

### Release Notes

<details>
<summary>go-co-op/gocron (github.com/go-co-op/gocron)</summary>

### [`v2.22.0`](https://github.com/go-co-op/gocron/releases/tag/v2.22.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.21.2...v2.22.0)

#### What's Changed

- build(deps): bump golangci/golangci-lint-action from 9.2.0 to 9.2.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;927](https://github.com/go-co-op/gocron/pull/927)
- build(deps): bump golangci/golangci-lint-action from 9.2.1 to 9.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;929](https://github.com/go-co-op/gocron/pull/929)
- build(deps): bump actions/checkout from 6 to 7 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;928](https://github.com/go-co-op/gocron/pull/928)
- fix: various performance improvements and clean up by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;930](https://github.com/go-co-op/gocron/pull/930)
- fixes: internal job func call handles param len mismatch, and global job options supports multiple calls by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;931](https://github.com/go-co-op/gocron/pull/931)
- fix(scheduler): skipped runs no longer consume WithLimitedRuns budget by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;932](https://github.com/go-co-op/gocron/pull/932)
- refactor(scheduler): make nextScheduled ascending-time invariant explicit by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;933](https://github.com/go-co-op/gocron/pull/933)
- refactor: adding modernize and embeddedstructfieldcheck linters by [@&#8203;manuelarte](https://github.com/manuelarte) in [#&#8203;934](https://github.com/go-co-op/gocron/pull/934)
- M-tier hygiene: constants, dedup, ErrSchedulerBusy, docs by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;935](https://github.com/go-co-op/gocron/pull/935)
- L-tier finale: typed LimitMode, docstrings, invariant comments by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;936](https://github.com/go-co-op/gocron/pull/936)
- fix: eliminate shared mutable state across jobs (C4, H5) by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;937](https://github.com/go-co-op/gocron/pull/937)
- ci: gate pre-commit config, add Dependabot pin updates by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;938](https://github.com/go-co-op/gocron/pull/938)
- ci: track Go stable/oldstable instead of pinned versions by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;942](https://github.com/go-co-op/gocron/pull/942)
- build(deps): bump <https://github.com/TekWizely/pre-commit-golang> from v1.0.0-rc.1 to 1.0.0.pre.rc.4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;941](https://github.com/go-co-op/gocron/pull/941)
- build(deps): bump <https://github.com/pre-commit/pre-commit-hooks> from v5.0.0 to 6.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;940](https://github.com/go-co-op/gocron/pull/940)
- build(deps): bump <https://github.com/golangci/golangci-lint> from v2.11.4 to 2.12.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;939](https://github.com/go-co-op/gocron/pull/939)
- test(scheduler): regression test for issue [#&#8203;943](https://github.com/go-co-op/gocron/issues/943) OneTimeJob CPU spin by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;944](https://github.com/go-co-op/gocron/pull/944)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.21.2...v2.22.0>

### [`v2.21.2`](https://github.com/go-co-op/gocron/releases/tag/v2.21.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.21.1...v2.21.2)

#### What's Changed

- fix: defer WithLimitedRuns job removal until task completes ([#&#8203;925](https://github.com/go-co-op/gocron/issues/925)) by [@&#8203;SAY-5](https://github.com/SAY-5) in [#&#8203;926](https://github.com/go-co-op/gocron/pull/926)

#### New Contributors

- [@&#8203;SAY-5](https://github.com/SAY-5) made their first contribution in [#&#8203;926](https://github.com/go-co-op/gocron/pull/926)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.21.1...v2.21.2>

### [`v2.21.1`](https://github.com/go-co-op/gocron/releases/tag/v2.21.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.21.0...v2.21.1)

#### What's Changed

- fix: remove jobs and respect stopTime in NextRuns when WithStopDateTi… by [@&#8203;jcheyer](https://github.com/jcheyer) in [#&#8203;922](https://github.com/go-co-op/gocron/pull/922)

#### New Contributors

- [@&#8203;jcheyer](https://github.com/jcheyer) made their first contribution in [#&#8203;922](https://github.com/go-co-op/gocron/pull/922)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.21.0...v2.21.1>

### [`v2.21.0`](https://github.com/go-co-op/gocron/releases/tag/v2.21.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.20.0...v2.21.0)

#### What's Changed

- feat: add WithDSTPolicy option for DST spring-forward handling by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;917](https://github.com/go-co-op/gocron/pull/917)
- feat: add IsRunning() and LastRunCompletedAt() to Job interface by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;918](https://github.com/go-co-op/gocron/pull/918)
- feat: Expose job schedule information via `Schedule()` method on `Job` interface by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;919](https://github.com/go-co-op/gocron/pull/919)

#### Test Suite

- test: enhancements to testing speed and reliablity by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;920](https://github.com/go-co-op/gocron/pull/920)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.20.0...v2.21.0>

### [`v2.20.0`](https://github.com/go-co-op/gocron/releases/tag/v2.20.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.19.1...v2.20.0)

#### What's Changed

- feat: add ShutdownWithContext and StopJobsWithContext by [@&#8203;huynhanx03](https://github.com/huynhanx03) in [#&#8203;913](https://github.com/go-co-op/gocron/pull/913)

#### Performance improvements

- perf: replace string allocation with bytes.Compare in Jobs() UUID sort by [@&#8203;huynhanx03](https://github.com/huynhanx03) in [#&#8203;914](https://github.com/go-co-op/gocron/pull/914)

#### Fixes

- Fix CronJob duplicate execution during DST fall-back by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;912](https://github.com/go-co-op/gocron/pull/912)

#### Docs

- docs: clarify NextRun/NextRuns require scheduler to be started by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;910](https://github.com/go-co-op/gocron/pull/910)

#### New Contributors

- [@&#8203;huynhanx03](https://github.com/huynhanx03) made their first contribution in [#&#8203;913](https://github.com/go-co-op/gocron/pull/913)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.19.1...v2.20.0>

### [`v2.19.1`](https://github.com/go-co-op/gocron/releases/tag/v2.19.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.19.0...v2.19.1)

#### What's Changed

- \[fix] race condition in `NextRun()` when multiple jobs complete simultaneously by [@&#8203;barkhayot](https://github.com/barkhayot) in [#&#8203;907](https://github.com/go-co-op/gocron/pull/907)
- Fix broken monitors link in README by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;908](https://github.com/go-co-op/gocron/pull/908)

#### New Contributors

- [@&#8203;barkhayot](https://github.com/barkhayot) made their first contribution in [#&#8203;907](https://github.com/go-co-op/gocron/pull/907)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.19.0...v2.19.1>

### [`v2.19.0`](https://github.com/go-co-op/gocron/releases/tag/v2.19.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.18.2...v2.19.0)

#### What's Changed

- feat: add scheduler lifecycle monitoring <> [#&#8203;785](https://github.com/go-co-op/gocron/issues/785) by [@&#8203;iyashjayesh](https://github.com/iyashjayesh) in [#&#8203;889](https://github.com/go-co-op/gocron/pull/889)
- feat: expose default cron implementation by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;906](https://github.com/go-co-op/gocron/pull/906)
- build(deps): bump golangci/golangci-lint-action from 9.1.0 to 9.2.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;903](https://github.com/go-co-op/gocron/pull/903)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.18.2...v2.19.0>

### [`v2.18.2`](https://github.com/go-co-op/gocron/releases/tag/v2.18.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.18.1...v2.18.2)

#### What's Changed

- build(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;899](https://github.com/go-co-op/gocron/pull/899)
- build(deps): bump actions/checkout from 5 to 6 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;898](https://github.com/go-co-op/gocron/pull/898)
- fix: calling start multiple times should no-op by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;901](https://github.com/go-co-op/gocron/pull/901)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.18.1...v2.18.2>

### [`v2.18.1`](https://github.com/go-co-op/gocron/releases/tag/v2.18.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.18.0...v2.18.1)

#### What's Changed

- build(deps): bump golangci/golangci-lint-action from 8.0.0 to 9.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;894](https://github.com/go-co-op/gocron/pull/894)
- fix: WithStartDateTimePast now correctly calculates from past time by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;897](https://github.com/go-co-op/gocron/pull/897)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.18.0...v2.18.1>

### [`v2.18.0`](https://github.com/go-co-op/gocron/releases/tag/v2.18.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.17.0...v2.18.0)

#### What's Changed

- feat: Add option to calculate intervals from job completion time for interval-based scheduling (fixes [#&#8203;565](https://github.com/go-co-op/gocron/issues/565)) by [@&#8203;iyashjayesh](https://github.com/iyashjayesh) in [#&#8203;884](https://github.com/go-co-op/gocron/pull/884)

#### Fixes

- fix: limit validation for WithLimitedRuns by [@&#8203;OsipovMax](https://github.com/OsipovMax) in [#&#8203;893](https://github.com/go-co-op/gocron/pull/893)

#### Chores

- doc: add v1 to v2 migration guide by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;890](https://github.com/go-co-op/gocron/pull/890)
- tests: add more daylight savings time tests by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;891](https://github.com/go-co-op/gocron/pull/891)
- docs: add Articles & Blog Posts section to README  by [@&#8203;iyashjayesh](https://github.com/iyashjayesh) in [#&#8203;886](https://github.com/go-co-op/gocron/pull/886)
- Bump github/codeql-action from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;883](https://github.com/go-co-op/gocron/pull/883)

#### New Contributors

- [@&#8203;OsipovMax](https://github.com/OsipovMax) made their first contribution in [#&#8203;893](https://github.com/go-co-op/gocron/pull/893)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.17.0...v2.18.0>

### [`v2.17.0`](https://github.com/go-co-op/gocron/releases/tag/v2.17.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.6...v2.17.0)

#### What's Changed

- feat: add WithStartDateTimePast WithStartAt option by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;882](https://github.com/go-co-op/gocron/pull/882)

#### Performance Improvements

- Reusing the results of reflections to improve performance by [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;873](https://github.com/go-co-op/gocron/pull/873)

#### Fixes

- fix: handle negative time.durations with error by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;878](https://github.com/go-co-op/gocron/pull/878)
- fix: multiple calls to shutdown should be no-op by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;880](https://github.com/go-co-op/gocron/pull/880)

#### Chores

- chore: go 1.23 is end of life - now go 1.24 by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;879](https://github.com/go-co-op/gocron/pull/879)
- Update README.md by [@&#8203;iyashjayesh](https://github.com/iyashjayesh) in [#&#8203;875](https://github.com/go-co-op/gocron/pull/875)

#### New Contributors

- [@&#8203;iyashjayesh](https://github.com/iyashjayesh) made their first contribution in [#&#8203;875](https://github.com/go-co-op/gocron/pull/875)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.6...v2.17.0>

### [`v2.16.6`](https://github.com/go-co-op/gocron/releases/tag/v2.16.6)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.5...v2.16.6)

#### What's Changed

- a return is missing to stop execution if the job is not found by [@&#8203;sarff](https://github.com/sarff) in [#&#8203;872](https://github.com/go-co-op/gocron/pull/872)

#### Chores

- Bump actions/setup-go from 5 to 6 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;871](https://github.com/go-co-op/gocron/pull/871)

#### New Contributors

- [@&#8203;sarff](https://github.com/sarff) made their first contribution in [#&#8203;872](https://github.com/go-co-op/gocron/pull/872)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.5...v2.16.6>

### [`v2.16.5`](https://github.com/go-co-op/gocron/releases/tag/v2.16.5)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.4...v2.16.5)

#### What's Changed

- Use `errors.New` for non-formatted strings by [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;870](https://github.com/go-co-op/gocron/pull/870)
- Add go1.25 tests by [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;869](https://github.com/go-co-op/gocron/pull/869)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.4...v2.16.5>

### [`v2.16.4`](https://github.com/go-co-op/gocron/releases/tag/v2.16.4)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.3...v2.16.4)

#### What's Changed

- Bump actions/checkout from 4 to 5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;860](https://github.com/go-co-op/gocron/pull/860)
- Bump golang.org/x/crypto from 0.40.0 to 0.41.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;859](https://github.com/go-co-op/gocron/pull/859)
- Add comprehensive GitHub Copilot instructions for gocron development by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;866](https://github.com/go-co-op/gocron/pull/866)
- Fix memory consumption issue by changing jobOutRequest channels to use pointers and reducing buffer size by [@&#8203;Copilot](https://github.com/Copilot) in [#&#8203;864](https://github.com/go-co-op/gocron/pull/864)
- Bump testify by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;868](https://github.com/go-co-op/gocron/pull/868)

#### New Contributors

- [@&#8203;Copilot](https://github.com/Copilot) made their first contribution in [#&#8203;866](https://github.com/go-co-op/gocron/pull/866)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.3...v2.16.4>

### [`v2.16.3`](https://github.com/go-co-op/gocron/releases/tag/v2.16.3)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.2...v2.16.3)

#### What's Changed

- fix: cancel job contexts in create/update errors by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;858](https://github.com/go-co-op/gocron/pull/858)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.2...v2.16.3>

### [`v2.16.2`](https://github.com/go-co-op/gocron/releases/tag/v2.16.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.1...v2.16.2)

#### What's Changed

- docs: adapt README to the dark theme by [@&#8203;alexandear](https://github.com/alexandear) in [#&#8203;844](https://github.com/go-co-op/gocron/pull/844)
- go 1.23 & golangci-lint v2 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;843](https://github.com/go-co-op/gocron/pull/843)
  - [Go 1.22 and below are end of life](https://endoflife.date/go)
- Bump golangci/golangci-lint-action from 7.0.0 to 8.0.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;847](https://github.com/go-co-op/gocron/pull/847)
- chore: document the limitations with the locker design by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;848](https://github.com/go-co-op/gocron/pull/848)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.1...v2.16.2>

### [`v2.16.1`](https://github.com/go-co-op/gocron/releases/tag/v2.16.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.16.0...v2.16.1)

#### What's Changed

- Fix [#&#8203;835](https://github.com/go-co-op/gocron/issues/835) and [#&#8203;837](https://github.com/go-co-op/gocron/issues/837) by [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;836](https://github.com/go-co-op/gocron/pull/836)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.16.0...v2.16.1>

### [`v2.16.0`](https://github.com/go-co-op/gocron/releases/tag/v2.16.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.15.0...v2.16.0)

#### What's Changed

- feat:custom-cron interface for own custom cron implimentation by [@&#8203;Dojeto](https://github.com/Dojeto) in [#&#8203;834](https://github.com/go-co-op/gocron/pull/834)

#### Bug fixes

- fixes related to the bug where a job unexpectedly runs twice by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;810](https://github.com/go-co-op/gocron/pull/810)
- fix scheduler restart by [@&#8203;27149chen](https://github.com/27149chen) in [#&#8203;825](https://github.com/go-co-op/gocron/pull/825)
- removes nextRuns in the past when job skipped by locker [#&#8203;828](https://github.com/go-co-op/gocron/issues/828) by [@&#8203;manuelarte](https://github.com/manuelarte) in [#&#8203;829](https://github.com/go-co-op/gocron/pull/829)

#### Chores

- go to 1.21, upgrade deps by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;822](https://github.com/go-co-op/gocron/pull/822)
- replace "golang.org/x/exp" with standard libraries by [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;823](https://github.com/go-co-op/gocron/pull/823)
- Bump golangci/golangci-lint-action from 6.2.0 to 6.3.2 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;827](https://github.com/go-co-op/gocron/pull/827)
- fix err assertion in TestScheduler\_RemoveJob by [@&#8203;alexandear](https://github.com/alexandear) in [#&#8203;830](https://github.com/go-co-op/gocron/pull/830)
- Bump golangci/golangci-lint-action from 6.3.2 to 6.5.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;831](https://github.com/go-co-op/gocron/pull/831)
- re-enable goleak detection in ci by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;832](https://github.com/go-co-op/gocron/pull/832)
- chore: add go1.24 to ci by [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;833](https://github.com/go-co-op/gocron/pull/833)

#### New Contributors

- [@&#8203;alexandear](https://github.com/alexandear) made their first contribution in [#&#8203;830](https://github.com/go-co-op/gocron/pull/830)
- [@&#8203;Dojeto](https://github.com/Dojeto) made their first contribution in [#&#8203;834](https://github.com/go-co-op/gocron/pull/834)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.15.0...v2.16.0>

### [`v2.15.0`](https://github.com/go-co-op/gocron/releases/tag/v2.15.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.14.2...v2.15.0)

#### What's New

- New method WithContext supports providing a parent context by [@&#8203;27149chen](https://github.com/27149chen) in [#&#8203;819](https://github.com/go-co-op/gocron/pull/819) & [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;820](https://github.com/go-co-op/gocron/pull/820)

```go
// WithContext sets the parent context for the job.
// If you set the first argument of your Task func to be a context.Context,
// gocron will pass in the provided context to the job and will cancel the
// context on shutdown. If you cancel the context the job will no longer be
// scheduled as well. This allows you to both control the job via a context
// and listen for and handle cancellation within your job.
```

- Job task function now supports passing a ctx if the first argument in your function is a `context.Context` by [@&#8203;27149chen](https://github.com/27149chen) in [#&#8203;819](https://github.com/go-co-op/gocron/pull/819) & [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;820](https://github.com/go-co-op/gocron/pull/820)

```go
// NewTask provides the job's task function and parameters.
// If you set the first argument of your Task func to be a context.Context,
// gocron will pass in a context (either the default Job context, or one
// provided via WithContext) to the job and will cancel the context on shutdown.
// This allows you to listen for and handle cancellation within your job.
```

#### Chores

- Bump golangci/golangci-lint-action from 6.1.1 to 6.2.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;817](https://github.com/go-co-op/gocron/pull/817)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.14.2...v2.15.0>

### [`v2.14.2`](https://github.com/go-co-op/gocron/releases/tag/v2.14.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.14.1...v2.14.2)

#### What's Changed

- feat: allow disabling global distributed locker per job by [@&#8203;seinshah](https://github.com/seinshah) in [#&#8203;811](https://github.com/go-co-op/gocron/pull/811)
- feat(event listener): introduce BeforeJobRunsSkipIfBeforeFuncErrors as a new Eventlistener by [@&#8203;FalcoSuessgott](https://github.com/FalcoSuessgott) in [#&#8203;813](https://github.com/go-co-op/gocron/pull/813)

#### New Contributors

- [@&#8203;seinshah](https://github.com/seinshah) made their first contribution in [#&#8203;811](https://github.com/go-co-op/gocron/pull/811)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.14.1...v2.14.2>

### [`v2.14.1`](https://github.com/go-co-op/gocron/releases/tag/v2.14.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.14.0...v2.14.1)

#### What's Changed

- BUG FIX: creating a new slice in several job options because appending modifies original by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;809](https://github.com/go-co-op/gocron/pull/809)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.14.0...v2.14.1>

### [`v2.14.0`](https://github.com/go-co-op/gocron/releases/tag/v2.14.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.13.0...v2.14.0)

#### What's Changed

- parse time.Time from AtTime by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;806](https://github.com/go-co-op/gocron/pull/806)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.13.0...v2.14.0>

### [`v2.13.0`](https://github.com/go-co-op/gocron/releases/tag/v2.13.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.12.4...v2.13.0)

#### What's Changed

- Bump github.com/stretchr/testify from 1.9.0 to 1.10.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;801](https://github.com/go-co-op/gocron/pull/801)
- stop timeout timers when no longer needed by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;803](https://github.com/go-co-op/gocron/pull/803)
- feat(monitor): introduce MonitorStatus by [@&#8203;FalcoSuessgott](https://github.com/FalcoSuessgott) in [#&#8203;780](https://github.com/go-co-op/gocron/pull/780)

#### New Contributors

- [@&#8203;FalcoSuessgott](https://github.com/FalcoSuessgott) made their first contribution in [#&#8203;780](https://github.com/go-co-op/gocron/pull/780)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.12.4...v2.13.0>

### [`v2.12.4`](https://github.com/go-co-op/gocron/releases/tag/v2.12.4)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.12.3...v2.12.4)

#### What's Changed

- Bump golangci/golangci-lint-action from 6.1.0 to 6.1.1 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;781](https://github.com/go-co-op/gocron/pull/781)
- fix overly greedy panic handler by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;800](https://github.com/go-co-op/gocron/pull/800)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.12.3...v2.12.4>

### [`v2.12.3`](https://github.com/go-co-op/gocron/releases/tag/v2.12.3)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.12.2...v2.12.3)

#### What's Changed

- update mocks with latest job/scheduler changes by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;794](https://github.com/go-co-op/gocron/pull/794)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.12.2...v2.12.3>

### [`v2.12.2`](https://github.com/go-co-op/gocron/releases/tag/v2.12.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.12.1...v2.12.2)

#### What's Changed

- dailyjob should not allow interval zero by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;791](https://github.com/go-co-op/gocron/pull/791)
- weekly and monthly jobs should not allow zero interval by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;792](https://github.com/go-co-op/gocron/pull/792)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.12.1...v2.12.2>

### [`v2.12.1`](https://github.com/go-co-op/gocron/releases/tag/v2.12.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.12.0...v2.12.1)

#### What's Changed

- Fix CPU spike / max-out in One-time job when 2 or more equal times are provided by [@&#8203;rbroggi](https://github.com/rbroggi) in [#&#8203;779](https://github.com/go-co-op/gocron/pull/779)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.12.0...v2.12.1>

### [`v2.12.0`](https://github.com/go-co-op/gocron/releases/tag/v2.12.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.11.0...v2.12.0)

#### What's Changed

- add Rescheduled metric for executor. by [@&#8203;Higan](https://github.com/Higan) in [#&#8203;763](https://github.com/go-co-op/gocron/pull/763)
- handle crontab and return error with invalid day in a month by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;766](https://github.com/go-co-op/gocron/pull/766)
- Bump golangci/golangci-lint-action from 6.0.1 to 6.1.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;764](https://github.com/go-co-op/gocron/pull/764)
- fix: cleanup timers by [@&#8203;hayotbisonai](https://github.com/hayotbisonai) in [#&#8203;776](https://github.com/go-co-op/gocron/pull/776)

#### New Contributors

- [@&#8203;hayotbisonai](https://github.com/hayotbisonai) made their first contribution in [#&#8203;776](https://github.com/go-co-op/gocron/pull/776)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.11.0...v2.12.0>

### [`v2.11.0`](https://github.com/go-co-op/gocron/releases/tag/v2.11.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.10.1...v2.11.0)

#### Features

- `WithStopAt` added to `JobOption`'s to allow giving a time for jobs to stop running by [@&#8203;Higan](https://github.com/Higan) in [#&#8203;760](https://github.com/go-co-op/gocron/pull/760)

#### Fixes

- Fix typo in security policy by [@&#8203;deining](https://github.com/deining) in [#&#8203;759](https://github.com/go-co-op/gocron/pull/759)

#### Internal

- internal refactoring by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;761](https://github.com/go-co-op/gocron/pull/761)

#### New Contributors

- [@&#8203;deining](https://github.com/deining) made their first contribution in [#&#8203;759](https://github.com/go-co-op/gocron/pull/759)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.10.1...v2.11.0>

### [`v2.10.1`](https://github.com/go-co-op/gocron/releases/tag/v2.10.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.10.0...v2.10.1)

#### What's Changed

- fix validation of variadic parameters when the type is interfaceby [@&#8203;apocelipes](https://github.com/apocelipes) in [#&#8203;757](https://github.com/go-co-op/gocron/pull/757)

#### New Contributors

- [@&#8203;apocelipes](https://github.com/apocelipes) made their first contribution in [#&#8203;757](https://github.com/go-co-op/gocron/pull/757)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.10.0...v2.10.1>

### [`v2.10.0`](https://github.com/go-co-op/gocron/releases/tag/v2.10.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.9.0...v2.10.0)

#### What's Changed

- issue-677: support task creation with variadic args by [@&#8203;Higan](https://github.com/Higan) in [#&#8203;755](https://github.com/go-co-op/gocron/pull/755)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.9.0...v2.10.0>

### [`v2.9.0`](https://github.com/go-co-op/gocron/releases/tag/v2.9.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.8.0...v2.9.0)

#### What's Changed

- issue-751: speed up rescheduling when time scheduling from is time.Zero by [@&#8203;samuelattwood](https://github.com/samuelattwood) in [#&#8203;752](https://github.com/go-co-op/gocron/pull/752)
- feat: add WithIdentifier() as new job option by [@&#8203;pcfreak30](https://github.com/pcfreak30) in [#&#8203;754](https://github.com/go-co-op/gocron/pull/754)

#### New Contributors

- [@&#8203;samuelattwood](https://github.com/samuelattwood) made their first contribution in [#&#8203;752](https://github.com/go-co-op/gocron/pull/752)
- [@&#8203;pcfreak30](https://github.com/pcfreak30) made their first contribution in [#&#8203;754](https://github.com/go-co-op/gocron/pull/754)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.8.0...v2.9.0>

### [`v2.8.0`](https://github.com/go-co-op/gocron/releases/tag/v2.8.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.7.1...v2.8.0)

#### What's Changed

- issue-747: Provide more details of ErrPanicRecovered by [@&#8203;Higan](https://github.com/Higan) in [#&#8203;749](https://github.com/go-co-op/gocron/pull/749)

#### New Contributors

- [@&#8203;Higan](https://github.com/Higan) made their first contribution in [#&#8203;749](https://github.com/go-co-op/gocron/pull/749)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.7.1...v2.8.0>

### [`v2.7.1`](https://github.com/go-co-op/gocron/releases/tag/v2.7.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.7.0...v2.7.1)

#### What's Changed

- issue-740: ascending time function by [@&#8203;rbroggi](https://github.com/rbroggi) in [#&#8203;744](https://github.com/go-co-op/gocron/pull/744)
- fix jobs not starting on scheduler restart when using WithLimitConcurrentJobs by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;745](https://github.com/go-co-op/gocron/pull/745)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.7.0...v2.7.1>

### [`v2.7.0`](https://github.com/go-co-op/gocron/releases/tag/v2.7.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.6.0...v2.7.0)

#### Added

- issue-740: expand oneTimeJob to support multiple times by [@&#8203;rbroggi](https://github.com/rbroggi) in [#&#8203;741](https://github.com/go-co-op/gocron/pull/741)
  - [go doc](https://pkg.go.dev/github.com/go-co-op/gocron/v2#OneTimeJobStartDateTimes)

#### Fixed

- issue-742: bug in `NextRun` by [@&#8203;rbroggi](https://github.com/rbroggi) in [#&#8203;743](https://github.com/go-co-op/gocron/pull/743)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.6.0...v2.7.0>

### [`v2.6.0`](https://github.com/go-co-op/gocron/releases/tag/v2.6.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.5.0...v2.6.0)

#### Added

- after lock error listener by [@&#8203;manuelarte](https://github.com/manuelarte) in [#&#8203;734](https://github.com/go-co-op/gocron/pull/734)
  - [go doc](https://pkg.go.dev/github.com/go-co-op/gocron/v2#AfterLockError)
- Add `AfterJobRunsWithPanic` by [@&#8203;trungdlp-wolffun](https://github.com/trungdlp-wolffun) in [#&#8203;733](https://github.com/go-co-op/gocron/pull/733)
  - [go doc](https://pkg.go.dev/github.com/go-co-op/gocron/v2#AfterJobRunsWithPanic)

#### Fixed

- issue-738: make withSeconds optional in cron-expression by [@&#8203;rbroggi](https://github.com/rbroggi) in [#&#8203;739](https://github.com/go-co-op/gocron/pull/739)
- issue-736: moving validation of one-time to by [@&#8203;rbroggi](https://github.com/rbroggi) in [#&#8203;737](https://github.com/go-co-op/gocron/pull/737)

#### Misc

- Bump golangci/golangci-lint-action from 5.3.0 to 6.0.1 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;730](https://github.com/go-co-op/gocron/pull/730)
- remove circleci config by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;735](https://github.com/go-co-op/gocron/pull/735)

#### New Contributors

- [@&#8203;manuelarte](https://github.com/manuelarte) made their first contribution in [#&#8203;734](https://github.com/go-co-op/gocron/pull/734)
- [@&#8203;trungdlp-wolffun](https://github.com/trungdlp-wolffun) made their first contribution in [#&#8203;733](https://github.com/go-co-op/gocron/pull/733)
- [@&#8203;rbroggi](https://github.com/rbroggi) made their first contribution in [#&#8203;739](https://github.com/go-co-op/gocron/pull/739)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.5.0...v2.6.0>

### [`v2.5.0`](https://github.com/go-co-op/gocron/releases/tag/v2.5.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.4.1...v2.5.0)

#### What's Changed

- adding Job.NextRuns to provide n next run times by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;729](https://github.com/go-co-op/gocron/pull/729)
- Bump golangci/golangci-lint-action from 4.0.0 to 5.3.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;728](https://github.com/go-co-op/gocron/pull/728)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.4.1...v2.5.0>

### [`v2.4.1`](https://github.com/go-co-op/gocron/releases/tag/v2.4.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.4.0...v2.4.1)

#### What's Changed

- fix memory leak with singleton mode where job is sending duplicate reschedule requests by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;723](https://github.com/go-co-op/gocron/pull/723)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.4.0...v2.4.1>

### [`v2.4.0`](https://github.com/go-co-op/gocron/releases/tag/v2.4.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.3.0...v2.4.0)

#### What's Changed

- Added JobsWaitingInQueue in Scheduler by [@&#8203;giri-vsr](https://github.com/giri-vsr) in [#&#8203;721](https://github.com/go-co-op/gocron/pull/721)
- don't trash the incoming slice, match what was done in NewAtTime by [@&#8203;cloudkucooland](https://github.com/cloudkucooland) in [#&#8203;724](https://github.com/go-co-op/gocron/pull/724)

#### New Contributors

- [@&#8203;cloudkucooland](https://github.com/cloudkucooland) made their first contribution in [#&#8203;724](https://github.com/go-co-op/gocron/pull/724)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.3.0...v2.4.0>

### [`v2.3.0`](https://github.com/go-co-op/gocron/releases/tag/v2.3.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.10...v2.3.0)

#### What's Changed

- Add Go 1.22 to test matrix by [@&#8203;evgenymarkov](https://github.com/evgenymarkov) in [#&#8203;714](https://github.com/go-co-op/gocron/pull/714)
- Monitor: IncrementJob in case of skipped job run by [@&#8203;giri-vsr](https://github.com/giri-vsr) in [#&#8203;715](https://github.com/go-co-op/gocron/pull/715)
- fix mocks import path by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;720](https://github.com/go-co-op/gocron/pull/720)

#### New Contributors

- [@&#8203;evgenymarkov](https://github.com/evgenymarkov) made their first contribution in [#&#8203;714](https://github.com/go-co-op/gocron/pull/714)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.10...v2.2.11>

### [`v2.2.10`](https://github.com/go-co-op/gocron/releases/tag/v2.2.10)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.9...v2.2.10)

#### What's Changed

- fix nextRun with singleton mode reporting incorrect time by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;705](https://github.com/go-co-op/gocron/pull/705)
- Added Distributed Locker to JobOptions by [@&#8203;giri-vsr](https://github.com/giri-vsr) in [#&#8203;711](https://github.com/go-co-op/gocron/pull/711)

#### New Contributors

- [@&#8203;giri-vsr](https://github.com/giri-vsr) made their first contribution in [#&#8203;711](https://github.com/go-co-op/gocron/pull/711)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.9...v2.2.10>

### [`v2.2.9`](https://github.com/go-co-op/gocron/releases/tag/v2.2.9)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.8...v2.2.9)

#### What's Changed

- fix case where OneTimeJob with concurrent limit and limited runs fails to run by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;703](https://github.com/go-co-op/gocron/pull/703)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.8...v2.2.9>

### [`v2.2.8`](https://github.com/go-co-op/gocron/releases/tag/v2.2.8)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.7...v2.2.8)

#### What's Changed

- return an error if duration is zero by [@&#8203;moyu-x](https://github.com/moyu-x) in [#&#8203;701](https://github.com/go-co-op/gocron/pull/701)
- properly report lastRun for limit type jobs and RunNow by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;700](https://github.com/go-co-op/gocron/pull/700)

#### New Contributors

- [@&#8203;moyu-x](https://github.com/moyu-x) made their first contribution in [#&#8203;701](https://github.com/go-co-op/gocron/pull/701)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.7...v2.2.8>

### [`v2.2.7`](https://github.com/go-co-op/gocron/releases/tag/v2.2.7)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.6...v2.2.7)

#### What's Changed

- Allow more time for requestJobCtx by [@&#8203;drewgonzales360](https://github.com/drewgonzales360) in [#&#8203;699](https://github.com/go-co-op/gocron/pull/699)
- fix case where job removed causes panic when rescheduling by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;698](https://github.com/go-co-op/gocron/pull/698)

#### New Contributors

- [@&#8203;drewgonzales360](https://github.com/drewgonzales360) made their first contribution in [#&#8203;699](https://github.com/go-co-op/gocron/pull/699)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.6...v2.2.7>

### [`v2.2.6`](https://github.com/go-co-op/gocron/releases/tag/v2.2.6)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.5...v2.2.6)

#### What's Changed

- Bump github.com/stretchr/testify from 1.8.4 to 1.9.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;684](https://github.com/go-co-op/gocron/pull/684)
- elector & locker were failing to send out when not leader by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;688](https://github.com/go-co-op/gocron/pull/688)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.5...v2.2.6>

### [`v2.2.5`](https://github.com/go-co-op/gocron/releases/tag/v2.2.5)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.4...v2.2.5)

#### What's Changed

- remove codecov by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;672](https://github.com/go-co-op/gocron/pull/672)
- Bump golangci/golangci-lint-action from 3.7.0 to 4.0.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;675](https://github.com/go-co-op/gocron/pull/675)
- fix cases where default on send out is resulting in job not going out by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;686](https://github.com/go-co-op/gocron/pull/686)
  - This fixes two bugs related to limit mode and singleton mode having jobs stop running

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.4...v2.2.5>

### [`v2.2.4`](https://github.com/go-co-op/gocron/releases/tag/v2.2.4)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.3...v2.2.4)

#### What's Changed

- correct AfterJobRuns doc by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;670](https://github.com/go-co-op/gocron/pull/670)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.3...v2.2.4>

### [`v2.2.3`](https://github.com/go-co-op/gocron/releases/tag/v2.2.3)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.2...v2.2.3)

#### What's Changed

- fix RunNow() when calling from a job returned by Jobs() by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;668](https://github.com/go-co-op/gocron/pull/668)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.2...v2.2.3>

### [`v2.2.2`](https://github.com/go-co-op/gocron/releases/tag/v2.2.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.1...v2.2.2)

#### What's Changed

- Bump github.com/google/uuid from 1.5.0 to 1.6.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;664](https://github.com/go-co-op/gocron/pull/664)
- fix unsafe map usage in singletonMode by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) & [@&#8203;a3sroot](https://github.com/a3sroot) in [#&#8203;665](https://github.com/go-co-op/gocron/pull/665)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.1...v2.2.2>

### [`v2.2.1`](https://github.com/go-co-op/gocron/releases/tag/v2.2.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.2.0...v2.2.1)

#### What's Changed

- fix monthly jobs when counting days from the end by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;662](https://github.com/go-co-op/gocron/pull/662)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.2.0...v2.2.1>

### [`v2.2.0`](https://github.com/go-co-op/gocron/releases/tag/v2.2.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.1.2...v2.2.0)

#### What's Changed

- wait for new job to be fully created before returning by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;658](https://github.com/go-co-op/gocron/pull/658)
- BETA FEATURE: Add job monitor interface to allow for collecting job metrics by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;659](https://github.com/go-co-op/gocron/pull/659)
  - This is the first release of the monitor feature - it may be changed as initial implementations are created and feedback comes in

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.1.2...v2.2.0>

### [`v2.1.2`](https://github.com/go-co-op/gocron/releases/tag/v2.1.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.1.1...v2.1.2)

#### Fixes

- fix to handle when next ends up in the past by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;650](https://github.com/go-co-op/gocron/pull/650)
- make the order of the returned jobs slice deterministic by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;652](https://github.com/go-co-op/gocron/pull/652)

#### Documentation

- refactor: fix indent by [@&#8203;leedrum](https://github.com/leedrum) in [#&#8203;649](https://github.com/go-co-op/gocron/pull/649)

#### New Contributors

- [@&#8203;leedrum](https://github.com/leedrum) made their first contribution in [#&#8203;649](https://github.com/go-co-op/gocron/pull/649)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.1.1...v2.1.2>

### [`v2.1.1`](https://github.com/go-co-op/gocron/releases/tag/v2.1.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.1.0...v2.1.1)

#### What's Changed

- [bump golang.org/x/exp](https://github.com/go-co-op/gocron/commit/7ee4c50f5785121eb4b5fb37ea79d13334c2143e)
- [fixup Job and Scheduler interface docs](https://github.com/go-co-op/gocron/commit/a51820e30f6657d908f7051ceb92091c4abe6b8e)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.1.0...v2.1.1>

### [`v2.1.0`](https://github.com/go-co-op/gocron/releases/tag/v2.1.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.0.3...v2.1.0)

#### What's Changed

- add new features, OneTimeJob and Job.RunNow() by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;646](https://github.com/go-co-op/gocron/pull/646)

#### Version bumps

- Bump github/codeql-action from 2 to 3 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;644](https://github.com/go-co-op/gocron/pull/644)
- Bump github.com/google/uuid from 1.4.0 to 1.5.0 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;645](https://github.com/go-co-op/gocron/pull/645)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.0.3...v2.1.0>

### [`v2.0.3`](https://github.com/go-co-op/gocron/releases/tag/v2.0.3)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.0.2...v2.0.3)

#### Fixes

- fix weekly and monthly to handle midnight by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;643](https://github.com/go-co-op/gocron/pull/643) [#&#8203;642](https://github.com/go-co-op/gocron/issues/642)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.0.2...v2.0.3>

### [`v2.0.2`](https://github.com/go-co-op/gocron/releases/tag/v2.0.2)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.0.1...v2.0.2)

#### Fixes

- fix: check function param length and type by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;638](https://github.com/go-co-op/gocron/pull/638) raised in [#&#8203;637](https://github.com/go-co-op/gocron/issues/637)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.0.1...v2.0.2>

### [`v2.0.1`](https://github.com/go-co-op/gocron/releases/tag/v2.0.1)

[Compare Source](https://github.com/go-co-op/gocron/compare/v2.0.0...v2.0.1)

#### Fixes

- daily job next logic failed to consider 1 midnight attime by [@&#8203;JohnRoesler](https://github.com/JohnRoesler) in [#&#8203;635](https://github.com/go-co-op/gocron/pull/635)

#### Bumps

- Bump actions/checkout from 3 to 4 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;631](https://github.com/go-co-op/gocron/pull/631)
- Bump actions/setup-go from 4 to 5 by [@&#8203;dependabot](https://github.com/dependabot) in [#&#8203;630](https://github.com/go-co-op/gocron/pull/630)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.0.0...v2.0.1>

### [`v2.0.0`](https://github.com/go-co-op/gocron/releases/tag/v2.0.0)

[Compare Source](https://github.com/go-co-op/gocron/compare/v1.37.0...v2.0.0)

#### v2.0.0

It's here! 🎉  Take a look at the readme and godoc to see how the new version works!

Please give feedback! (Reach out on slack if you're interested in contributing so we can coordinate work 😄 ) And open issues if you find any bugs or have features you'd like to see supported!

#### New Contributors

- [@&#8203;AlphaNecron](https://github.com/AlphaNecron) made their first contribution in [#&#8203;613](https://github.com/go-co-op/gocron/pull/613)

**Full Changelog**: <https://github.com/go-co-op/gocron/compare/v2.0.0-alpha-1...v2.0.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4xMC41IiwidXBkYXRlZEluVmVyIjoiNDMuMjYzLjkiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

---------

Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Reviewed-on: https://gitea.t000-n.de/t.behrendt/realDynDNS/pulls/56
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-08-06 20:00:45 +02:00
renovate-bot b4a5af6a66 chore(deps): update actions (#135)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-08-06 19:19:22 +02:00
t.behrendt 73645305ec ci: pin actions/cache to full semver (#134)
Reviewed-on: #134
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-08-06 19:16:45 +02:00
renovate-bot 9cc422526f chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.43 (#133)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-08-06 18:13:47 +02:00
renovate-bot a7852f99e2 chore(deps): update docker/login-action action to v4.6.0 (#132)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-08-06 06:09:33 +02:00
renovate-bot fe6ab9d7b8 chore(deps): update docker/login-action action to v4.5.2 (#131)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-08-04 15:55:59 +02:00
renovate-bot c182ef48b2 chore(deps): update docker/login-action action to v4.5.1 (#130)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-08-01 06:09:46 +02:00
renovate-bot 7dffcf4ade chore(deps): update docker/login-action action to v4.5.0 (#129)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-30 18:30:06 +02:00
renovate-bot 73a572a135 chore(deps): update actions/setup-go action to v7 (#127)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-28 06:27:42 +02:00
renovate-bot eee7a7b220 chore(deps): update actions/checkout action to v7.0.1 (#128)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-28 06:12:30 +02:00
renovate-bot c1e0bcc975 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.42 (#125)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-19 06:10:35 +02:00
renovate-bot 48270b3ab0 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.41 (#124)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-18 10:40:58 +02:00
renovate-bot 02e325308c chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.40 (#123)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-18 07:08:32 +02:00
renovate-bot 822d3eb935 chore(deps): update gcr.io/distroless/static-debian12 docker digest to 61b7cce (#122)
CD / Create tag (push) Successful in 8s
CD / test (push) Successful in 2m13s
CD / Build and push (amd64) (push) Successful in 1m6s
CD / Build and push (arm64) (push) Successful in 16m18s
CD / Create manifest (push) Successful in 4s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| gcr.io/distroless/static-debian12 | final | digest | `9c346e4` → `61b7cce` |

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yMzMuNCIsInVwZGF0ZWRJblZlciI6IjQzLjIzMy40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: #122
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-15 17:24:11 +02:00
renovate-bot defd6e0568 chore(deps): update actions (#120)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-07 07:17:22 +02:00
renovate-bot 11df211c9f chore(deps): update actions/setup-go action to v6.5.0 (#118)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-07-01 06:26:27 +02:00
renovate-bot 9db1820619 chore(deps): update actions/checkout action to v7 (#114)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-06-25 20:33:35 +02:00
renovate-bot 0676ab1111 chore(deps): update docker/setup-buildx-action action to v4.1.0 (#116)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-06-25 18:07:15 +02:00
t.behrendt 9af980ad1e ci: pin actions to full semver (#115)
Reviewed-on: #115
Co-authored-by: t.behrendt <t.behrendt@t00n.de>
Co-committed-by: t.behrendt <t.behrendt@t00n.de>
2026-06-25 07:50:37 +02:00
renovate-bot 0e1bdd5d76 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.39 (#112)
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-06-21 17:28:49 +02:00
renovate-bot a6f3b06899 chore(deps): update actions/checkout action to v6.0.3 (#111)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/checkout](https://github.com/actions/checkout) | action | patch | `v6.0.2` → `v6.0.3` |

---

### Release Notes

<details>
<summary>actions/checkout (actions/checkout)</summary>

### [`v6.0.3`](https://github.com/actions/checkout/blob/HEAD/CHANGELOG.md#v603)

[Compare Source](https://github.com/actions/checkout/compare/v6.0.2...v6.0.3)

- Fix checkout init for SHA-256 repositories by [@&#8203;yaananth](https://github.com/yaananth) in [#&#8203;2439](https://github.com/actions/checkout/pull/2439)
- fix: expand merge commit SHA regex and add SHA-256 test cases by [@&#8203;yaananth](https://github.com/yaananth) in [#&#8203;2414](https://github.com/actions/checkout/pull/2414)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #111
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-06-13 12:14:19 +02:00
renovate-bot c88424f738 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.35 (#110)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.32` → `0.1.35` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.35`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.34...0.1.35)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.34...0.1.35)

### [`v0.1.34`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.33...0.1.34)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.33...0.1.34)

### [`v0.1.33`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.32...0.1.33)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.32...0.1.33)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #110
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-06-08 19:54:30 +02:00
renovate-bot 2e680b58bf chore(deps): update gcr.io/distroless/static-debian12 docker digest to 9c346e4 (#106)
CD / Create tag (push) Successful in 30s
CD / test (push) Successful in 52s
CD / Build and push (amd64) (push) Successful in 37s
CD / Build and push (arm64) (push) Successful in 12m32s
CD / Create manifest (push) Successful in 59s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| gcr.io/distroless/static-debian12 | final | digest | `20bc6c0` → `9c346e4` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: #106
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-06-01 16:02:47 +02:00
renovate-bot 08fb90c81a chore(deps): update docker/build-push-action action to v7.2.0 (#108)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/build-push-action](https://github.com/docker/build-push-action) | action | minor | `v7.1.0` → `v7.2.0` |

---

### Release Notes

<details>
<summary>docker/build-push-action (docker/build-push-action)</summary>

### [`v7.2.0`](https://github.com/docker/build-push-action/releases/tag/v7.2.0)

[Compare Source](https://github.com/docker/build-push-action/compare/v7.1.0...v7.2.0)

- Bump [@&#8203;actions/core](https://github.com/actions/core) from 3.0.0 to 3.0.1 in [#&#8203;1525](https://github.com/docker/build-push-action/pull/1525)
- Bump [@&#8203;docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.87.0 to 0.90.0 in [#&#8203;1517](https://github.com/docker/build-push-action/pull/1517)
- Bump brace-expansion from 2.0.2 to 5.0.6 in [#&#8203;1534](https://github.com/docker/build-push-action/pull/1534)
- Bump fast-xml-builder from 1.1.4 to 1.2.0 in [#&#8203;1529](https://github.com/docker/build-push-action/pull/1529)
- Bump fast-xml-parser from 5.5.7 to 5.8.0 in [#&#8203;1521](https://github.com/docker/build-push-action/pull/1521)
- Bump postcss from 8.5.6 to 8.5.10 in [#&#8203;1526](https://github.com/docker/build-push-action/pull/1526)
- Bump tar from 6.2.1 to 7.5.15 in [#&#8203;1533](https://github.com/docker/build-push-action/pull/1533)

**Full Changelog**: <https://github.com/docker/build-push-action/compare/v7.1.0...v7.2.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #108
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-05-31 13:19:01 +02:00
renovate-bot 2efd157374 chore(deps): update docker/login-action action to v4.2.0 (#109)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/login-action](https://github.com/docker/login-action) | action | minor | `v4.1.0` → `v4.2.0` |

---

### Release Notes

<details>
<summary>docker/login-action (docker/login-action)</summary>

### [`v4.2.0`](https://github.com/docker/login-action/releases/tag/v4.2.0)

[Compare Source](https://github.com/docker/login-action/compare/v4.1.0...v4.2.0)

- Bump [@&#8203;actions/core](https://github.com/actions/core) from 3.0.0 to 3.0.1 in [#&#8203;976](https://github.com/docker/login-action/pull/976)
- Bump [@&#8203;aws-sdk/client-ecr](https://github.com/aws-sdk/client-ecr) and [@&#8203;aws-sdk/client-ecr-public](https://github.com/aws-sdk/client-ecr-public) to 3.1050.0 in [#&#8203;960](https://github.com/docker/login-action/pull/960)
- Bump [@&#8203;docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.86.0 to 0.90.0 in [#&#8203;970](https://github.com/docker/login-action/pull/970)
- Bump brace-expansion from 2.0.1 to 5.0.6 in [#&#8203;993](https://github.com/docker/login-action/pull/993)
- Bump fast-xml-builder from 1.1.4 to 1.2.0 in [#&#8203;985](https://github.com/docker/login-action/pull/985)
- Bump fast-xml-parser from 5.3.6 to 5.8.0 in [#&#8203;963](https://github.com/docker/login-action/pull/963)
- Bump http-proxy-agent and https-proxy-agent to 9.0.0 in [#&#8203;961](https://github.com/docker/login-action/pull/961)
- Bump postcss from 8.5.6 to 8.5.10 in [#&#8203;979](https://github.com/docker/login-action/pull/979)
- Bump tar from 6.2.1 to 7.5.15 in [#&#8203;991](https://github.com/docker/login-action/pull/991)
- Bump vite from 7.3.1 to 7.3.3 in [#&#8203;986](https://github.com/docker/login-action/pull/986)

**Full Changelog**: <https://github.com/docker/login-action/compare/v4.1.0...v4.2.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #109
Reviewed-by: t.behrendt <2+t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-05-31 13:18:56 +02:00
renovate-bot 2ad3369e07 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.32 (#105)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.31` → `0.1.32` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.32`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.31...0.1.32)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.31...0.1.32)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #105
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-28 17:02:00 +02:00
renovate-bot a0e7cffb88 chore(deps): update docker/build-push-action action to v7.1.0 (#104)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/build-push-action](https://github.com/docker/build-push-action) | action | minor | `v7.0.0` → `v7.1.0` |

---

### Release Notes

<details>
<summary>docker/build-push-action (docker/build-push-action)</summary>

### [`v7.1.0`](https://github.com/docker/build-push-action/releases/tag/v7.1.0)

[Compare Source](https://github.com/docker/build-push-action/compare/v7.0.0...v7.1.0)

- Git context [query format](https://docs.docker.com/build/concepts/context/#url-queries) support by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1505](https://github.com/docker/build-push-action/pull/1505)
- Bump [@&#8203;docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.79.0 to 0.87.0 by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1505](https://github.com/docker/build-push-action/pull/1505)
- Bump brace-expansion from 1.1.12 to 1.1.13 in [#&#8203;1500](https://github.com/docker/build-push-action/pull/1500)
- Bump fast-xml-parser from 5.4.2 to 5.5.7 in [#&#8203;1489](https://github.com/docker/build-push-action/pull/1489)
- Bump flatted from 3.3.3 to 3.4.2 in [#&#8203;1491](https://github.com/docker/build-push-action/pull/1491)
- Bump glob from 10.3.12 to 10.5.0 in [#&#8203;1490](https://github.com/docker/build-push-action/pull/1490)
- Bump handlebars from 4.7.8 to 4.7.9 in [#&#8203;1497](https://github.com/docker/build-push-action/pull/1497)
- Bump lodash from 4.17.23 to 4.18.1 in [#&#8203;1510](https://github.com/docker/build-push-action/pull/1510)
- Bump picomatch from 4.0.3 to 4.0.4 in [#&#8203;1496](https://github.com/docker/build-push-action/pull/1496)
- Bump undici from 6.23.0 to 6.24.1 in [#&#8203;1486](https://github.com/docker/build-push-action/pull/1486)
- Bump vite from 7.3.1 to 7.3.2 in [#&#8203;1509](https://github.com/docker/build-push-action/pull/1509)

**Full Changelog**: <https://github.com/docker/build-push-action/compare/v7.0.0...v7.1.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #104
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-20 08:51:17 +02:00
renovate-bot 7c77de8af0 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.31 (#103)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.30` → `0.1.31` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.31`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.30...0.1.31)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.30...0.1.31)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #103
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-20 08:48:42 +02:00
renovate-bot f6816eaeb8 chore(deps): update actions/setup-go digest to 4a36011 (#99)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-go](https://github.com/actions/setup-go) ([changelog](https://github.com/actions/setup-go/compare/4b73464bb391d4059bd26b0524d20df3927bd417..4a3601121dd01d1626a1e23e37211e3254c1c06c)) | action | digest | `4b73464` → `4a36011` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #99
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-16 19:30:17 +02:00
renovate-bot 1618de4c7a chore(deps): update actions/cache digest to 27d5ce7 (#97)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://github.com/actions/cache) ([changelog](https://github.com/actions/cache/compare/cdf6c1fa76f9f475f3d7449005a359c84ca0f306..27d5ce7f107fe9357f9df03efb73ab90386fccae)) | action | digest | `cdf6c1f` → `27d5ce7` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #97
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-16 19:30:09 +02:00
renovate-bot a805e4c5e2 chore(deps): update docker.io/library/golang:1.25-alpine docker digest to 04d017a (#100)
CD / Create tag (push) Successful in 16s
CD / test (push) Successful in 54s
CD / Build and push (amd64) (push) Successful in 38s
CD / Build and push (arm64) (push) Successful in 3m38s
CD / Create manifest (push) Successful in 8s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker.io/library/golang](https://hub.docker.com/_/golang) ([source](https://github.com/docker-library/golang)) | stage | digest | `8e02eb3` → `04d017a` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: #100
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-16 19:17:05 +02:00
renovate-bot 10bf551f32 chore(deps): update docker/login-action action to v4.1.0 (#101)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/login-action](https://github.com/docker/login-action) | action | minor | `v4.0.0` → `v4.1.0` |

---

### Release Notes

<details>
<summary>docker/login-action (docker/login-action)</summary>

### [`v4.1.0`](https://github.com/docker/login-action/releases/tag/v4.1.0)

[Compare Source](https://github.com/docker/login-action/compare/v4.0.0...v4.1.0)

- Fix scoped Docker Hub cleanup path when registry is omitted by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;945](https://github.com/docker/login-action/pull/945)
- Bump [@&#8203;aws-sdk/client-ecr](https://github.com/aws-sdk/client-ecr) and [@&#8203;aws-sdk/client-ecr-public](https://github.com/aws-sdk/client-ecr-public) to 3.1020.0 in [#&#8203;930](https://github.com/docker/login-action/pull/930)
- Bump [@&#8203;docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.77.0 to 0.86.0 in [#&#8203;932](https://github.com/docker/login-action/pull/932) [#&#8203;936](https://github.com/docker/login-action/pull/936)
- Bump brace-expansion from 1.1.12 to 1.1.13 in [#&#8203;952](https://github.com/docker/login-action/pull/952)
- Bump fast-xml-parser from 5.3.4 to 5.3.6 in [#&#8203;942](https://github.com/docker/login-action/pull/942)
- Bump flatted from 3.3.3 to 3.4.2 in [#&#8203;944](https://github.com/docker/login-action/pull/944)
- Bump glob from 10.3.12 to 10.5.0 in [#&#8203;940](https://github.com/docker/login-action/pull/940)
- Bump handlebars from 4.7.8 to 4.7.9 in [#&#8203;949](https://github.com/docker/login-action/pull/949)
- Bump http-proxy-agent and https-proxy-agent to 8.0.0 in [#&#8203;937](https://github.com/docker/login-action/pull/937)
- Bump lodash from 4.17.23 to 4.18.1 in [#&#8203;958](https://github.com/docker/login-action/pull/958)
- Bump minimatch from 3.1.2 to 3.1.5 in [#&#8203;941](https://github.com/docker/login-action/pull/941)
- Bump picomatch from 4.0.3 to 4.0.4 in [#&#8203;948](https://github.com/docker/login-action/pull/948)
- Bump undici from 6.23.0 to 6.24.1 in [#&#8203;938](https://github.com/docker/login-action/pull/938)

**Full Changelog**: <https://github.com/docker/login-action/compare/v4.0.0...v4.1.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #101
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-04-11 10:32:47 +02:00
renovate-bot 0b80f77d83 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.30 (#98)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.29` → `0.1.30` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.30`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.29...0.1.30)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.29...0.1.30)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #98
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-26 21:37:28 +01:00
renovate-bot fca2f44f14 chore(deps): update docker.io/library/golang:1.25-alpine docker digest to 8e02eb3 (#93)
CD / test (push) Successful in 55s
CD / Create tag (push) Successful in 1m5s
CD / Build and push (amd64) (push) Successful in 1m13s
CD / Build and push (arm64) (push) Successful in 6m8s
CD / Create manifest (push) Successful in 23s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker.io/library/golang](https://hub.docker.com/_/golang) ([source](https://github.com/docker-library/golang)) | stage | digest | `f6751d8` → `8e02eb3` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: #93
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 22:20:24 +01:00
renovate-bot 07f6ace85e chore(deps): update actions/setup-go digest to 4b73464 (#92)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-go](https://github.com/actions/setup-go) ([changelog](https://github.com/actions/setup-go/compare/7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5..4b73464bb391d4059bd26b0524d20df3927bd417)) | action | digest | `7a3fe6c` → `4b73464` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #92
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 22:20:13 +01:00
renovate-bot 5131331242 chore(deps): update docker/build-push-action action to v7 (#94)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/build-push-action](https://github.com/docker/build-push-action) | action | major | `v6.19.2` → `v7.0.0` |

---

### Release Notes

<details>
<summary>docker/build-push-action (docker/build-push-action)</summary>

### [`v7.0.0`](https://github.com/docker/build-push-action/releases/tag/v7.0.0)

[Compare Source](https://github.com/docker/build-push-action/compare/v6.19.2...v7.0.0)

- Node 24 as default runtime (requires [Actions Runner v2.327.1](https://github.com/actions/runner/releases/tag/v2.327.1) or later) by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1470](https://github.com/docker/build-push-action/pull/1470)
- Remove deprecated `DOCKER_BUILD_NO_SUMMARY` and `DOCKER_BUILD_EXPORT_RETENTION_DAYS` envs by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1473](https://github.com/docker/build-push-action/pull/1473)
- Remove legacy export-build tool support for build summary by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1474](https://github.com/docker/build-push-action/pull/1474)
- Switch to ESM and update config/test wiring by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1466](https://github.com/docker/build-push-action/pull/1466)
- Bump [@&#8203;actions/core](https://github.com/actions/core) from 1.11.1 to 3.0.0 in [#&#8203;1454](https://github.com/docker/build-push-action/pull/1454)
- Bump [@&#8203;docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.62.1 to 0.79.0 in [#&#8203;1453](https://github.com/docker/build-push-action/pull/1453) [#&#8203;1472](https://github.com/docker/build-push-action/pull/1472) [#&#8203;1479](https://github.com/docker/build-push-action/pull/1479)
- Bump minimatch from 3.1.2 to 3.1.5 in [#&#8203;1463](https://github.com/docker/build-push-action/pull/1463)

**Full Changelog**: <https://github.com/docker/build-push-action/compare/v6.19.2...v7.0.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #94
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 22:17:02 +01:00
renovate-bot 696215c3cf chore(deps): update docker/setup-buildx-action action to v4 (#96)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) | action | major | `v3` → `v4` |

---

### Release Notes

<details>
<summary>docker/setup-buildx-action (docker/setup-buildx-action)</summary>

### [`v4`](https://github.com/docker/setup-buildx-action/compare/v3...v4)

[Compare Source](https://github.com/docker/setup-buildx-action/compare/v3...v4)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #96
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 22:16:56 +01:00
renovate-bot 43192da152 chore(deps): update docker/login-action action to v4 (#95)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/login-action](https://github.com/docker/login-action) | action | major | `v3.7.0` → `v4.0.0` |

---

### Release Notes

<details>
<summary>docker/login-action (docker/login-action)</summary>

### [`v4.0.0`](https://github.com/docker/login-action/releases/tag/v4.0.0)

[Compare Source](https://github.com/docker/login-action/compare/v3.7.0...v4.0.0)

- Node 24 as default runtime (requires [Actions Runner v2.327.1](https://github.com/actions/runner/releases/tag/v2.327.1) or later) by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;929](https://github.com/docker/login-action/pull/929)
- Switch to ESM and update config/test wiring by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;927](https://github.com/docker/login-action/pull/927)
- Bump [@&#8203;actions/core](https://github.com/actions/core) from 1.11.1 to 3.0.0 in [#&#8203;919](https://github.com/docker/login-action/pull/919)
- Bump [@&#8203;aws-sdk/client-ecr](https://github.com/aws-sdk/client-ecr) from 3.890.0 to 3.1000.0 in [#&#8203;909](https://github.com/docker/login-action/pull/909) [#&#8203;920](https://github.com/docker/login-action/pull/920)
- Bump [@&#8203;aws-sdk/client-ecr-public](https://github.com/aws-sdk/client-ecr-public) from 3.890.0 to 3.1000.0 in [#&#8203;909](https://github.com/docker/login-action/pull/909) [#&#8203;920](https://github.com/docker/login-action/pull/920)
- Bump [@&#8203;docker/actions-toolkit](https://github.com/docker/actions-toolkit) from 0.63.0 to 0.77.0 in [#&#8203;910](https://github.com/docker/login-action/pull/910) [#&#8203;928](https://github.com/docker/login-action/pull/928)
- Bump [@&#8203;isaacs/brace-expansion](https://github.com/isaacs/brace-expansion) from 5.0.0 to 5.0.1 in [#&#8203;921](https://github.com/docker/login-action/pull/921)
- Bump js-yaml from 4.1.0 to 4.1.1 in [#&#8203;901](https://github.com/docker/login-action/pull/901)

**Full Changelog**: <https://github.com/docker/login-action/compare/v3.7.0...v4.0.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #95
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-03-15 22:14:44 +01:00
renovate-bot 74e6e06887 chore(deps): update docker.io/library/golang:1.25-alpine docker digest to f6751d8 (#90)
CD / test (push) Successful in 9s
CD / Create tag (push) Successful in 11s
CD / Build and push (amd64) (push) Successful in 21s
CD / Build and push (arm64) (push) Successful in 2m32s
CD / Create manifest (push) Successful in 1m28s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker.io/library/golang](https://hub.docker.com/_/golang) ([source](https://github.com/docker-library/golang)) | stage | digest | `2611181` → `f6751d8` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Reviewed-on: #90
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-20 21:31:43 +01:00
renovate-bot e497eb67a2 chore(deps): update gcr.io/distroless/static-debian12 docker digest to 20bc6c0 (#76)
CD / Create tag (push) Successful in 12s
CD / test (push) Successful in 28s
CD / Build and push (amd64) (push) Successful in 21s
CD / Build and push (arm64) (push) Successful in 2m6s
CD / Create manifest (push) Successful in 21s
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| gcr.io/distroless/static-debian12 | final | digest | `4b2a093` → `20bc6c0` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43MS4wIiwidXBkYXRlZEluVmVyIjoiNDMuNS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Reviewed-on: #76
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-20 21:28:22 +01:00
renovate-bot 8f336a10e5 chore(deps): update docker/build-push-action action to v6.19.2 (#87)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/build-push-action](https://github.com/docker/build-push-action) | action | minor | `v6.18.0` → `v6.19.2` |

---

### Release Notes

<details>
<summary>docker/build-push-action (docker/build-push-action)</summary>

### [`v6.19.2`](https://github.com/docker/build-push-action/releases/tag/v6.19.2)

[Compare Source](https://github.com/docker/build-push-action/compare/v6.19.1...v6.19.2)

- Preserve port in `GIT_AUTH_TOKEN` host by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1458](https://github.com/docker/build-push-action/pull/1458)

**Full Changelog**: <https://github.com/docker/build-push-action/compare/v6.19.1...v6.19.2>

### [`v6.19.1`](https://github.com/docker/build-push-action/releases/tag/v6.19.1)

[Compare Source](https://github.com/docker/build-push-action/compare/v6.19.0...v6.19.1)

- Derive `GIT_AUTH_TOKEN` host from GitHub server URL by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1456](https://github.com/docker/build-push-action/pull/1456)

**Full Changelog**: <https://github.com/docker/build-push-action/compare/v6.19.0...v6.19.1>

### [`v6.19.0`](https://github.com/docker/build-push-action/releases/tag/v6.19.0)

[Compare Source](https://github.com/docker/build-push-action/compare/v6.18.0...v6.19.0)

- Scope default git auth token to `github.com` by [@&#8203;crazy-max](https://github.com/crazy-max) in [#&#8203;1451](https://github.com/docker/build-push-action/pull/1451)
- Bump brace-expansion from 1.1.11 to 1.1.12 in [#&#8203;1396](https://github.com/docker/build-push-action/pull/1396)
- Bump form-data from 2.5.1 to 2.5.5 in [#&#8203;1391](https://github.com/docker/build-push-action/pull/1391)
- Bump js-yaml from 3.14.1 to 3.14.2 in [#&#8203;1429](https://github.com/docker/build-push-action/pull/1429)
- Bump lodash from 4.17.21 to 4.17.23 in [#&#8203;1446](https://github.com/docker/build-push-action/pull/1446)
- Bump tmp from 0.2.3 to 0.2.4 in [#&#8203;1398](https://github.com/docker/build-push-action/pull/1398)
- Bump undici from 5.28.4 to 5.29.0 in [#&#8203;1397](https://github.com/docker/build-push-action/pull/1397)

**Full Changelog**: <https://github.com/docker/build-push-action/compare/v6.18.0...v6.19.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #87
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-20 21:28:02 +01:00
renovate-bot 525d85728e chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.29 (#91)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.26` → `0.1.29` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.29`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.28...0.1.29)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.28...0.1.29)

### [`v0.1.28`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.27...0.1.28)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.27...0.1.28)

### [`v0.1.27`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.26...0.1.27)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.26...0.1.27)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41LjQiLCJ1cGRhdGVkSW5WZXIiOiI0My41LjQiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImFjdGlvbiIsImRlcHMiXX0=-->

Reviewed-on: #91
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-20 21:17:46 +01:00
t.behrendt 8df7711b39 chore: add fully qualified docker image name (#89)
CD / Create tag (push) Successful in 26s
CD / test (push) Successful in 52s
CD / Build and push (amd64) (push) Successful in 22s
CD / Build and push (arm64) (push) Successful in 4m10s
CD / Create manifest (push) Successful in 31s
Reviewed-on: #89
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-02-19 18:48:27 +01:00
renovate-bot e39a6f0c23 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.26 (#84)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.24` → `0.1.26` | `0.1.27` |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.26`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.25...0.1.26)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.25...0.1.26)

### [`v0.1.25`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.24...0.1.25)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.24...0.1.25)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJhY3Rpb24iLCJkZXBzIl19-->

Reviewed-on: #84
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-18 19:48:43 +01:00
t.behrendt d40f004f5b ci: pin various actions to a proper semver version (#86)
Reviewed-on: #86
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-02-14 19:14:11 +01:00
renovate-bot 7d9e3bf6e2 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.24 (#83)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.23` → `0.1.24` | `0.1.26` (+1) |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.24`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.23...0.1.24)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.23...0.1.24)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4xIiwidXBkYXRlZEluVmVyIjoiNDIuOTUuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #83
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-07 18:30:17 +01:00
renovate-bot 613f192294 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.23 (#81)
This PR contains the following updates:

| Package | Type | Update | Change | Pending |
|---|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.22` → `0.1.23` | `0.1.25` (+1) |

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.23`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.22...0.1.23)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.22...0.1.23)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Mi40IiwidXBkYXRlZEluVmVyIjoiNDIuOTIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #81
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-02-03 16:07:58 +01:00
renovate-bot b2cfaa9885 chore(deps): update actions/cache digest to cdf6c1f (#80)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://github.com/actions/cache) ([changelog](https://github.com/actions/cache/compare/8b402f58fbc84540c8b491a91e594a4576fec3d7..cdf6c1fa76f9f475f3d7449005a359c84ca0f306)) | action | digest | `8b402f5` → `cdf6c1f` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44NS41IiwidXBkYXRlZEluVmVyIjoiNDIuODUuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #80
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-30 09:55:55 +01:00
renovate-bot 41ab5af905 chore(deps): update docker/login-action digest to c94ce9f (#79)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [docker/login-action](https://github.com/docker/login-action) ([changelog](https://github.com/docker/login-action/compare/5e57cd118135c172c3672efd75eb46360885c0ef..c94ce9fb468520275223c153574b00df6fe4bcc9)) | action | digest | `5e57cd1` → `c94ce9f` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi44NS41IiwidXBkYXRlZEluVmVyIjoiNDIuODUuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #79
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-30 09:48:10 +01:00
renovate-bot 7f65b3e2fc chore(deps): update actions/setup-go digest to 7a3fe6c (#77)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/setup-go](https://github.com/actions/setup-go) ([changelog](https://github.com/actions/setup-go/compare/4dc6199c7b1a012772edbd06daecab0f50c9053c..7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5)) | action | digest | `4dc6199` → `7a3fe6c` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43MS4wIiwidXBkYXRlZEluVmVyIjoiNDIuODQuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #77
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-26 13:55:57 +01:00
renovate-bot a66788839c chore(deps): update actions/cache digest to 8b402f5 (#78)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [actions/cache](https://github.com/actions/cache) ([changelog](https://github.com/actions/cache/compare/9255dc7a253b0ccc959486e2bca901246202afeb..8b402f58fbc84540c8b491a91e594a4576fec3d7)) | action | digest | `9255dc7` → `8b402f5` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43NC41IiwidXBkYXRlZEluVmVyIjoiNDIuODQuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #78
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-26 13:50:15 +01:00
t.behrendt 603ca25093 chore: update test tooling (#75)
CD / Create tag (push) Successful in 12s
CD / test (push) Successful in 50s
CD / Build and push (amd64) (push) Successful in 37s
CD / Build and push (arm64) (push) Successful in 2m8s
CD / Create manifest (push) Successful in 7s
Reviewed-on: #75
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-01-10 21:42:49 +01:00
t.behrendt 485d5b6f22 Revert "choreL: update test tooling (#72)" (#74)
CD / Create tag (push) Successful in 5s
CD / test (push) Successful in 1m43s
CD / Build and push (amd64) (push) Successful in 37s
CD / Build and push (arm64) (push) Successful in 2m11s
CD / Create manifest (push) Successful in 7s
This reverts commit 2bfb4419d3.

Reviewed-on: #74
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-01-10 21:25:12 +01:00
t.behrendt 2bfb4419d3 choreL: update test tooling (#72)
CD / Create tag (push) Successful in 5s
CD / test (push) Failing after 3m2s
CD / Build and push (amd64) (push) Has been skipped
CD / Build and push (arm64) (push) Has been skipped
CD / Create manifest (push) Has been skipped
Reviewed-on: #72
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-01-10 21:18:09 +01:00
t.behrendt ac73cf14eb refactor: to use ionosDnsClient (#71)
CD / Create tag (push) Successful in 14s
CD / test (push) Successful in 32s
CD / Build and push (amd64) (push) Successful in 43s
CD / Build and push (arm64) (push) Successful in 2m23s
CD / Create manifest (push) Successful in 34s
Reviewed-on: #71
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2026-01-10 21:00:43 +01:00
renovate-bot 15431166e0 chore(deps): update https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment action to v0.1.22 (#68)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment) | action | patch | `0.1.20` → `0.1.22` |

---

> ⚠️ **Warning**
>
> Some dependencies could not be looked up. Check the Dependency Dashboard for more information.

---

### Release Notes

<details>
<summary>t.behrendt/conventional-semantic-git-tag-increment (https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment)</summary>

### [`v0.1.22`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.21...0.1.22)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.21...0.1.22)

### [`v0.1.21`](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.20...0.1.21)

[Compare Source](https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment/compare/0.1.20...0.1.21)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi42OS4yIiwidXBkYXRlZEluVmVyIjoiNDIuNjkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiYWN0aW9uIiwiZGVwcyJdfQ==-->

Reviewed-on: #68
Reviewed-by: t.behrendt <t.behrendt@noreply.localhost>
Co-authored-by: Renovate Bot <renovate@t00n.de>
Co-committed-by: Renovate Bot <renovate@t00n.de>
2026-01-08 19:25:18 +01:00
14 changed files with 1712 additions and 691 deletions
+15 -13
View File
@@ -19,12 +19,14 @@ env:
jobs:
test:
name: test
runs-on: ubuntu-latest
runs-on:
- ubuntu-latest
- linux_amd64
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Setup go
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: go.mod
check-latest: true
@@ -37,7 +39,7 @@ jobs:
go.sum
- name: cache go
id: cache-go
uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0
with:
path: |
/go_path
@@ -54,7 +56,7 @@ jobs:
name: Build and push
strategy:
matrix:
arch: [amd64, arm64]
arch: [ amd64, arm64 ]
needs:
- test
runs-on:
@@ -62,11 +64,11 @@ jobs:
- linux_${{ matrix.arch }}
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
- name: Login to Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
@@ -77,7 +79,7 @@ jobs:
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}' | tr '[:upper:]' '[:lower:]') >> $GITHUB_OUTPUT
echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
- name: Build and push
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
with:
context: .
file: ./Dockerfile
@@ -94,10 +96,10 @@ jobs:
outputs:
tag: ${{ steps.tag.outputs.new-tag }}
steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
- uses: https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment@0.1.20
- uses: https://gitea.t000-n.de/t.behrendt/conventional-semantic-git-tag-increment@a4f52386bae401ac7a1b20d5706b861a66b833ca # 0.1.44
id: tag
with:
token: ${{ secrets.GITEA_TOKEN }}
@@ -117,7 +119,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Get Metadata
id: meta
@@ -126,7 +128,7 @@ jobs:
echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
- name: Login to Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3
uses: docker/login-action@dbcb813823bdd20940b903addbd779551569679f # v4.6.0
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
+13 -4
View File
@@ -10,12 +10,14 @@ env:
jobs:
test:
name: test
runs-on: ubuntu-latest
runs-on:
- ubuntu-latest
- linux_amd64
steps:
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Setup go
uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6
uses: actions/setup-go@b7ad1dad31e06c5925ef5d2fc7ad053ef454303e # v7.0.0
with:
go-version-file: go.mod
check-latest: true
@@ -28,7 +30,7 @@ jobs:
go.sum
- name: cache go
id: cache-go
uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5
uses: actions/cache@caa296126883cff596d87d8935842f9db880ef25 # v5.1.0
with:
path: |
/go_path
@@ -42,3 +44,10 @@ jobs:
run: make test
- name: check:format
run: make check-format
- name: Upload test-coverage
uses: ChristopherHX/gitea-upload-artifact@v4
with:
name: realdnydns-test-coverage
path: |
lcov.info
retention-days: 1
+2
View File
@@ -23,3 +23,5 @@ go.work
.vscode
config.yaml
lcov.info
realdnydns
+2 -2
View File
@@ -1,4 +1,4 @@
FROM golang:1.25-alpine@sha256:26111811bc967321e7b6f852e914d14bede324cd1accb7f81811929a6a57fea9 as build
FROM docker.io/library/golang:1.25-alpine@sha256:04d017a27c481185c169884328a5761d052910fdced8c3b8edd686474efdf59b as build
ARG GOARCH=amd64
@@ -9,6 +9,6 @@ COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=${GOARCH} \
go build -trimpath -ldflags="-s -w" -o main .
FROM gcr.io/distroless/static-debian12@sha256:4b2a093ef4649bccd586625090a3c668b254cfe180dee54f4c94f3e9bd7e381e
FROM gcr.io/distroless/static-debian12@sha256:61b7ccecebc7c474a531717de80a94709d20547cdcdaf740c25876f2a8e38b44
COPY --from=build /app/main /
CMD ["/main"]
+10 -2
View File
@@ -1,11 +1,19 @@
test:
test: test-unit test-race test-coverage
test-unit:
go test ./pkg/... -coverprofile=coverage.out
test-race:
go test ./pkg/... -race
test-coverage:
go tool gcov2lcov -infile coverage.out > lcov.info
build:
go build
lint:
golint ./...
go tool golint ./...
run:
make build
+4
View File
@@ -8,6 +8,10 @@ dns_provider:
config:
api_key: <your-api-key>
base_url: https://api.hosting.ionos.com/dns
# Optional: default TTL to use when patching records with missing TTL (default: 300)
# default_ttl: 300
# Optional: default priority to use when patching records with missing priority (default: 0)
# default_prio: 0
notification_provider:
type: gotify
config:
+14 -4
View File
@@ -3,14 +3,24 @@ module realdnydns
go 1.25.0
require (
github.com/go-co-op/gocron v1.37.0
github.com/go-co-op/gocron/v2 v2.19.0
gitea.t000-n.de/t.behrendt/ionosDnsClient v1.0.2
github.com/go-co-op/gocron/v2 v2.22.0
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/jandelgado/gcov2lcov v1.1.1 // indirect
github.com/jonboulle/clockwork v0.5.0 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/oapi-codegen/runtime v1.1.1 // indirect
github.com/robfig/cron/v3 v3.0.1 // indirect
github.com/stretchr/testify v1.11.1 // indirect
go.uber.org/atomic v1.11.0 // indirect
golang.org/x/lint v0.0.0-20241112194109-818c5a804067 // indirect
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 // indirect
)
tool (
github.com/jandelgado/gcov2lcov
golang.org/x/lint/golint
)
+40 -22
View File
@@ -1,48 +1,66 @@
gitea.t000-n.de/t.behrendt/ionosDnsClient v1.0.2 h1:EWz4kLLv7lSZx/F8K0/WxN5xeVNh7z4qbeDurZYBcNk=
gitea.t000-n.de/t.behrendt/ionosDnsClient v1.0.2/go.mod h1:HZfdMF7X9LK/3FP1jJVzMWbM5BcgcZg/Qwx2WClFipg=
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0=
github.com/go-co-op/gocron v1.37.0/go.mod h1:3L/n6BkO7ABj+TrfSVXLRzsP26zmikL4ISkLQ0O8iNY=
github.com/go-co-op/gocron/v2 v2.18.0/go.mod h1:Zii6he+Zfgy5W9B+JKk/KwejFOW0kZTFvHtwIpR4aBI=
github.com/go-co-op/gocron/v2 v2.19.0/go.mod h1:5lEiCKk1oVJV39Zg7/YG10OnaVrDAV5GGR6O0663k6U=
github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/go-co-op/gocron/v2 v2.22.0 h1:uEuH2F7k7VoESb1BYSaffuuV+T0kkpzsC0aXk7/z79I=
github.com/go-co-op/gocron/v2 v2.22.0/go.mod h1:hiH/U9RMhTi1BBZJmef9s3KC9QwhpBF6PFrvUKaXY9M=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/jandelgado/gcov2lcov v1.1.1 h1:CHUNoAglvb34DqmMoZchnzDbA3yjpzT8EoUvVqcAY+s=
github.com/jandelgado/gcov2lcov v1.1.1/go.mod h1:tMVUlMVtS1po2SB8UkADWhOT5Y5Q13XOce2AYU69JuI=
github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I=
github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60=
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/lint v0.0.0-20241112194109-818c5a804067 h1:adDmSQyFTCiv19j015EGKJBoaa7ElV0Q1Wovb/4G7NA=
golang.org/x/lint v0.0.0-20241112194109-818c5a804067/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+8 -2
View File
@@ -128,8 +128,14 @@ func main() {
panic(err)
}
logger.Info("Next run:", slog.String("time", job.NextRun().String()))
schedule.StartBlocking()
nextRun, err := job.NextRun()
if err != nil {
logger.Error("Failed to get next run", slog.String("error", err.Error()))
panic(err)
}
logger.Info("Next run:", slog.String("time", nextRun.String()))
defer schedule.Shutdown()
schedule.Start()
case config.RunOnceMode:
logger.Info("Running in run once mode")
-224
View File
@@ -1,224 +0,0 @@
package ionosAPI
import (
"bytes"
"encoding/json"
"errors"
"io"
"net"
"net/http"
"net/url"
"realdnydns/model/common"
)
/**
* Docs: https://developer.hosting.ionos.com/docs/dns
*/
type IonosAPI interface {
GetARecord(tld string, subdomain string) (*common.ARecord, error)
SetARecord(tld string, subdomain string, ip net.IP, ttl int, prio int, disabled bool) (*common.ARecord, error)
GetZoneId(tld string) (string, error)
GetRecordId(zoneId string, tld string, subdomain string, recordType string) (string, error)
HttpCall(method string, url string, body io.Reader, queryParams map[string]string) (*http.Response, error)
}
type IonosAPIImpl struct {
APIKey string
BaseURL string
HTTPClient *http.Client
}
type ZonesResponse []struct {
Name string `json:"name"`
Id string `json:"id"`
Type string `json:"type"`
}
type ZoneResponse struct {
Id string `json:"id"`
Name string `json:"name"`
Type string `json:"type"`
Records []RecordResponse `json:"records"`
}
type RecordResponse struct {
Id string `json:"id"`
Name string `json:"name"`
RootName string `json:"rootName"`
Type string `json:"type"`
Content string `json:"content"`
ChangeDate string `json:"changeDate"`
TTL int `json:"ttl"`
Prio int `json:"prio"`
Disabled bool `json:"disabled"`
}
type ChangeRecord struct {
Name string `json:"name"`
Type string `json:"type"`
Content string `json:"content"`
TTL int `json:"ttl"`
Prio int `json:"prio"`
Disabled bool `json:"disabled"`
}
type ChangeRecordRequest struct {
Content string `json:"content"`
TTL int `json:"ttl"`
Prio int `json:"prio"`
Disabled bool `json:"disabled"`
}
func New(APIKey string, BaseURL string) IonosAPI {
return &IonosAPIImpl{
APIKey: APIKey,
BaseURL: BaseURL,
HTTPClient: &http.Client{},
}
}
func (i *IonosAPIImpl) HttpCall(method string, path string, body io.Reader, queryParams map[string]string) (*http.Response, error) {
requestUrl, _ := url.Parse(i.BaseURL + path)
query := requestUrl.Query()
for key, value := range queryParams {
query.Add(key, value)
}
requestUrl.RawQuery = query.Encode()
req, err := http.NewRequest(method, requestUrl.String(), body)
if err != nil {
return nil, err
}
req.Header.Add("X-API-Key", i.APIKey)
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Accept", "application/json")
return i.HTTPClient.Do(req)
}
func (i *IonosAPIImpl) GetZoneId(tld string) (string, error) {
res, err := i.HttpCall("GET", "/v1/zones", nil, nil)
if err != nil {
return "", err
}
responseBody := make([]byte, res.ContentLength)
res.Body.Read(responseBody)
zones := []ZoneResponse{}
json.Unmarshal(responseBody, &zones)
for _, z := range zones {
if z.Name == tld {
return z.Id, nil
}
}
return "", errors.New("zone not found")
}
func (i *IonosAPIImpl) GetRecordId(zoneId string, tld string, subdomain string, recordType string) (string, error) {
var domain string
if subdomain == "@" || subdomain == "" {
domain = tld
} else {
domain = subdomain + "." + tld
}
res, err := i.HttpCall("GET", "/v1/zones/"+zoneId, nil, map[string]string{"recordName": domain, "recordType": recordType})
if err != nil {
return "", err
}
responseBody := make([]byte, res.ContentLength)
res.Body.Read(responseBody)
zone := ZoneResponse{}
json.Unmarshal(responseBody, &zone)
for _, record := range zone.Records {
if record.Type == recordType && record.Name == domain {
return record.Id, nil
}
}
return "", errors.New("record not found")
}
func (i *IonosAPIImpl) SetARecord(tld string, subdomain string, ip net.IP, ttl int, prio int, disabled bool) (*common.ARecord, error) {
zoneId, err := i.GetZoneId(tld)
if err != nil {
return nil, err
}
recordId, err := i.GetRecordId(zoneId, tld, subdomain, "A")
if err != nil {
return nil, err
}
changeRecordRequest, err := json.Marshal(ChangeRecordRequest{
Content: ip.String(),
TTL: ttl,
Prio: prio,
Disabled: false,
})
if err != nil {
return nil, err
}
res, err := i.HttpCall("PUT", "/v1/zones/"+zoneId+"/records/"+recordId, bytes.NewReader(changeRecordRequest), nil)
if err != nil {
return nil, err
}
responseBody := make([]byte, res.ContentLength)
res.Body.Read(responseBody)
if res.StatusCode != 200 {
return nil, errors.New("error updating record")
}
changeRecord := ChangeRecord{}
json.Unmarshal(responseBody, &changeRecord)
return &common.ARecord{
Domain: changeRecord.Name,
IP: changeRecord.Content,
TTL: changeRecord.TTL,
Prio: changeRecord.Prio,
Disabled: changeRecord.Disabled,
}, nil
}
func (ionos *IonosAPIImpl) GetARecord(tld string, subdomain string) (*common.ARecord, error) {
zoneId, err := ionos.GetZoneId(tld)
if err != nil {
return nil, err
}
recordId, err := ionos.GetRecordId(zoneId, tld, subdomain, "A")
if err != nil {
return nil, err
}
res, err := ionos.HttpCall("GET", "/v1/zones/"+zoneId+"/records/"+recordId, nil, nil)
if err != nil {
return nil, err
}
responseBody := make([]byte, res.ContentLength)
res.Body.Read(responseBody)
record := RecordResponse{}
json.Unmarshal(responseBody, &record)
return &common.ARecord{
Domain: record.Name,
IP: record.Content,
TTL: record.TTL,
Prio: record.Prio,
Disabled: record.Disabled,
}, nil
}
-285
View File
@@ -1,285 +0,0 @@
package ionosAPI
import (
"encoding/json"
"net"
"net/http"
"net/http/httptest"
"testing"
)
func utilMockServerImpl() func(w http.ResponseWriter, r *http.Request) {
zonesResponse := []ZoneResponse{
{
Name: "example.com",
Id: "1234567890",
Type: "NATIVE",
},
{
Name: "notTheExample.org",
Id: "0987654321",
Type: "SLAVE",
},
}
zonesResponseJson, _ := json.Marshal(zonesResponse)
recordResponseSub := RecordResponse{
Id: "abcdefghij",
Name: "example.com",
RootName: "example.com",
Type: "A",
Content: "127.0.0.1",
ChangeDate: "2019-12-09T13:04:25.772Z",
TTL: 300,
Prio: 0,
Disabled: false,
}
recordResponseSubJson, _ := json.Marshal(recordResponseSub)
recordResponseTLD := RecordResponse{
Id: "jihgfedcba",
Name: "sub.example.com",
RootName: "example.com",
Type: "A",
Content: "127.0.0.2",
ChangeDate: "2019-12-09T13:04:25.772Z",
TTL: 300,
Prio: 0,
Disabled: false,
}
recordResponseTLDJson, _ := json.Marshal(recordResponseTLD)
zoneResponse := ZoneResponse{
Id: "1234567890",
Name: "example.com",
Type: "NATIVE",
Records: []RecordResponse{
recordResponseSub,
recordResponseTLD,
},
}
zoneResponseJson, _ := json.Marshal(zoneResponse)
changeRecord := ChangeRecord{
Name: "sub.example.com",
Type: "A",
Content: "127.0.0.1",
TTL: 300,
Prio: 0,
Disabled: false,
}
changeRecordJson, _ := json.Marshal(changeRecord)
return func(w http.ResponseWriter, r *http.Request) {
var response []byte
if r.Method == "GET" {
if r.RequestURI == "/v1/zones" {
response = zonesResponseJson
} else if r.RequestURI == "/v1/zones/1234567890?recordName=example.com&recordType=A" ||
r.RequestURI == "/v1/zones/1234567890?recordName=sub.example.com&recordType=A" {
response = zoneResponseJson
} else if r.RequestURI == "/v1/zones/1234567890/records/abcdefghij" {
response = recordResponseSubJson
} else if r.RequestURI == "/v1/zones/1234567890/records/jihgfedcba" {
response = recordResponseTLDJson
}
} else if r.Method == "PUT" {
response = changeRecordJson
} else {
response = []byte("404")
}
w.Write(response)
}
}
func TestHttpCall(t *testing.T) {
mockServer := httptest.NewServer(http.HandlerFunc(utilMockServerImpl()))
defer mockServer.Close()
ionosAPI := New("dummyKey", mockServer.URL)
t.Run("returns response for GET request", testHttpCallGet(ionosAPI))
t.Run("returns response for PUT request", testHttpCallPut(ionosAPI))
t.Run("returns error for non existing endpoint", testHttpCallNonExistingEndpoint())
}
func testHttpCallGet(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
res, err := api.HttpCall("GET", "/v1/zones", nil, nil)
if err != nil {
t.Fatalf("HttpCall() returned unexpected error: %v", err)
}
if res.StatusCode != 200 {
t.Fatalf("HttpCall() returned unexpected status code: %v instead of 200", res.StatusCode)
}
}
}
func testHttpCallPut(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
res, err := api.HttpCall("PUT", "/v1/zones/1234567890/records/abcdefghij", nil, nil)
if err != nil {
t.Fatalf("HttpCall() returned unexpected error: %v", err)
}
if res.StatusCode != 200 {
t.Fatalf("HttpCall() returned unexpected status code: %v instead of 200", res.StatusCode)
}
}
}
func testHttpCallNonExistingEndpoint() func(t *testing.T) {
return func(t *testing.T) {
mockServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(404)
}))
defer mockServer.Close()
api := New("dummyKey", mockServer.URL)
res, err := api.HttpCall("GET", "/v1/nonExistingEndpoint", nil, nil)
if err != nil {
t.Fatalf("HttpCall() returned unexpected error: %v", err)
}
if res.StatusCode != 404 {
t.Fatalf("HttpCall() returned unexpected status code: %v instead of 404", res.StatusCode)
}
}
}
func TestGetZoneId(t *testing.T) {
mockServer := httptest.NewServer(http.HandlerFunc(utilMockServerImpl()))
ionosAPI := New("dummyKey", mockServer.URL)
t.Run("returns zoneId for tracked domain", testGetZoneIdSuccess(ionosAPI))
t.Run("returns error for non tracked domain", testGetZoneIdNoMatch(ionosAPI))
}
func testGetZoneIdSuccess(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
zoneId, err := api.GetZoneId("example.com")
if err != nil {
t.Fatalf("GetZoneId() returned unexpected error: %v", err)
}
if zoneId != "1234567890" {
t.Fatalf("GetZoneId() returned unexpected zoneId: %v instead of 1234567890", zoneId)
}
}
}
func testGetZoneIdNoMatch(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
zoneId, err := api.GetZoneId("nonTrackedDomain.com")
if err == nil || zoneId != "" {
t.Fatalf("GetZoneId() did not return an error for a non tracked domain")
}
}
}
func TestGetRecordId(t *testing.T) {
mockServer := httptest.NewServer(http.HandlerFunc(utilMockServerImpl()))
defer mockServer.Close()
ionosAPI := New("dummyKey", mockServer.URL)
t.Run("returns zoneId for top level domain", testGetRecordIdForTopLevelDomain(ionosAPI))
t.Run("returns zoneId for subdomain", testGetRecordIdForSubdomain(ionosAPI))
t.Run("returns error for untracked subdomain", testGetRecordIdWithUntrackedSubdomain(ionosAPI))
}
func testGetRecordIdForTopLevelDomain(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
recordId, err := api.GetRecordId("1234567890", "example.com", "", "A")
if err != nil {
t.Fatalf("GetZoneId() returned unexpected error: %v", err)
}
if recordId != "abcdefghij" {
t.Fatalf("GetZoneId() returned unexpected zoneId: %v instead of abcdefghij", recordId)
}
}
}
func testGetRecordIdForSubdomain(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
recordId, err := api.GetRecordId("1234567890", "example.com", "sub", "A")
if err != nil {
t.Fatalf("GetZoneId() returned unexpected error: %v", err)
}
if recordId != "jihgfedcba" {
t.Fatalf("GetZoneId() returned unexpected zoneId: %v instead of jihgfedcba", recordId)
}
}
}
func testGetRecordIdWithUntrackedSubdomain(api IonosAPI) func(t *testing.T) {
return func(t *testing.T) {
recordId, err := api.GetRecordId("1234567890", "example.com", "untrackedSub", "A")
if err == nil && recordId == "" {
t.Fatalf("GetZoneId() did not return an error for a non tracked domain")
}
}
}
func TestGetARecord(t *testing.T) {
mockServer := httptest.NewServer(http.HandlerFunc(utilMockServerImpl()))
defer mockServer.Close()
ionosAPI := New("dummyKey", mockServer.URL)
t.Run("returns A record for top level domain", testGetARecordFor(ionosAPI, "example.com", ""))
t.Run("returns A record for subdomain", testGetARecordFor(ionosAPI, "example.com", "sub"))
}
func testGetARecordFor(api IonosAPI, tld string, subdomain string) func(t *testing.T) {
return func(t *testing.T) {
var domain string
if subdomain == "" {
domain = tld
} else {
domain = subdomain + "." + tld
}
record, err := api.GetARecord(tld, subdomain)
if err != nil {
t.Fatalf("GetARecord() returned unexpected error: %v", err)
}
if record.Domain != domain {
t.Fatalf("GetARecord() returned unexpected record for: %v instead of %v", record.Domain, domain)
}
}
}
func TestSetARecord(t *testing.T) {
mockServer := httptest.NewServer(http.HandlerFunc(utilMockServerImpl()))
defer mockServer.Close()
ionosAPI := New("dummyKey", mockServer.URL)
changedARecord, err := ionosAPI.SetARecord("example.com", "sub", net.ParseIP("127.0.0.1"), 300, 0, false)
if err != nil {
t.Fatalf("SetARecord() returned unexpected error: %v", err)
}
if changedARecord.Domain != "sub.example.com" {
t.Fatalf("SetARecord() returned unexpected record for: %v instead of sub.example.com", changedARecord.Domain)
}
}
+233 -7
View File
@@ -1,20 +1,30 @@
package ionosDnsProvider
import (
"context"
"errors"
"net"
"net/http"
"realdnydns/model/common"
"realdnydns/pkg/dnsProvider"
ionosAPI "realdnydns/pkg/dnsProvider/ionos/api"
"sync"
ionosDnsClient "gitea.t000-n.de/t.behrendt/ionosDnsClient"
)
type IONOS struct {
API ionosAPI.IonosAPI
client *ionosDnsClient.ClientWithResponses
zoneIdMap map[string]string
defaultTtl int
defaultPrio int
zoneIdMapMutex sync.Mutex
}
type IONOSConfig struct {
APIKey string `yaml:"api_key"`
BaseURL string `yaml:"base_url"`
DefaultTTL *int `yaml:"default_ttl,omitempty"`
DefaultPrio *int `yaml:"default_prio,omitempty"`
}
func NewIonos(config *IONOSConfig) (dnsProvider.DNSProvider, error) {
@@ -26,15 +36,231 @@ func NewIonos(config *IONOSConfig) (dnsProvider.DNSProvider, error) {
return nil, errors.New("base_url is required")
}
options := []ionosDnsClient.ClientOption{
ionosDnsClient.WithRequestEditorFn(func(ctx context.Context, req *http.Request) error {
req.Header.Set("X-API-Key", config.APIKey)
return nil
}),
}
client, err := ionosDnsClient.NewClientWithResponses(config.BaseURL, options...)
if err != nil {
return nil, err
}
// Set default values for TTL and Prio if not provided
defaultTtl := 300
if config.DefaultTTL != nil {
defaultTtl = *config.DefaultTTL
}
defaultPrio := 0
if config.DefaultPrio != nil {
defaultPrio = *config.DefaultPrio
}
return &IONOS{
ionosAPI.New(config.APIKey, config.BaseURL),
client: client,
zoneIdMap: make(map[string]string),
defaultTtl: defaultTtl,
defaultPrio: defaultPrio,
}, nil
}
func (ionos *IONOS) UpdateRecord(tld string, subdomain string, ip net.IP, ttl int, prio int, disabled bool) (*common.ARecord, error) {
return ionos.API.SetARecord(tld, subdomain, ip, ttl, prio, disabled)
func (i *IONOS) UpdateRecord(tld string, subdomain string, ip net.IP, ttl int, prio int, disabled bool) (*common.ARecord, error) {
zoneId, err := i.getZoneIdForTld(tld)
if err != nil {
return nil, err
}
domain := assembleTldSubdomainToDomain(tld, subdomain)
recordId, err := i.getRecordIdForDomain(zoneId, domain)
if err != nil {
return nil, err
}
ipString := ip.String()
res, err := i.client.UpdateRecordWithResponse(context.Background(), zoneId, recordId, ionosDnsClient.RecordUpdate{
Content: &ipString,
Ttl: &ttl,
Prio: &prio,
Disabled: &disabled,
})
if err != nil || res.StatusCode() != 200 {
return nil, errors.New("failed to update record")
}
if res.JSON200 == nil {
return nil, errors.New("record response is empty")
}
record := *res.JSON200
if record.Name == nil || record.Content == nil {
return nil, errors.New("record is empty")
}
// Handle optional fields with defaults
recordTtl := 0
if record.Ttl != nil {
recordTtl = *record.Ttl
}
recordPrio := 0
if record.Prio != nil {
recordPrio = *record.Prio
}
recordDisabled := false
if record.Disabled != nil {
recordDisabled = *record.Disabled
}
return &common.ARecord{
Domain: *record.Name,
IP: *record.Content,
TTL: recordTtl,
Prio: recordPrio,
Disabled: recordDisabled,
}, nil
}
func (ionos *IONOS) GetRecord(tld string, subdomain string) (*common.ARecord, error) {
return ionos.API.GetARecord(tld, subdomain)
func (i *IONOS) getZoneIdForTld(tld string) (string, error) {
i.zoneIdMapMutex.Lock()
defer i.zoneIdMapMutex.Unlock()
if zoneId, ok := i.zoneIdMap[tld]; ok {
return zoneId, nil
}
res, err := i.client.GetZonesWithResponse(context.Background())
if err != nil {
return "", err
} else if res.StatusCode() != 200 {
return "", errors.New("failed to get zones")
}
if res.JSON200 == nil {
return "", errors.New("zones response is empty")
}
zones := *res.JSON200
for _, zone := range zones {
if *zone.Name == tld {
if zone.Id == nil || *zone.Id == "" {
return "", errors.New("zone id is empty")
}
i.zoneIdMap[tld] = *zone.Id
return *zone.Id, nil
}
}
return "", errors.New("no zone found")
}
var recordTypeA = "A"
func assembleTldSubdomainToDomain(tld string, subdomain string) string {
if subdomain == "@" || subdomain == "" {
return tld
}
return subdomain + "." + tld
}
func (i *IONOS) getRecordIdForDomain(zoneId string, domain string) (string, error) {
res, err := i.client.GetZoneWithResponse(context.Background(), zoneId, &ionosDnsClient.GetZoneParams{
RecordName: &domain,
RecordType: &recordTypeA,
})
if err != nil || res.StatusCode() != 200 {
return "", errors.New("failed to get zone")
}
if res.JSON200 == nil {
return "", errors.New("zone response is empty")
}
zone := *res.JSON200
for _, record := range *zone.Records {
if *record.Name == domain && *record.Type == ionosDnsClient.RecordTypes("A") {
return *record.Id, nil
}
}
return "", errors.New("no record found")
}
func (i *IONOS) GetRecord(tld string, subdomain string) (*common.ARecord, error) {
zoneId, err := i.getZoneIdForTld(tld)
if err != nil {
return nil, err
}
domain := assembleTldSubdomainToDomain(tld, subdomain)
recordId, err := i.getRecordIdForDomain(zoneId, domain)
if err != nil {
return nil, err
}
res, err := i.client.GetRecordWithResponse(context.Background(), zoneId, recordId)
if err != nil || res.StatusCode() != 200 || res.JSON200 == nil {
return nil, errors.New("failed to get record")
}
record := *res.JSON200
if record.Name == nil || *record.Name == "" || *record.Name != domain {
return nil, errors.New("record name does not match or is empty")
}
if record.Content == nil || *record.Content == "" {
return nil, errors.New("record content is empty")
}
needsUpdate := false
ttl := i.defaultTtl
if record.Ttl != nil {
ttl = *record.Ttl
} else {
needsUpdate = true
}
prio := i.defaultPrio
if record.Prio != nil {
prio = *record.Prio
} else {
needsUpdate = true
}
disabled := false
if record.Disabled != nil {
disabled = *record.Disabled
} else {
needsUpdate = true
}
// realDynDns requires every field to be set, so we need to update the record if any of the fields are missing
if needsUpdate {
ip := net.ParseIP(*record.Content)
if ip == nil {
return nil, errors.New("invalid IP address in record content")
}
updatedRecord, err := i.UpdateRecord(tld, subdomain, ip, ttl, prio, disabled)
if err != nil {
return nil, err
}
return updatedRecord, nil
}
return &common.ARecord{
Domain: *record.Name,
IP: *record.Content,
TTL: ttl,
Prio: prio,
Disabled: disabled,
}, nil
}
File diff suppressed because it is too large Load Diff
+15 -9
View File
@@ -4,14 +4,13 @@ import (
"fmt"
"log/slog"
"sync"
"time"
"realdnydns/pkg/config"
"realdnydns/pkg/dnsProvider"
"realdnydns/pkg/externalIpProvider"
"realdnydns/pkg/notificationProvider"
"github.com/go-co-op/gocron"
gocron "github.com/go-co-op/gocron/v2"
)
type ChangeDetector struct {
@@ -38,19 +37,26 @@ func New(
}
}
func (c *ChangeDetector) RunWithSchedule(checkInterval string) (*gocron.Scheduler, *gocron.Job, error) {
s := gocron.NewScheduler(time.UTC)
s.SingletonMode()
s.CronWithSeconds(checkInterval)
func (c *ChangeDetector) RunWithSchedule(checkInterval string) (gocron.Scheduler, gocron.Job, error) {
s, err := gocron.NewScheduler()
if err != nil {
return nil, nil, err
}
job, err := s.DoWithJobDetails(func(job gocron.Job) {
job, err := s.NewJob(
gocron.CronJob(checkInterval, true),
gocron.NewTask(func(job gocron.Job) {
numberChanged, err := c.detectAndApplyChanges()
if err != nil {
panic(err)
}
fmt.Printf("Number of changes: %d\n", numberChanged)
fmt.Println("Next run:", job.NextRun())
})
nextRun, err := job.NextRun()
if err != nil {
panic(err)
}
fmt.Println("Next run:", nextRun)
}))
if err != nil {
return nil, nil, err
}