From 5fd279577c727b1586bda1dc99ef51dc9eb74370 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Tue, 23 May 2023 13:59:01 -0400 Subject: [PATCH] update Makefile and goreleaser config for more generic builds Signed-off-by: Joe Lanford --- .goreleaser.yml | 80 +++++------------- controller.Dockerfile => Dockerfile | 0 Makefile | 126 ++++++++++------------------ config/manager/kustomization.yaml | 2 +- 4 files changed, 66 insertions(+), 142 deletions(-) rename controller.Dockerfile => Dockerfile (100%) diff --git a/.goreleaser.yml b/.goreleaser.yml index 10b2d749..18d3ffba 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -18,92 +18,58 @@ builds: - arm64 - ppc64le - s390x + tags: + - "{{ .Env.GO_BUILD_TAGS }}" + mod_timestamp: "{{ .CommitTimestamp }}" + asmflags: + - all=-trimpath={{ dir .Env.PWD }} + gcflags: + - all=-trimpath={{ dir .Env.PWD }} ldflags: - -X {{ .Env.VERSION_PKG }}.gitVersion={{ .Env.GIT_VERSION }} - # TODO: When the apiserver is working properly, uncomment this - # - id: catalogd-server - # main: ./cmd/apiserver/ - # binary: bin/apiserver - # goos: - # - linux - # goarch: - # - amd64 - # - arm64 - # - ppc64le - # - s390x - # ldflags: - # - -X {{ .Env.VERSION_PKG }}.gitVersion={{ .Env.GIT_VERSION }} - # - -X {{ .Env.VERSION_PKG }}.gitCommit={{ .Env.GIT_COMMIT }} - # - -X {{ .Env.VERSION_PKG }}.gitTreeState={{ .Env.GIT_TREE_STATE }} - # - -X {{ .Env.VERSION_PKG }}.commitDate={{ .Env.COMMIT_DATE }} + - -X {{ .Env.VERSION_PKG }}.gitCommit={{ .Env.GIT_COMMIT }} + - -X {{ .Env.VERSION_PKG }}.gitTreeState={{ .Env.GIT_TREE_STATE }} + - -X {{ .Env.VERSION_PKG }}.commitDate={{ .CommitTimestamp }} dockers: - image_templates: - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" - dockerfile: controller.Dockerfile + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + dockerfile: Dockerfile goos: linux goarch: amd64 use: buildx build_flag_templates: - "--platform=linux/amd64" - image_templates: - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" - dockerfile: controller.Dockerfile + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + dockerfile: Dockerfile goos: linux goarch: arm64 use: buildx build_flag_templates: - "--platform=linux/arm64" - image_templates: - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" - dockerfile: controller.Dockerfile + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + dockerfile: Dockerfile goos: linux goarch: ppc64le use: buildx build_flag_templates: - "--platform=linux/ppc64le" - image_templates: - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" - dockerfile: controller.Dockerfile + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" + dockerfile: Dockerfile goos: linux goarch: s390x use: buildx build_flag_templates: - "--platform=linux/s390x" -# TODO: When the apiserver is working properly, uncomment this: -# - image_templates: -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" -# dockerfile: apiserver.Dockerfile -# goos: linux -# goarch: amd64 -# - image_templates: -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" -# dockerfile: apiserver.Dockerfile -# goos: linux -# goarch: arm64 -# - image_templates: -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" -# dockerfile: apiserver.Dockerfile -# goos: linux -# goarch: ppc64le -# - image_templates: -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" -# dockerfile: apiserver.Dockerfile -# goos: linux -# goarch: s390x docker_manifests: -- name_template: "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}" +- name_template: "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}" image_templates: - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" - - "{{ .Env.CONTROLLER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" -# TODO: When the apiserver is working properly, uncomment this: -# - name_template: "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}" -# image_templates: -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" -# - "{{ .Env.APISERVER_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + - "{{ .Env.IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" release: disable: '{{ ne .Env.ENABLE_RELEASE_PIPELINE "true" }}' extra_files: diff --git a/controller.Dockerfile b/Dockerfile similarity index 100% rename from controller.Dockerfile rename to Dockerfile diff --git a/Makefile b/Makefile index 6f5daaa8..06725e0f 100644 --- a/Makefile +++ b/Makefile @@ -1,26 +1,13 @@ # Build info -GIT_COMMIT ?= $(shell git rev-parse HEAD) -GIT_VERSION ?= $(shell git describe --tags --always --dirty) -GIT_STATUS ?= $(shell git status --porcelain) -GIT_TREE_STATE ?= $(shell [ -z "${GIT_STATUS}" ] && echo "clean" || echo "dirty") -COMMIT_DATE ?= $(shell git show -s --date=format:'%Y-%m-%dT%H:%M:%SZ' --format=%cd) -ORG ?= github.com/operator-framework -REPO ?= $(ORG)/catalogd -VERSION_PKG ?= $(REPO)/internal/version -CTRL_LDFLAGS ?= -ldflags="-X '$(VERSION_PKG).gitVersion=$(GIT_VERSION)'" -SERVER_LDFLAGS ?= -ldflags "-X '$(VERSION_PKG).gitVersion=$(GIT_VERSION)' -X '$(VERSION_PKG).gitCommit=$(GIT_COMMIT)' -X '$(VERSION_PKG).gitTreeState=$(GIT_TREE_STATE)' -X '$(VERSION_PKG).commitDate=$(COMMIT_DATE)'" -GO_BUILD_TAGS ?= upstream -# Image URL to use all building/pushing controller image targets -CONTROLLER_IMG ?= quay.io/operator-framework/catalogd-controller -# Image URL to use all building/pushing apiserver image targets -# TODO: When the apiserver is working properly, uncomment this line: -# SERVER_IMG ?= quay.io/operator-framework/catalogd-server -# Tag to use when building/pushing images -IMG_TAG ?= devel -## Location to build controller/apiserver binaries in -LOCALBIN ?= $(shell pwd)/bin -$(LOCALBIN): - mkdir -p $(LOCALBIN) +export GO_BUILD_TAGS ?= upstream +export GIT_COMMIT ?= $(shell git rev-parse HEAD) +export GIT_VERSION ?= $(shell git describe --tags --always --dirty) +export GIT_TREE_STATE ?= $(shell [ -z "$(shell git status --porcelain)" ] && echo "clean" || echo "dirty") +export VERSION_PKG ?= $(shell go list -m)/internal/version + +export IMAGE_REPO ?= quay.io/operator-framework/catalogd +export IMAGE_TAG ?= devel +IMAGE=$(IMAGE_REPO):$(IMAGE_TAG) # Dependencies @@ -64,7 +51,7 @@ fmt: ## Run go fmt against code. .PHONY: vet vet: ## Run go vet against code. - go vet ./... + go vet -tags $(GO_BUILD_TAGS) ./... .PHONY: test test-unit: generate fmt vet setup-envtest ## Run tests. @@ -75,89 +62,69 @@ tidy: ## Update dependencies go mod tidy .PHONY: verify -verify: tidy fmt generate ## Verify the current code generation and lint +verify: tidy fmt vet generate ## Verify the current code generation and lint git diff --exit-code ##@ Build -.PHONY: build-controller -build-controller: generate fmt vet ## Build manager binary. - CGO_ENABLED=0 GOOS=linux go build -tags $(GO_BUILD_TAGS) $(CTRL_LDFLAGS) -o bin/manager cmd/manager/main.go +BINARIES=manager +LINUX_BINARIES=$(join $(addprefix linux/,$(BINARIES)), ) -# TODO: When the apiserver is working properly, uncomment this target: -# .PHONY: build-server -# build-server: fmt vet ## Build api-server binary. -# CGO_ENABLED=0 GOOS=linux go build -tags $(GO_BUILD_TAGS) $(SERVER_LDFLAGS) -o bin/apiserver cmd/apiserver/main.go +BUILDCMD = sh -c 'mkdir -p $(BUILDBIN) && $(GORELEASER) build $(GORELEASER_ARGS) --single-target -o $(BUILDBIN)/$(notdir $@)' +BUILDDEPS = goreleaser -.PHONY: run -run: generate fmt vet ## Run a controller from your host. - go run ./main.go +.PHONY: build +build: $(BINARIES) ## Build all project binaries for the local OS and architecture. -.PHONY: docker-build-controller -docker-build-controller: build-controller test ## Build docker image with the controller manager. - docker build -f controller.Dockerfile -t ${CONTROLLER_IMG}:${IMG_TAG} bin/ +.PHONY: build-linux +build-linux: $(LINUX_BINARIES) ## Build all project binaries for GOOS=linux and the local architecture. -.PHONY: docker-push-controller -docker-push-controller: ## Push docker image with the controller manager. - docker push ${CONTROLLER_IMG} +.PHONY: $(BINARIES) +$(BINARIES): BUILDBIN = bin +$(BINARIES): $(BUILDDEPS) + $(BUILDCMD) -# TODO: When the apiserver is working properly, uncomment the 2 targets below: -# .PHONY: docker-build-server -# docker-build-server: build-server test ## Build docker image with the apiserver. -# docker build -f apiserver.Dockerfile -t ${SERVER_IMG}:${IMG_TAG} bin/ +.PHONY: $(LINUX_BINARIES) +$(LINUX_BINARIES): BUILDBIN = bin/linux +$(LINUX_BINARIES): $(BUILDDEPS) + GOOS=linux $(BUILDCMD) + +.PHONY: run +run: generate kind-cluster install ## Create a kind cluster and install a local build of catalogd -# .PHONY: docker-push-server -# docker-push-server: ## Push docker image with the apiserver. -# docker push ${SERVER_IMG} +.PHONY: build-container +build-container: build-linux ## Build docker image for catalogd. + docker build -f Dockerfile -t $(IMAGE) bin/linux ##@ Deploy .PHONY: kind-cluster kind-cluster: kind kind-cluster-cleanup ## Standup a kind cluster - $(KIND) create cluster --name ${KIND_CLUSTER_NAME} - $(KIND) export kubeconfig --name ${KIND_CLUSTER_NAME} + $(KIND) create cluster --name $(KIND_CLUSTER_NAME) + $(KIND) export kubeconfig --name $(KIND_CLUSTER_NAME) .PHONY: kind-cluster-cleanup kind-cluster-cleanup: kind ## Delete the kind cluster - $(KIND) delete cluster --name ${KIND_CLUSTER_NAME} + $(KIND) delete cluster --name $(KIND_CLUSTER_NAME) -# TODO: When the apiserver is working properly, add this line back to the end of this target: -# $(KIND) load docker-image $(SERVER_IMG):${IMG_TAG} --name $(KIND_CLUSTER_NAME) .PHONY: kind-load kind-load: kind ## Load the built images onto the local cluster - $(KIND) export kubeconfig --name ${KIND_CLUSTER_NAME} - $(KIND) load docker-image $(CONTROLLER_IMG):${IMG_TAG} --name $(KIND_CLUSTER_NAME) + $(KIND) export kubeconfig --name $(KIND_CLUSTER_NAME) + $(KIND) load docker-image $(IMAGE) --name $(KIND_CLUSTER_NAME) -# TODO: When the apiserver is working properly, add the `docker-build-server` and `cert-manager` targets back as a dependency to this target: .PHONY: install -install: docker-build-controller kind-load deploy wait ## Install local catalogd +install: build-container kind-load deploy wait ## Install local catalogd -# TODO: When the apiserver is working properly, add this line back after the manager edit: -# cd config/apiserver && $(KUSTOMIZE) edit set image apiserver=${SERVER_IMG}:${IMG_TAG} .PHONY: deploy -deploy: kustomize ## Deploy Catalog controller and ApiServer to the K8s cluster specified in ~/.kube/config. - cd config/manager && $(KUSTOMIZE) edit set image controller=${CONTROLLER_IMG}:${IMG_TAG} +deploy: kustomize ## Deploy Catalogd to the K8s cluster specified in ~/.kube/config. + cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMAGE) $(KUSTOMIZE) build config/default | kubectl apply -f - .PHONY: undeploy -undeploy: kustomize ## Undeploy Catalog controller and ApiServer from the K8s cluster specified in ~/.kube/config. +undeploy: kustomize ## Undeploy Catalogd from the K8s cluster specified in ~/.kube/config. $(KUSTOMIZE) build config/default | kubectl delete --ignore-not-found=true -f - -.PHONY: uninstall -uninstall: undeploy ## Uninstall local catalogd - kubectl wait --for=delete namespace/$(CATALOGD_NAMESPACE) --timeout=60s - -# TODO: cert-manager was only needed due to the apiserver. When the apiserver is working properly, uncomment this target -# .PHONY: cert-manager -# cert-manager: ## Deploy cert-manager on the cluster -# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/$(CERT_MGR_VERSION)/cert-manager.yaml -# kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager-webhook --timeout=60s - -# TODO: When the apiserver is working properly, add the following lines to this target: -# kubectl wait --for=condition=Available --namespace=$(CATALOGD_NAMESPACE) deployment/catalogd-apiserver --timeout=60s -# kubectl rollout status --watch --namespace=$(CATALOGD_NAMESPACE) statefulset/catalogd-etcd --timeout=60s - wait: kubectl wait --for=condition=Available --namespace=$(CATALOGD_NAMESPACE) deployment/catalogd-controller-manager --timeout=60s @@ -165,15 +132,6 @@ wait: export ENABLE_RELEASE_PIPELINE ?= false export GORELEASER_ARGS ?= --snapshot --clean -export CONTROLLER_IMAGE_REPO ?= $(CONTROLLER_IMG) -# TODO: When the apiserver is working properly, uncomment this line: -# export APISERVER_IMAGE_REPO ?= $(SERVER_IMG) -export IMAGE_TAG ?= $(IMG_TAG) -export VERSION_PKG ?= $(VERSION_PKG) -export GIT_VERSION ?= $(GIT_VERSION) -export GIT_COMMIT ?= $(GIT_COMMIT) -export GIT_TREE_STATE ?= $(GIT_TREE_STATE) -export COMMIT_DATE ?= $(COMMIT_DATE) export CERT_MGR_VERSION ?= $(CERT_MGR_VERSION) release: goreleaser ## Runs goreleaser for catalogd. By default, this will run only as a snapshot and will not publish any artifacts unless it is run with different arguments. To override the arguments, run with "GORELEASER_ARGS=...". When run as a github action from a tag, this target will publish a full release. $(GORELEASER) $(GORELEASER_ARGS) diff --git a/config/manager/kustomization.yaml b/config/manager/kustomization.yaml index 8cb43470..11dd667d 100644 --- a/config/manager/kustomization.yaml +++ b/config/manager/kustomization.yaml @@ -4,5 +4,5 @@ apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: - name: controller - newName: quay.io/operator-framework/catalogd-controller + newName: quay.io/operator-framework/catalogd newTag: devel