dnscontrol/.goreleaser.yml
Jakob Ackermann 1e67585e8f
HETZNER_V2: Add provider for Hetzner DNS API (#3837)
Closes https://github.com/StackExchange/dnscontrol/issues/3787

This PR is adding a `HETZNER_V2` provider for the "new" Hetzner DNS API.

Testing:
- The integration tests are passing.
- Manual testing:
  - `preview` (see diff for existing zone)
- `preview --populate-on-preview` (see full diff for newly created zone)
  - `push` (see full diff; no diff after push)
- `push` (see full diff; no diff after push to newly created zone --
i.e. single pass and done)

```js
var REG_NONE = NewRegistrar('none')
var DSP = NewDnsProvider('HETZNER_V2')

D('testing-2025-11-14-7.dev', REG_NONE, DnsProvider(DSP),
    A('@', '127.0.0.1')
)
```

<details>

```
# push for newly created zone
CONCURRENTLY checking for 1 zone(s)
SERIALLY checking for 0 zone(s)
Waiting for concurrent checking(s) to complete...DONE
******************** Domain: testing-2025-11-14-7.dev
1 correction (HETZNER_V2)
#1: Ensuring zone "testing-2025-11-14-7.dev" exists in "HETZNER_V2"
SUCCESS!
CONCURRENTLY gathering records of 1 zone(s)
SERIALLY gathering records of 0 zone(s)
Waiting for concurrent gathering(s) to complete...DONE
******************** Domain: testing-2025-11-14-7.dev
4 corrections (HETZNER_V2)
#1: ± MODIFY-TTL testing-2025-11-14-7.dev NS helium.ns.hetzner.de. ttl=(3600->300)
± MODIFY-TTL testing-2025-11-14-7.dev NS hydrogen.ns.hetzner.com. ttl=(3600->300)
± MODIFY-TTL testing-2025-11-14-7.dev NS oxygen.ns.hetzner.com. ttl=(3600->300)
SUCCESS!
#2: + CREATE testing-2025-11-14-7.dev A 127.0.0.1 ttl=300
SUCCESS!
Done. 5 corrections.
```
</details>

Feedback for @jooola and @LKaemmerling:
- The SDK was very useful in getting 80% there! Nice! 🎉 
- Footgun:
- The `result` values are not "up-to-date" after waiting for an
`Action`, e.g. `Zone.AuthoritativeNameservers.Assigned` is not set when
`Client.Zone.Create()` returns and the following "wait" will not update
it.
- Taking a step back here: Waiting for an `Action` with a separate SDK
call does not seem very natural to me. Does the SDK-user need to know
that you are processing operations asynchronous? (Which seems like an
implementation detail to me, something that the SDK could abstrct over.)
Can `Client.Zone.Create()` return the final `Zone` instead of the
intermediate result?
- Features missing compared to the DNS Console, in priority order:
- It is no longer possible to remove your provided name servers from the
root/apex. Use-case: dual-home/multi-home zone with fewer than three
servers from Hetzner. I'm operating one of these and cannot migrate over
until this is fixed.
- Performance regression due to lack of bulk create/modify. E.g. [one of
the test
suites](a71b89e5a2/integrationTest/integration_test.go (L619))
spends about 4.5 minutes on making creating 100 record-sets and then
another 4 minutes for deleting them in sequence again. With your async
API, these are `create 2*100 + delete 2*100 = 400` API calls.
Previously, these were `create 1 + delete 100 = 101` API calls. Are you
planning on adding batch processing again?
- Usability nits
- Compared to other record-set based APIs, upserts for record-sets are
missing. This applies to records of a record-set and the ttl of the
record-set (see separate SDK calls for the cases `diff2.CREATE` vs
`diff2.CHANGE` and two calls in `diff2.CHANGE` for updating the TTL vs
records).
- Some SDK methods return an `Action` (e.g. `Zone.ChangeRRSetTTL()`),
others wrap the `Action` in a struct (`Client.Zone.CreateRRSet()`) --
even when the struct has a single field (`ZoneRRSetDeleteResult`).

---------

Co-authored-by: "Jonas L." <jooola@users.noreply.github.com>
Co-authored-by: "Lukas Kämmerling" <LKaemmerling@users.noreply.github.com>
Co-authored-by: Tom Limoncelli <6293917+tlimoncelli@users.noreply.github.com>
2025-11-30 09:14:54 -05:00

205 lines
6.5 KiB
YAML

# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
project_name: dnscontrol
version: 2
builds:
-
id: build
env:
- CGO_ENABLED=0
- GO111MODULE=on
goos:
- linux
- windows
- darwin
- freebsd
# List of combinations of GOOS + GOARCH + GOARM to ignore.
ignore:
- goos: linux
goarch: "386"
- goos: windows
goarch: "386"
- goos: freebsd
goarch: "386"
ldflags:
- -linkmode=internal -s -w
- -X github.com/StackExchange/dnscontrol/v4/pkg/version.version={{ .Version }}
before:
hooks:
- go fmt ./...
- go mod tidy
- go generate ./...
changelog:
sort: asc
use: github
groups:
- title: 'Breaking changes:'
regexp: "(?i)^.*breaking[(\\w)]*:+.*$"
order: 0
- title: 'Major features:'
regexp: "(?i)^.*(major|new provider|feature)[(\\w)]*:+.*$"
order: 1
- title: 'Provider-specific changes:'
regexp: "(?i)((adguardhome|akamaiedge|autodns|axfrd|azure|azure_private_dns|bind|bunnydns|cloudflare|cloudflareapi_old|cloudns|cnr|cscglobal|desec|digitalocean|dnsimple|dnsmadeeasy|doh|domainnameshop|dynadot|easyname|exoscale|fortigate|gandi|gcloud|gcore|hedns|hetzner|hetznerv2|hexonet|hostingde|huaweicloud|inwx|joker|linode|loopia|luadns|mythicbeasts|namecheap|namedotcom|netcup|netlify|ns1|opensrs|oracle|ovh|packetframe|porkbun|powerdns|realtimeregister|route53|rwth|sakuracloud|softlayer|transip|vultr).*:)+.*"
order: 2
- title: 'Documentation:'
regexp: "(?i)^.*(docs)[(\\w)]*:+.*$"
order: 3
- title: 'CI/CD:'
regexp: "(?i)^.*(build|ci|cicd)[(\\w)]*:+.*$"
order: 4
- title: 'Dependencies:'
regexp: "(?i)^.*\\b(deps|dependencies)\\b.*$"
order: 5
- title: 'Other changes and improvements:'
order: 9
- title: 'Deprecation warnings:'
regexp: "(?i)^.*Deprecate[(\\w)]*:+.*$"
order: 10
filters:
exclude:
- '^test:'
- Merge pull request
- Merge branch
archives:
- format_overrides:
- goos: windows
formats:
- "zip"
universal_binaries:
-
replace: true
id: build
nfpms:
- id: packages_rpm
file_name_template: >-
{{ .ProjectName }}-
{{- .Version }}.
{{- if eq .Arch "386" }}i386
{{- else if eq .Arch "amd64" }}x86_64
{{- else }}{{ .Arch }}{{ end }}
homepage: https://docs.dnscontrol.org/
description: "DNSControl: Infrastructure as Code for DNS Zones"
maintainer: 'Tom Limoncelli <tlimoncelli@stackoverflow.com>'
license: MIT
formats:
- rpm
- id: packages_deb
file_name_template: >-
{{ .ProjectName }}-
{{- .Version }}.
{{- if eq .Arch "386" }}i386
{{- else }}{{ .Arch }}{{ end }}
homepage: https://docs.dnscontrol.org/
description: "DNSControl: Infrastructure as Code for DNS Zones"
maintainer: 'Tom Limoncelli <tlimoncelli@stackoverflow.com>'
license: MIT
formats:
- deb
dockers:
- image_templates:
- &amd_image "stackexchange/{{.ProjectName}}:{{ .Version }}-amd64"
- &amd_image_ghcr "ghcr.io/stackexchange/{{.ProjectName}}:{{ .Version }}-amd64"
goos: linux
goarch: amd64
use: buildx
ids:
- build
build_flag_templates:
- "--pull"
- "--platform=linux/amd64"
- "--label=org.opencontainers.image.created={{ .Date }}"
- "--label=org.opencontainers.image.name={{ .ProjectName }}"
- "--label=org.opencontainers.image.revision={{ .FullCommit }}"
- "--label=org.opencontainers.image.version={{ .Version }}"
- "--label=org.opencontainers.image.source={{ .GitURL }}"
- image_templates:
- &arm_image "stackexchange/{{.ProjectName}}:{{ .Version }}-arm64"
- &arm_image_ghcr "ghcr.io/stackexchange/{{.ProjectName}}:{{ .Version }}-arm64"
goos: linux
goarch: arm64
use: buildx
ids:
- build
build_flag_templates:
- "--pull"
- "--platform=linux/arm64"
- "--label=org.opencontainers.image.created={{ .Date }}"
- "--label=org.opencontainers.image.name={{ .ProjectName }}"
- "--label=org.opencontainers.image.revision={{ .FullCommit }}"
- "--label=org.opencontainers.image.version={{ .Version }}"
- "--label=org.opencontainers.image.source={{ .GitURL }}"
docker_manifests:
- name_template: "stackexchange/{{.ProjectName}}:{{ .Version }}"
image_templates:
- *amd_image
- *arm_image
- name_template: "ghcr.io/stackexchange/{{.ProjectName}}:{{ .Version }}"
image_templates:
- *amd_image_ghcr
- *arm_image_ghcr
- name_template: "stackexchange/{{.ProjectName}}:latest"
skip_push: auto
image_templates:
- *amd_image
- *arm_image
- name_template: "ghcr.io/stackexchange/{{.ProjectName}}:latest"
skip_push: auto
image_templates:
- *amd_image_ghcr
- *arm_image_ghcr
checksum:
name_template: 'checksums.txt'
snapshot:
version_template: "{{ incpatch .Version }}-next"
release:
draft: true
prerelease: auto
mode: append
footer: |
## Deprecation warnings
> [!WARNING]
> - **REV() will switch from RFC2317 to RFC4183 in v5.0.** This is a breaking change. Warnings are output if your configuration is affected. No date has been announced for v5.0. See https://docs.dnscontrol.org/language-reference/top-level-functions/revcompat
> - **NAMEDOTCOM and SOFTLAYER need maintainers!** These providers have no maintainer. Maintainers respond to PRs and fix bugs in a timely manner, and try to stay on top of protocol changes.
## Install
#### macOS and Linux
##### Install with [Homebrew](https://brew.sh) (recommended)
```shell
brew install dnscontrol
```
##### Using with [Docker](https://www.docker.com)
You can use the Docker image from [Docker hub](https://hub.docker.com/r/stackexchange/dnscontrol/) or [GitHub Container Registry](https://github.com/stackexchange/dnscontrol/pkgs/container/dnscontrol).
```shell
docker run --rm -it -v "$(pwd):/dns" ghcr.io/stackexchange/dnscontrol preview
```
#### Anywhere else
Alternatively, you can install the latest binary (or the apt/rpm/deb/archlinux package) from this page.
Or, if you have Go installed, you can install the latest version of DNSControl with the following command:
```shell
go install github.com/StackExchange/dnscontrol/v4@main
```
## Update
Update to the latest version depends on how you choose to install `dnscontrol` on your machine.
#### Update with [Homebrew](https://brew.sh)
```shell
brew upgrade dnscontrol
```
Alternatively, you can grab the latest binary (or the apt/rpm/deb package) from this page.