dnscontrol/.circleci/config.yml
Chris Hunt b4ebe5b54b
maint: Update GoReleaser and CircleCI configs to publish multi-arch Docker image (#1682)
- Improve the filtering for the `release` job only on tag creation.
- Removes the dependency on `integration-tests` job from the `release` job. The flaky tests were frequently blocking the release.
  - Integration tests will now only run on PRs.
- Restores the Docker build/publish
  - Includes amd64, arm64, and i386 multi-arch manifest
- Uploads [artifacts](https://app.circleci.com/pipelines/github/StackExchange/dnscontrol/1285/workflows/b40ce89b-5a60-4ed2-874b-d47f383122b2/jobs/10051/artifacts) to CircleCI
- Fixes linting issues with README
- Add [CircleCI Insights badge](https://github.com/StackExchange/dnscontrol/tree/fix/cci#dnscontrol) to README
- Uploads deb and rpm packages to [CloudSmith](https://cloudsmith.io/~stackoverflow/repos/dnscontrol/packages/)
  - TODO: It looks like CloudSmith treats both formats as duplicates and appends a `-1` to the version.
  - TODO: Push the Docker images to CloudSmith as well (alternate to Docker Hub and their aggressive rate limits).
- TODO: The automated release notes regex patterns don't work for most of the commits. See [releases/tag/v3.18.2-pre013](https://github.com/StackExchange/dnscontrol/releases/tag/v3.18.2-pre013)
2022-08-12 16:08:16 -04:00

258 lines
7.3 KiB
YAML

version: 2.1
orbs:
go: circleci/go@1.7.1
docker: circleci/docker@2.1.2
cloudsmith: cloudsmith/cloudsmith@1.0.5
parameters:
cache-key:
type: integer
default: 1639697695
description: Change to force cache reset `pwsh > Get-Date -UFormat %s`
gover:
type: string
default: "1.18" # https://circleci.com/developer/images/image/cimg/go#image-tags
description: Go Version to use
jobs:
build:
docker:
- image: cimg/go:<< pipeline.parameters.gover >>
resource_class: 2xlarge
environment: # environment variables for the build itself
TEST_RESULTS: /tmp/test-results
steps:
- checkout
- restore_cache: # restores saved cache if no changes are detected since last run
keys:
- linux-go-{{ checksum "go.sum" }}-<< pipeline.parameters.cache-key >>
- run:
name: Install goreleaser
command: go install github.com/goreleaser/goreleaser@latest
- run: mkdir -p "$TEST_RESULTS"
- run:
name: Run unit tests
# store the results of our tests in the $TEST_RESULTS directory
command: gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- $PACKAGE_NAMES
- store_test_results: # upload test results for display in Test Summary
path: /tmp/test-results
- run:
name: Build binaries
command: goreleaser build --snapshot
- run:
name: Enforce Go Formatted Code
command: "[ `go fmt ./... | wc -l` -eq 0 ]"
- save_cache: # restores saved cache if no changes are detected since last run
key: linux-go-{{ checksum "go.sum" }}-<< pipeline.parameters.cache-key >>
paths:
- /home/circleci/go/pkg/mod
integration-tests:
docker:
- image: cimg/go:<< pipeline.parameters.gover >>
environment: # environment variables for the build itself
TEST_RESULTS: /tmp/test-results
GOTESTSUM_FORMAT: testname
BIND_DOMAIN: example.com
# FYI: Hexonet provides these credentials for use for public testing. They give access to a test area, not a real system. It is not a security issue to expose them.
#
# FYI: The domain name name was selected at random. If it stops working, this command will list domains to choose from:
# echo '{ "hexo": { "apientity": "OTE", "apilogin": "test.user", "apipassword": "test.passw0rd" } }' > hexo-creds.json ; dnscontrol get-zones --creds hexo-creds.json --format=nameonly hexo HEXONET all
HEXONET_DOMAIN: a-b-c-music.com
HEXONET_ENTITY: OTE
HEXONET_PW: test.passw0rd
HEXONET_UID: test.user
AZURE_DNS_RESOURCE_GROUP: DNSControl
GCLOUD_EMAIL: dnscontrol@dnscontrol-dev.iam.gserviceaccount.com
GCLOUD_PROJECT: dnscontrol-dev
GCLOUD_TYPE: service_account
NAMEDOTCOM_URL: api.name.com
NAMEDOTCOM_USER: dnscontroltest
parameters:
provider:
type: string
steps:
- checkout
- run: mkdir -p "$TEST_RESULTS"
- restore_cache: # restores saved cache if no changes are detected since last run
keys:
- linux-go-{{ checksum "go.sum" }}-<< pipeline.parameters.cache-key >>
- run:
name: Run integration tests for << parameters.provider >> provider
working_directory: integrationTest
no_output_timeout: 32m
command: |
if [ -n "$<< parameters.provider >>_DOMAIN" ] ; then
gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- -timeout 30m -v -verbose -provider << parameters.provider >> -cfworkers=false
else
echo "Skip test for << parameters.provider >> provider"
fi
- store_test_results: # upload test results for display in Test Summary
path: /tmp/test-results
release:
docker:
- image: cimg/go:<< pipeline.parameters.gover >>
resource_class: 2xlarge
steps:
- checkout
- setup_remote_docker:
version: 20.10.11
docker_layer_caching: true
- docker/check:
docker-username: DOCKERHUB_USERNAME
docker-password: DOCKERHUB_ACCESS_TOKEN
- restore_cache: # restores saved cache if no changes are detected since last run
keys:
- linux-go-{{ checksum "go.sum" }}-<< pipeline.parameters.cache-key >>
- run:
name: Install goreleaser
command: go install github.com/goreleaser/goreleaser@latest
- run: goreleaser release
- store_artifacts:
path: dist
- persist_to_workspace:
root: dist
paths:
- '*.rpm'
- '*.deb'
upload:
docker:
- image: cimg/python:3.10
parameters:
arch:
type: enum
enum: ["i386", "amd64", "arm64", "x86_64"]
format:
type: enum
enum: ["deb", "rpm"]
distro:
type: string
steps:
- attach_workspace:
at: .
- cloudsmith/ensure-api-key
- cloudsmith/install-cli
- cloudsmith/publish:
cloudsmith-repository: stackoverflow/dnscontrol
package-format: << parameters.format >>
# dnscontrol-3.18.2-next.arm64.deb
package-path: dnscontrol-*.<< parameters.arch >>.<< parameters.format >>
package-distribution: '<< parameters.distro >>'
workflows:
version: 2
build:
jobs:
- build:
filters: # required since `release` has tag filters AND requires `build`
tags:
only: /.*/
- integration-tests:
requires: [build]
context: DNSProviders
matrix:
parameters:
provider:
# Providers that don't require secrets: (alphabetical)
- BIND
- HEXONET
# Providers designated "officially supported": (alphabetical)
- AZURE_DNS
- CLOUDFLAREAPI
- GCLOUD
- NAMEDOTCOM
- ROUTE53
# All others: (alphabetical)
- CLOUDNS
- DIGITALOCEAN
- GANDI_V5
- HEDNS
- INWX
- POWERDNS
filters:
branches:
ignore: [master, main]
- release:
requires: [build]
context: [DNSControl]
# Only run this job on git tag pushes
filters:
branches:
ignore: /.*/
tags:
only: /v[0-9]+(\.[0-9]+)*(-.*)*/
- upload:
name: upload dnscontrol_<< matrix.arch >>.rpm
requires: [release]
context: [StackExchange]
format: rpm
distro: fedora/25
matrix:
parameters:
arch: ["i386", "x86_64", "arm64"]
# Only run this job on git tag pushes
filters:
branches:
ignore: /.*/
tags:
only: /v[0-9]+(\.[0-9]+)*(-.*)*/
- upload:
name: upload dnscontrol_<< matrix.arch >>.deb
requires: [release]
context: [StackExchange]
format: deb
distro: debian/buster
matrix:
parameters:
arch: ["i386", "amd64", "arm64"]
# Only run this job on git tag pushes
filters:
branches:
ignore: /.*/
tags:
only: /v[0-9]+(\.[0-9]+)*(-.*)*/