How to build and ship a release

These are the instructions for producing a release.

GitHub Actions (GHA) will do most of the work for you. You will need to edit the draft release notes and click a button to make the release public.

Please change the version number as appropriate. Substitute (for example) v4.2.0 any place you see $VERSION in this doc.

Step 1. Rebuild generated files

export VERSION=v4.2.0
git checkout main
git pull
go fmt ./...
go generate ./...
go mod tidy
git commit -a -m "Update generated files for $VERSION"

Step 2. Tag the commit in main that you want to release

export VERSION=v4.2.0
git tag -m "Release $VERSION" -a $VERSION
git push origin HEAD --tags

Soon after GitHub will start an Action Workflow called "draft release" which will build all release binaries and write the draft release notes.

Step 3. Create the release notes

The draft release notes are created for you. In this step you'll edit them.

The GHA workflow uses GoReleaser which produces the GitHub Release with Release Notes derived from the commit history between now and the last tag. These notes are just a draft and needs considerable editing. These release notes are used elsewhere, in particular the email step.

Release notes style guide:

  • Entries in the bullet list should be phrased in the positive: "Feature FOO now does BAR". This is often the opposite of the related issue, which was probably phrased, "Feature FOO is broken because of BAR".

  • Every item should include the ID of the issue related to the change. If there was no issue, create one and close it.

  • Sort the list most important/exciting changes earlier in the list.

  • Items related to a specific provider should begin with the all-caps name of the provider, such as "ROUTE53: Added support for sandwiches (#100)"

  • The Deprecation warnings section should just copy from If you change one, change it in the README too (you can make that change in this PR).

See for examples for recent release notes and copy that style.


## Changelog

This release includes many new providers (FILL IN), dozens
of bug fixes, and FILL IN.

### Breaking changes:


### Major features:


### Provider-specific changes:


### Other changes and improvements:


### Deprecation warnings:

Step 4. Announce it via email

Email the release notes to the mailing list: (note the format of the Subject line and that the first line of the email is the URL of the release)

Subject: New release: dnscontrol v$VERSION$VERSION

[insert the release notes here]

NOTE: You won't be able to post to the mailing list unless you are on it. Click here to join.

Step 5. Announce it via chat

Mention on that the new release has shipped.

ANNOUNCEMENT: dnscontrol v$VERSION has been released!$VERSION

Step 6. Get credit

Mention the fact that you did this release in your weekly accomplishments.

If you are at Stack Overflow:

  • Add the release to your weekly snippets

  • Run this build: dnscontrol_embed - Promote most recent artifact into ExternalDNS repo

Tip: How to bump the major version

If you bump the major version, you need to change all the source files. The last time this was done (v3 -> v4) these two commands were used. They're included her for reference.

#  Make all the changes:
sed -i.bak -e '' go.* $(fgrep -lri --include '*.go' *)
# Delete the backup files:
find * -name \*.bak -delete

Tip: Configuring GHA integration tests


GHA is configured to run an integration test for any provider listed in the "provider" list. However the test is skipped if the *_DOMAIN variable is not set. For example, the Google Cloud provider integration test is only run if GCLOUD_DOMAIN is set.

  • Q: Where is the list of providers to run integration tests on?

  • A: In .github/workflows/pr_test.yml: (1) the "PROVIDERS" list, (2) the integrtests-diff2 section.

  • Q: Where are non-secret environment variables stored?

  • A: GHA calls them "Variables". Update them here:

  • Q: Where are SECRET environment variables stored?

  • A: GHA calls them "Secrets". Update them here:

How do I add a single new integration test?

  1. Edit .github/workflows/pr_test.yml

  2. Add the FOO_DOMAIN variable name of the provider to the "PROVIDERS" list.

  3. Set the FOO_DOMAIN variables in GHA via

  4. All other variables should be stored as secrets (for consistency). Add them to the integration-tests section. Set them in GHA via

How do I add a "bring your own keys" integration test?

Overview: You will fork the repo and add any secrets to your fork. For security reasons you won't have access to the secrets from the main repository.

  1. Fork StackExchange/dnscontrol in GitHub.

    If you already have a fork, be sure to use the "sync fork" button on the main page to sync with the upstream.

  2. In your fork, set the ${DOMAIN}_DOMAIN variable in GHA via Settings :: Secrets and variables :: Actions :: Variables.

  3. In your fork, set any secrets in GHA via Settings :: Secrets and variables :: Actions :: Secrets.

  4. Start a build

Tip: How to rebuild flattener

Rebuilding flatter requires go1.17.1 and the gopherjs compiler.

Install go1.17.1:

go install
go1.17.1 download

Install GopherJS:

go install

Build the software:

NOTE: GOOS can't be Darwin because GOPHERJS doesn't support it.

cd docs/flattener/
export GOPHERJS_GOROOT="$(go1.17.1 env GOROOT)"
export GOOS=linux
gopherjs build

Tip: How to update modules

List out-of-date modules and update any that seem worth updating:

go install
go mod tidy


go install
go list -mod=mod -u -m -json all | go-mod-outdated -update -direct

# If any are out of date, update via:

go get module/path

# Once the updates are complete, tidy up:

go mod tidy

Last updated