diff --git a/.travis.yml b/.travis.yml index dd48012e..b41192f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,38 +5,22 @@ language: go go: - 1.7.x +branches: + only: + - master + - v0.* + env: global: - - IMG_FQDN=quay.io - REPO=cloudnativelabs/kube-router - REPO_PATH=$HOME/gopath/src/github.com/$REPO + - GIT_BRANCH=$TRAVIS_BRANCH + - IMG_FQDN=quay.io script: - - make all - -after_success: # All successfully built commits get an image placed in the kube-router-git # image repo and tagged with the commit hash. - - make push - -deploy: - # Images from Pull Requests get tagged with the PR number. - - provider: script - on: - condition: $TRAVIS_PULL_REQUEST != "false" - skip_cleanup: true - script: - - make push IMG_PREFIX=PR$TRAVIS_PULL_REQUEST- - - # Images from tagged commits get released. - - provider: script - on: - tags: true - # condition: $TRAVIS_PULL_REQUEST == "false" - skip_cleanup: true - script: - - unset IMG_FQDN # Use DockerHub for releases - - make release + - build/travis-deploy.sh # This fixes issues when a contributor uses their own Travis CI account to test # code/CI changes. diff --git a/Makefile b/Makefile index 2d6c0e56..62913797 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,9 @@ NAME?=kube-router DEV_SUFFIX?=-git LOCAL_PACKAGES?=app app/controllers app/options app/watchers IMG_NAMESPACE?=cloudnativelabs -IMG_TAG?=$(shell git describe --tags --dirty) -GIT_BRANCH=$(shell git rev-parse --abbrev-ref HEAD) +GIT_COMMIT=$(shell git describe --tags --dirty) +IMG_TAG?=$(if $(IMG_TAG_PREFIX),$(IMG_TAG_PREFIX)-) +# GIT_BRANCH?=$(shell git rev-parse --abbrev-ref HEAD) RELEASE_TAG?=$(shell build/get-git-tag.sh) REGISTRY?=$(if $(IMG_FQDN),$(IMG_FQDN)/$(IMG_NAMESPACE)/$(NAME),$(IMG_NAMESPACE)/$(NAME)) REGISTRY_DEV?=$(REGISTRY)$(DEV_SUFFIX) @@ -16,7 +17,9 @@ UPSTREAM_IMPORT_PATH=$(GOPATH)/src/github.com/cloudnativelabs/kube-router/ all: test kube-router container ## Default target. Runs tests, builds binaries and images. kube-router: $(shell find . -name \*.go) ## Builds kube-router. + @echo Starting kube-router binary build. CGO_ENABLED=0 go build -o kube-router kube-router.go + @echo Finished kube-router binary build. test: gofmt ## Runs code quality pipelines (gofmt, tests, coverage, lint, etc) @@ -24,33 +27,47 @@ run: kube-router ## Runs "kube-router --help". ./kube-router --help container: kube-router ## Builds a Docker container image. - $(DOCKER) build -t "$(REGISTRY_DEV):$(IMG_PREFIX)$(IMG_TAG)" . + @echo Starting kube-router container image build. + $(DOCKER) build -t "$(REGISTRY_DEV):$(IMG_TAG)" . + @echo Finished kube-router container image build. -docker-login: - @if [ -z "$(NO_DOCKER_LOGIN)" ]; then \ +docker-login: ## Logs into a docker registry using {DOCKER,QUAY}_{USERNAME,PASSWORD} variables. + @echo Starting docker login target. + @if [ -n "$(DOCKER_USERNAME)" ] && [ -n "$(DOCKER_PASSWORD)" ]; then \ + echo Starting DockerHub registry login.; \ $(DOCKER) login -u="$(value DOCKER_USERNAME)" -p="$(value DOCKER_PASSWORD)"; \ + echo Finished DockerHub registry login.; \ fi - @if [ -z "$(NO_QUAY_LOGIN)" ]; then \ + @if [ -n "$(QUAY_USERNAME)" ] && [ -n "$(QUAY_PASSWORD)" ]; then \ + echo Starting quay.io registry login.; \ $(DOCKER) login -u="$(value QUAY_USERNAME)" -p="$(value QUAY_PASSWORD)" quay.io; \ + echo Finished quay.io registry login.; \ fi + @echo Finished docker login target. push: container docker-login ## Pushes a Docker container image to a registry. - $(DOCKER) tag "$(REGISTRY_DEV):$(IMG_TAG)" "$(REGISTRY_DEV):$(GIT_BRANCH)-latest" + @echo Starting kube-router container image push. $(DOCKER) push "$(REGISTRY_DEV)" + @echo Finished kube-router container image push. push-release: push + @echo Starting kube-router release container image push. @test -n "$(RELEASE_TAG)" $(DOCKER) tag "$(REGISTRY_DEV):$(IMG_TAG)" "$(REGISTRY):$(RELEASE_TAG)" $(DOCKER) tag "$(REGISTRY):$(RELEASE_TAG)" "$(REGISTRY):latest" $(DOCKER) push "$(REGISTRY)" + @echo Finished kube-router release container image push. github-release: kube-router + @echo Starting kube-router GitHub release creation. @[ -n "$(value GITHUB_TOKEN)" ] && \ GITHUB_TOKEN=$(value GITHUB_TOKEN); \ curl -sL https://git.io/goreleaser | bash + @echo Finished kube-router GitHub release creation. release: push-release github-release ## Pushes a release to DockerHub and GitHub + @echo Finished kube-router release target. clean: ## Removes the kube-router binary and Docker images rm -f kube-router diff --git a/build/travis-deploy.sh b/build/travis-deploy.sh new file mode 100755 index 00000000..bf04f69f --- /dev/null +++ b/build/travis-deploy.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -o errexit +set -o pipefail + +# Pull Request image tag format: PR00-PRUSER +if [ "${TRAVIS_EVENT_TYPE}" = "pull_request" ]; then + PR_USER=$(echo "$TRAVIS_PULL_REQUEST_SLUG" | sed -e 's/\/.*//') + echo "Building/pushing PR$TRAVIS_PULL_REQUEST from $PR_USER" + make push IMG_TAG="PR$TRAVIS_PULL_REQUEST-$PR_USER" + exit 0 +fi + +# Release image tag format: v0.0.0 and latest +if [ -n "$TRAVIS_TAG" ]; then + echo "Running Release build on Travis" + make release RELEASE_TAG="$TRAVIS_TAG" + exit 0 +fi + +# Push image tag format: COMMIT +echo "Running push build on Travis" +make push diff --git a/build/verify-gofmt.sh b/build/verify-gofmt.sh index bddc3246..05437b84 100755 --- a/build/verify-gofmt.sh +++ b/build/verify-gofmt.sh @@ -1,5 +1,4 @@ #!/usr/bin/env bash - set -o errexit set -o nounset set -o pipefail @@ -22,4 +21,6 @@ if [[ -n "${bad_files}" ]]; then echo "or" echo "Run \"${GOFMT} -w\" on each file." exit 1 +else + echo 'Everything is gofmt approved!' fi