# Makefile for releasing CoreDNS # # The release is controlled from coremain/version.go. The version found there is # used to tag the git repo and to build the assets that are uploaded to github # (after some sanity checks). # # The release should be accompanied by release notes in the notes/ subdirectory. # These are published on coredns.io. For example see: notes/coredns-1.5.1.md # # Getting the authors for this release is done with the following command line # See the 'authors' target. # # git log --pretty=format:'%an' $(git describe --tags --abbrev=0)..master | sort -u # # Getting all pull requests merged since the last tag can be done with this "oneliner" # See the 'prs' target. # # % git log $(git describe --tags --abbrev=0)..HEAD --oneline | awk ' { $1="";print } ' | sed 's/^ //' | sed -e 's|#\([0-9]\)|https://github.com/coredns/coredns/pull/\1|' # # As seen in notes/coredns-1.5.1.md we want to style the notes in the following manner: # # * important changes at the top # * people who committed/review code (the latter is harder to get) # * Slightly abbreviated list of pull requests merged for this release. # # Steps to release, first: # # 1. Up the version in coremain/version.go # 2. Do a make -f Makefile.doc # 3. go generate # 4. Send PR to get this merged. # # Then: # # 1. Open an issue for this release # 2. In an issue give the command: /release master VERSION # Where VERSION is the version of the release - the release script double checks this with the # actual CoreDNS version in coremain/version.go # 3. (to test as release /release -t master VERSION can be used. # # See https://github.com/coredns/release for documentation README on what needs to be setup for this to be # automated (can still be done by hand if needed). Especially what environment variables need to be # set! This further depends on Caddy being setup and [dreck](https://github.com/miekg/dreck) running as a plugin in Caddy. # # To release we run, these target from the this Makefile.release ordered like: # * make release # * make docker # * make github-push # * make docker-push EMPTY:= SPACE:=$(EMPTY) $(EMPTY) COMMA:=$(EMPTY),$(EMPTY) ifeq (, $(shell which curl)) $(error "No curl in $$PATH, please install") endif DOCKER:= NAME:=coredns VERSION:=$(shell grep 'CoreVersion' coremain/version.go | awk '{ print $$3 }' | tr -d '"') GITHUB:=coredns DOCKER_IMAGE_NAME:=$(DOCKER)/$(NAME) # mips is not in LINUX_ARCH because it's not supported by the manifest-tool. LINUX_ARCH:=amd64 arm arm64 ppc64le s390x PLATFORMS:=$(subst $(SPACE),$(COMMA),$(foreach arch,$(LINUX_ARCH),linux/$(arch))) ifeq ($(DOCKER),) $(error "Please specify Docker registry to use. Use DOCKER=coredns for releases") endif all: @echo Use the 'release' target to build a release, 'docker' for docker build. release: pre build tar docker: docker-build .PHONY: pre pre: GO111MODULE=off go get github.com/estesp/manifest-tool .PHONY: build build: @echo Cleaning old builds @rm -rf build && mkdir build @echo Building: darwin/amd64 - $(VERSION) mkdir -p build/darwin/amd64 && $(MAKE) coredns BINARY=build/darwin/amd64/$(NAME) SYSTEM="GOOS=darwin GOARCH=amd64" CHECKS="" BUILDOPTS="" @echo Building: windows/amd64 - $(VERSION) mkdir -p build/windows/amd64 && $(MAKE) coredns BINARY=build/windows/amd64/$(NAME).exe SYSTEM="GOOS=windows GOARCH=amd64" CHECKS="" BUILDOPTS="" @echo Building: linux/mips - $(VERSION) mkdir -p build/linux/mips && $(MAKE) coredns BINARY=build/linux/mips/$(NAME) SYSTEM="GOOS=linux GOARCH=mips" CHECKS="" BUILDOPTS="" @echo Building: linux/mips64le - $(VERSION) mkdir -p build/linux/mips64le && $(MAKE) coredns BINARY=build/linux/mips64le/$(NAME) SYSTEM="GOOS=linux GOARCH=mips64le" CHECKS="" BUILDOPTS="" @echo Building: linux/$(LINUX_ARCH) - $(VERSION) ;\ for arch in $(LINUX_ARCH); do \ mkdir -p build/linux/$$arch && $(MAKE) coredns BINARY=build/linux/$$arch/$(NAME) SYSTEM="GOOS=linux GOARCH=$$arch" CHECKS="" BUILDOPTS="" ;\ done .PHONY: tar tar: @echo Cleaning old releases @rm -rf release && mkdir release tar -zcf release/$(NAME)_$(VERSION)_darwin_amd64.tgz -C build/darwin/amd64 $(NAME) tar -zcf release/$(NAME)_$(VERSION)_windows_amd64.tgz -C build/windows/amd64 $(NAME).exe tar -zcf release/$(NAME)_$(VERSION)_linux_mips.tgz -C build/linux/mips $(NAME) tar -zcf release/$(NAME)_$(VERSION)_linux_mips64le.tgz -C build/linux/mips64le $(NAME) for arch in $(LINUX_ARCH); do \ tar -zcf release/$(NAME)_$(VERSION)_linux_$$arch.tgz -C build/linux/$$arch $(NAME) ;\ done .PHONY: github-push github-push: @echo Releasing: $(VERSION) @$(eval RELEASE:=$(shell curl -s -d '{"tag_name": "v$(VERSION)", "name": "v$(VERSION)"}' -H "Authorization: token ${GITHUB_ACCESS_TOKEN}" "https://api.github.com/repos/$(GITHUB)/$(NAME)/releases" | grep -m 1 '"id"' | tr -cd '[[:digit:]]')) @echo ReleaseID: $(RELEASE) @( cd release; for asset in `ls -A *tgz`; do \ echo $$asset; \ curl -o /dev/null -X POST \ -H "Content-Type: application/gzip" \ -H "Authorization: token ${GITHUB_ACCESS_TOKEN}" \ --data-binary "@$$asset" \ "https://uploads.github.com/repos/$(GITHUB)/$(NAME)/releases/$(RELEASE)/assets?name=$${asset}" ; \ done ) @( cd release; for asset in `ls -A *tgz`; do \ sha256sum $$asset > $$asset.sha256; \ done ) @( cd release; for asset in `ls -A *sha256`; do \ echo $$asset; \ curl -o /dev/null -X POST \ -H "Content-Type: text/plain" \ -H "Authorization: token ${GITHUB_ACCESS_TOKEN}" \ --data-binary "@$$asset" \ "https://uploads.github.com/repos/$(GITHUB)/$(NAME)/releases/$(RELEASE)/assets?name=$${asset}" ; \ done ) .PHONY: docker-build docker-build: tar @# Steps: @# 1. Copy appropriate coredns binary to build/docker/linux/ @# 2. Copy Dockerfile to build/docker/linux/ @rm -rf build/docker for arch in $(LINUX_ARCH); do \ mkdir -p build/docker/linux/$$arch ;\ tar -xzf release/$(NAME)_$(VERSION)_linux_$$arch.tgz -C build/docker/linux/$$arch ;\ cp Dockerfile build/docker/linux/$$arch ;\ docker build -t coredns build/docker/linux/$$arch ;\ docker tag coredns $(DOCKER_IMAGE_NAME):coredns-$$arch ;\ done .PHONY: docker-push docker-push: @echo $(DOCKER_PASSWORD) | docker login -u $(DOCKER_LOGIN) --password-stdin @echo Pushing: $(VERSION) to $(DOCKER_IMAGE_NAME) for arch in $(LINUX_ARCH); do \ docker push $(DOCKER_IMAGE_NAME):coredns-$$arch ;\ done manifest-tool push from-args --platforms $(PLATFORMS) --template $(DOCKER_IMAGE_NAME):coredns-ARCH --target $(DOCKER_IMAGE_NAME):$(VERSION) manifest-tool push from-args --platforms $(PLATFORMS) --template $(DOCKER_IMAGE_NAME):coredns-ARCH --target $(DOCKER_IMAGE_NAME):latest .PHONY: version version: @echo $(VERSION) .PHONY: clean clean: rm -rf release rm -rf build .PHONY: prs prs: git log $$(git describe --tags --abbrev=0)..HEAD --oneline | awk ' { $$1="";print } ' | sed 's/^ //' | sed -e 's|#\([0-9]\)|https://github.com/coredns/coredns/pull/\1|' | \ grep -v '^build(deps)' | \ grep -v '^auto go mod tidy' .PHONY: authors authors: git log --pretty=format:'%an' $$(git describe --tags --abbrev=0)..master | sort -u