diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..d7aa35e --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,86 @@ +# Use the latest 2.1 version of CircleCI pipeline process engine. +# See: https://circleci.com/docs/configuration-reference +version: 2.1 + +orbs: + go: circleci/go@1.9.0 + +# Define a job to be invoked later in a workflow. +# See: https://circleci.com/docs/configuration-reference/#jobs +jobs: + build-and-test: + executor: + name: go/default # Use the default executor from the orb + tag: '1.21.4' # Specify a version tag + # Add steps to the job + # See: https://circleci.com/docs/configuration-reference/#steps + steps: + - checkout + - go/load-cache # Load cached Go modules. + - go/mod-download # Run 'go mod download'. + - go/save-cache # Save Go modules to cache. + - run: + name: "install goveralls" + command: go get -v github.com/mattn/goveralls + - run: + name: "install terminal" + command: go get -v golang.org/x/crypto/ssh/terminal + - run: + name: "setup" + command: make setup + - run: + name: "build and test" + command: make build junit-test test-race check bench-race coveralls + - store_test_results: + path: test-report.xml + docker-buildx: + docker: # executor type + - image: cimg/base:stable # primary container will run the latest, production-ready base image + steps: + - checkout + - setup_remote_docker: + docker_layer_caching: true + - run: + name: Docker build + command: | + docker login -u="$DOCKERHUB_USERNAME" -p="$DOCKERHUB_PASSWORD" + make dockerx + release: + docker: # executor type + - image: cimg/base:stable # primary container will run the latest, production-ready base image + steps: + - checkout + - setup_remote_docker: + docker_layer_caching: true + - run: + name: Docker push + command: | + if [ ! -z "$CIRCLE_TAG" ]; then + docker login -u="$DOCKERHUB_USERNAME" -p="$DOCKERHUB_PASSWORD" + echo "Executing release on tag build $CIRCLE_TAG" + if [ "$CIRCLE_TAG" = "dev" ]; then + make release-dev + else + make release-ci + fi + else + echo "Not executing release on non-tag build" + fi + +# Orchestrate jobs using workflows +# See: https://circleci.com/docs/configuration-reference/#workflows +workflows: + kube2iam-workflow: + jobs: + - build-and-test + - docker-buildx + - release: + requires: + - build-and-test + - docker-buildx + filters: + branches: + only: + - master + - /release-[\w\.]+/ + diff --git a/Makefile b/Makefile index ad9f721..76ff8f1 100644 --- a/Makefile +++ b/Makefile @@ -10,21 +10,22 @@ GIT_HASH := $$(git rev-parse --short HEAD) GOBUILD_VERSION_ARGS := -ldflags "-s -X $(VERSION_VAR)=$(REPO_VERSION) -X $(GIT_VAR)=$(GIT_HASH) -X $(BUILD_DATE_VAR)=$(BUILD_DATE)" # useful for other docker repos DOCKER_REPO ?= jtblin -CPU_ARCH ?= amd64 +CPU_ARCH ?= arm64 IMAGE_NAME := $(DOCKER_REPO)/$(BINARY_NAME)-$(CPU_ARCH) MANIFEST_NAME := $(DOCKER_REPO)/$(BINARY_NAME) ARCH ?= darwin GOLANGCI_LINT_VERSION ?= v1.23.8 GOLANGCI_LINT_CONCURRENCY ?= 4 GOLANGCI_LINT_DEADLINE ?= 180 +PLATFORMS ?= linux/arm/v7,linux/arm64/v8,linux/amd64 # useful for passing --build-arg http_proxy :) DOCKER_BUILD_FLAGS := setup: - go get -v -u golang.org/x/tools/cmd/goimports - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $$(go env GOPATH)/bin v1.23.8 - go get -v -u github.com/jstemmer/go-junit-report - go get -v github.com/mattn/goveralls + go install golang.org/x/tools/cmd/goimports@latest + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $$(go env GOPATH)/bin v1.55.2 + go install github.com/jstemmer/go-junit-report/v2@latest + go install github.com/mattn/goveralls@latest build: *.go fmt go build -o build/bin/$(ARCH)/$(BINARY_NAME) $(GOBUILD_VERSION_ARGS) github.com/jtblin/$(BINARY_NAME)/cmd @@ -58,9 +59,9 @@ cover: coveralls: ./cover.sh - goveralls -coverprofile=coverage.out -service=travis-ci + goveralls -coverprofile=coverage.out -service=circle-ci -repotoken=$(COVERALLS_TOKEN) -junit-test: build +junit-test: go test -v ./... | go-junit-report > test-report.xml check: @@ -71,14 +72,16 @@ check-all: go install ./cmd golangci-lint run --enable=gocyclo --concurrency=$(GOLANGCI_LINT_CONCURRENCY) --deadline=600s -travis-checks: build test-race check bench-race - docker: docker build -t $(IMAGE_NAME):$(GIT_HASH) . $(DOCKER_BUILD_FLAGS) -docker-dev: docker - docker tag $(IMAGE_NAME):$(GIT_HASH) $(IMAGE_NAME):dev - docker push $(IMAGE_NAME):dev +dockerx: + docker buildx create --name multiarch --use + docker buildx build --push --platform $(PLATFORMS) -t $(MANIFEST_NAME):$(GIT_HASH) . $(DOCKER_BUILD_FLAGS) + +release-dev: + docker tag $(MANIFEST_NAME):$(GIT_HASH) $(MANIFEST_NAME):dev + docker push $(MANIFEST_NAME):dev release: check test docker docker push $(IMAGE_NAME):$(GIT_HASH) @@ -89,20 +92,24 @@ ifeq (, $(findstring -rc, $(REPO_VERSION))) docker push $(IMAGE_NAME):latest endif -release-manifest: - for tag in latest $(REPO_VERSION); do \ - for arch in amd64 arm64; do \ - docker pull $(MANIFEST_NAME)-$$arch:$$tag; \ - done; \ - docker manifest create $(MANIFEST_NAME):$$tag --amend \ - $(MANIFEST_NAME)-amd64:$$tag \ - $(MANIFEST_NAME)-arm64:$$tag; \ - docker manifest push $(MANIFEST_NAME):$$tag; \ - done +release-ci: + docker tag $(MANIFEST_NAME):$(GIT_HASH) $(MANIFEST_NAME):$(REPO_VERSION) + docker push $(MANIFEST_NAME):$(REPO_VERSION) +ifeq (, $(findstring -rc, $(REPO_VERSION))) + docker tag $(MANIFEST_NAME):$(GIT_HASH) $(MANIFEST_NAME):latest + docker push $(MANIFEST_NAME):latest +endif version: @echo $(REPO_VERSION) +info-release: + @echo IMAGE_NAME=$(IMAGE_NAME) + @echo GIT_HASH=$(GIT_HASH) + @echo REPO_VERSION=$(REPO_VERSION) + @echo MANIFEST_NAME=$(MANIFEST_NAME) + @echo PLATFORMS=$(PLATFORMS) + clean: rm -rf build/bin/*