mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-12-09 21:55:57 +08:00
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>
205 lines
6.5 KiB
YAML
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.
|