secrets-store-csi-driver-pr.../Makefile

274 строки
9.6 KiB
Makefile

-include secrets.env
export $(shell test -f secrets.env && sed 's/=.*//' secrets.env)
ORG_PATH=github.com/Azure
PROJECT_NAME := secrets-store-csi-driver-provider-azure
REPO_PATH="$(ORG_PATH)/$(PROJECT_NAME)"
REGISTRY_NAME ?= upstream
REPO_PREFIX ?= k8s/csi/secrets-store
REGISTRY ?= $(REGISTRY_NAME).azurecr.io/$(REPO_PREFIX)
IMAGE_VERSION ?= v1.6.0
IMAGE_NAME ?= provider-azure
CONFORMANCE_IMAGE_NAME ?= provider-azure-arc-conformance
IMAGE_TAG := $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)
CONFORMANCE_IMAGE_TAG := $(REGISTRY)/$(CONFORMANCE_IMAGE_NAME):$(IMAGE_VERSION)
# build variables
BUILD_DATE=$$(date +%Y-%m-%d-%H:%M)
BUILD_COMMIT := $$(git rev-parse --short HEAD)
BUILD_DATE_VAR := $(REPO_PATH)/pkg/version.BuildDate
BUILD_VERSION_VAR := $(REPO_PATH)/pkg/version.BuildVersion
VCS_VAR := $(REPO_PATH)/pkg/version.Vcs
LDFLAGS ?= "-X $(BUILD_DATE_VAR)=$(BUILD_DATE) -X $(BUILD_VERSION_VAR)=$(IMAGE_VERSION) -X $(VCS_VAR)=$(BUILD_COMMIT)"
GO_FILES=$(shell go list ./... | grep -v /test/e2e)
ALL_DOCS := $(shell find . -name '*.md' -type f | sort)
TOOLS_MOD_DIR := ./tools
TOOLS_DIR := $(abspath ./.tools)
TOOLS_BIN_DIR := $(abspath $(TOOLS_DIR)/bin)
GO111MODULE = on
DOCKER_CLI_EXPERIMENTAL = enabled
export GOPATH GOBIN GO111MODULE DOCKER_CLI_EXPERIMENTAL
# Generate all combination of all OS, ARCH, and OSVERSIONS for iteration
ALL_OS = linux windows
ALL_ARCH.linux = amd64 arm64
ALL_OS_ARCH.linux = $(foreach arch, ${ALL_ARCH.linux}, linux-$(arch))
ALL_ARCH.windows = amd64
ALL_OSVERSIONS.windows := 1809 ltsc2022
ALL_OS_ARCH.windows = $(foreach arch, $(ALL_ARCH.windows), $(foreach osversion, ${ALL_OSVERSIONS.windows}, windows-${osversion}-${arch}))
ALL_OS_ARCH = $(foreach os, $(ALL_OS), ${ALL_OS_ARCH.${os}})
# The current context of image building
# The architecture of the image
ARCH ?= amd64
# OS Version for the Windows images: 1809, ltsc2022
OSVERSION ?= 1809
# Output type of docker buildx build
OUTPUT_TYPE ?= registry
BUILDX_BUILDER_NAME ?= img-builder
# pinning buildkit version to v0.10.6 as v0.11.0 is injecting sbom/prov to manifest
# causing the manifest push to fail
BUILDKIT_VERSION ?= 0.10.6
# step cli version
STEP_CLI_VERSION=0.18.0
# E2E test variables
KIND_VERSION ?= 0.21.0
KIND_K8S_VERSION ?= v1.29.2
SHELLCHECK_VER ?= v0.8.0
$(TOOLS_DIR)/golangci-lint: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
cd $(TOOLS_MOD_DIR) && \
go build -o $(TOOLS_DIR)/golangci-lint github.com/golangci/golangci-lint/cmd/golangci-lint
$(TOOLS_DIR)/misspell: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
cd $(TOOLS_MOD_DIR) && \
go build -o $(TOOLS_DIR)/misspell github.com/client9/misspell/cmd/misspell
$(TOOLS_DIR)/mockgen: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
cd $(TOOLS_MOD_DIR) && \
go build -o $(TOOLS_DIR)/$(MOCKGEN) github.com/golang/mock/mockgen
SHELLCHECK := $(TOOLS_BIN_DIR)/shellcheck-$(SHELLCHECK_VER)
$(SHELLCHECK): OS := $(shell uname | tr '[:upper:]' '[:lower:]')
$(SHELLCHECK): ARCH := $(shell uname -m)
$(SHELLCHECK):
mkdir -p $(TOOLS_BIN_DIR)
rm -rf "$(SHELLCHECK)*"
curl -sfOL "https://github.com/koalaman/shellcheck/releases/download/$(SHELLCHECK_VER)/shellcheck-$(SHELLCHECK_VER).$(OS).$(ARCH).tar.xz"
tar xf shellcheck-$(SHELLCHECK_VER).$(OS).$(ARCH).tar.xz
cp "shellcheck-$(SHELLCHECK_VER)/shellcheck" "$(SHELLCHECK)"
ln -sf "$(SHELLCHECK)" "$(TOOLS_BIN_DIR)/shellcheck"
chmod +x "$(TOOLS_BIN_DIR)/shellcheck" "$(SHELLCHECK)"
rm -rf shellcheck*
.PHONY: lint
lint: $(TOOLS_DIR)/golangci-lint $(TOOLS_DIR)/misspell
$(TOOLS_DIR)/golangci-lint run --timeout=5m -v
$(TOOLS_DIR)/misspell $(ALL_DOCS)
.PHONY: shellcheck
shellcheck: $(SHELLCHECK)
find . -name '*.sh' | xargs $(SHELLCHECK)
.PHONY: unit-test
unit-test:
CGO_ENABLED=1 go test -race -coverprofile=coverage.txt -covermode=atomic $(GO_FILES) -v
.PHONY: build
build:
CGO_ENABLED=0 GOARCH=${ARCH} GOOS=linux go build -a -ldflags ${LDFLAGS} -o _output/${ARCH}/secrets-store-csi-driver-provider-azure ./cmd/
.PHONY: build-e2e-test
build-e2e-test:
ARCH=${ARCH} make -C test/e2e/ build
.PHONY: build-windows
build-windows:
CGO_ENABLED=0 GOARCH=${ARCH} GOOS=windows go build -a -ldflags ${LDFLAGS} -o _output/${ARCH}/secrets-store-csi-driver-provider-azure.exe ./cmd/
.PHONY: build-darwin
build-darwin:
CGO_ENABLED=0 GOARCH=${ARCH} GOOS=darwin go build -a -ldflags ${LDFLAGS} -o _output/${ARCH}/secrets-store-csi-driver-provider-azure ./cmd/
.PHONY: container
container: build
docker buildx build --platform="linux/$(ARCH)" --no-cache -t $(IMAGE_TAG) -f Dockerfile --progress=plain .
.PHONY: arc-conformance-container
arc-conformance-container: docker-buildx-builder build-e2e-test
docker buildx build \
--no-cache \
--platform="linux/$(ARCH)" \
--output=type=$(OUTPUT_TYPE) \
--build-arg STEP_CLI_VERSION=$(STEP_CLI_VERSION) \
-t $(CONFORMANCE_IMAGE_TAG)-linux-$(ARCH) -f arc/conformance/plugin/Dockerfile .
.PHONY: container-linux
container-linux: docker-buildx-builder
docker buildx build \
--no-cache \
--output=type=$(OUTPUT_TYPE) \
--platform="linux/$(ARCH)" \
-t $(IMAGE_TAG)-linux-$(ARCH) -f Dockerfile .
.PHONY: container-windows
container-windows: docker-buildx-builder
docker buildx build \
--no-cache \
--output=type=$(OUTPUT_TYPE) \
--platform="windows/amd64" \
--build-arg OSVERSION=$(OSVERSION) \
-t $(IMAGE_TAG)-windows-$(OSVERSION)-$(ARCH) -f windows.Dockerfile .
.PHONY: docker-buildx-builder
docker-buildx-builder:
@if ! docker buildx ls | grep $(BUILDX_BUILDER_NAME); then \
docker buildx create --driver-opt image=mcr.microsoft.com/oss/moby/buildkit:$(BUILDKIT_VERSION) --name $(BUILDX_BUILDER_NAME) --use; \
docker buildx inspect $(BUILDX_BUILDER_NAME) --bootstrap; \
fi
.PHONY: container-all
container-all: build-windows
for arch in $(ALL_ARCH.linux); do \
ARCH=$${arch} $(MAKE) build; \
ARCH=$${arch} $(MAKE) container-linux; \
done
for osversion in $(ALL_OSVERSIONS.windows); do \
OSVERSION=$${osversion} $(MAKE) container-windows; \
done
.PHONY: push-manifest
push-manifest:
docker manifest create --amend $(IMAGE_TAG) $(foreach osarch, $(ALL_OS_ARCH), $(IMAGE_TAG)-${osarch})
# add "os.version" field to windows images (based on https://github.com/kubernetes/kubernetes/blob/master/build/pause/Makefile)
set -x; \
registry_prefix=$(shell (echo ${REGISTRY} | grep -Eq ".*\/.*") && echo "" || echo "docker.io/"); \
manifest_image_folder=`echo "$${registry_prefix}${IMAGE_TAG}" | sed "s|/|_|g" | sed "s/:/-/"`; \
for arch in $(ALL_ARCH.windows); do \
for osversion in $(ALL_OSVERSIONS.windows); do \
BASEIMAGE=mcr.microsoft.com/windows/nanoserver:$${osversion}; \
full_version=`docker manifest inspect $${BASEIMAGE} | jq -r '.manifests[0].platform["os.version"]'`; \
sed -i -r "s/(\"os\"\:\"windows\")/\0,\"os.version\":\"$${full_version}\"/" "${HOME}/.docker/manifests/$${manifest_image_folder}/$${manifest_image_folder}-windows-$${osversion}-$${arch}"; \
done; \
done
docker manifest push --purge $(IMAGE_TAG)
docker manifest inspect $(IMAGE_TAG)
.PHONY: conformance-container-all
conformance-container-all:
for arch in $(ALL_ARCH.linux); do \
ARCH=$${arch} $(MAKE) arc-conformance-container; \
done
.PHONY: push-conformance-manifest
push-conformance-manifest:
docker manifest create --amend $(CONFORMANCE_IMAGE_TAG) $(foreach osarch, $(ALL_OS_ARCH.linux), $(CONFORMANCE_IMAGE_TAG)-${osarch})
docker manifest push --purge $(CONFORMANCE_IMAGE_TAG)
docker manifest inspect $(CONFORMANCE_IMAGE_TAG)
.PHONY: clean
clean:
go clean -r -x
-rm -rf _output
.PHONY: mod
mod:
@go mod tidy
.PHONY: install-kubectl
install-kubectl:
curl -LO https://dl.k8s.io/release/${KIND_K8S_VERSION}/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv kubectl /usr/local/bin/
.PHONY: e2e-bootstrap
e2e-bootstrap: install-helm
ifdef CI_KIND_CLUSTER
make install-kubectl setup-kind
endif
docker pull $(IMAGE_TAG) || make e2e-container
.PHONY: e2e-container
e2e-container:
ifdef CI_KIND_CLUSTER
$(MAKE) build container
kind load docker-image --name kind $(IMAGE_TAG)
else
$(MAKE) container-all push-manifest
endif
.PHONY: e2e-test
e2e-test:
make -C test/e2e/ run
.PHONY: setup-kind
setup-kind:
curl -L https://github.com/kubernetes-sigs/kind/releases/download/v${KIND_VERSION}/kind-linux-amd64 --output kind && chmod +x kind && sudo mv kind /usr/local/bin/
./scripts/create-kind-cluster.sh
.PHONY: install-helm
install-helm:
helm version --short | grep -q v3 || (curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash)
.PHONY: e2e-local-bootstrap
e2e-local-bootstrap: build
./scripts/create-kind-cluster.sh
$(MAKE) container-all push-manifest
kind load docker-image --name kind $(IMAGE_TAG)
.PHONY: e2e-kind-cleanup
e2e-kind-cleanup:
kind delete cluster --name kind
.PHONY: helm-lint
helm-lint: install-helm
# install driver dep as helm 3.4.0 requires dependencies for helm lint
helm dep update charts/csi-secrets-store-provider-azure
helm dep update manifest_staging/charts/csi-secrets-store-provider-azure
# run lint on helm charts
helm lint --strict charts/csi-secrets-store-provider-azure
helm lint --strict manifest_staging/charts/csi-secrets-store-provider-azure
## --------------------------------------
## Release
## --------------------------------------
.PHONY: promote-staging-manifest
promote-staging-manifest: #promote staging manifests to release dir
@rm -rf deployment
@cp -r manifest_staging/deployment .
@rm -rf charts/csi-secrets-store-provider-azure
@cp -r manifest_staging/charts/csi-secrets-store-provider-azure ./charts
## --------------------------------------
## Code Generation
## --------------------------------------
# Generate code
.PHONY: generate
generate: $(TOOLS_DIR)/mockgen ## Runs Go related generate targets
go generate ./...