# 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 published on coredns.io. # For example: https://coredns.io/2016/09/18/coredns-001-release/ Also send an # email to coredns-discuss@ to announce the new version. # # Getting the authors for this release is done with the following command line # git log --pretty=format:'%an' v$(VERSION)..master | sort -u # # Steps: # * Up the version in coremain/version.go # * Do a make -f Makefile.doc # * go generate # * Send PR to get this merged. # # * Open an issue for this release # * 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 # * (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! # # To release we run, these target from the this Makefile: # * 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) 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: 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="godeps" 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/$(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 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)"}' "https://api.github.com/repos/$(GITHUB)/$(NAME)/releases?access_token=${GITHUB_ACCESS_TOKEN}" | 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" \ --data-binary "@$$asset" \ "https://uploads.github.com/repos/$(GITHUB)/$(NAME)/releases/$(RELEASE)/assets?name=$${asset}&access_token=${GITHUB_ACCESS_TOKEN}" ; \ 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" \ --data-binary "@$$asset" \ "https://uploads.github.com/repos/$(GITHUB)/$(NAME)/releases/$(RELEASE)/assets?name=$${asset}&access_token=${GITHUB_ACCESS_TOKEN}" ; \ 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