2021-02-18 10:27:10 +00:00
# set the shell to bash always
2020-12-21 19:31:28 +00:00
SHELL := /bin/bash
2021-02-18 10:27:10 +00:00
# set make and shell flags to exit on errors
MAKEFLAGS += --warn-undefined-variables
2020-12-21 19:31:28 +00:00
.SHELLFLAGS := -euo pipefail -c
2021-02-18 10:27:10 +00:00
2021-07-21 15:00:43 +00:00
ARCH = amd64 arm64
BUILD_ARGS ?=
2021-02-18 10:27:10 +00:00
# default target is build
2020-12-21 19:31:28 +00:00
.DEFAULT_GOAL := all
2021-02-18 10:27:10 +00:00
.PHONY : all
2021-07-21 15:00:43 +00:00
all : $( addprefix build -,$ ( ARCH ) )
2021-02-18 10:27:10 +00:00
# Image registry for build/push image targets
IMAGE_REGISTRY ?= ghcr.io/external-secrets/external-secrets
2020-11-23 14:21:01 +00:00
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
CRD_OPTIONS ?= "crd:trivialVersions=true"
2021-03-27 22:14:54 +00:00
CRD_DIR ?= deploy/crds
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
HELM_DIR ?= deploy/charts/external-secrets
OUTPUT_DIR ?= bin
2020-11-23 14:21:01 +00:00
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
i f e q ( , $( shell go env GOBIN ) )
GOBIN = $( shell go env GOPATH) /bin
e l s e
GOBIN = $( shell go env GOBIN)
e n d i f
2021-02-18 10:27:10 +00:00
# check if there are any existing `git tag` values
i f e q ( $( shell git tag ) , )
# no tags found - default to initial tag `v0.0.0`
VERSION := $( shell echo " v0.0.0- $$ (git rev-list HEAD --count)-g $$ (git describe --dirty --always) " | sed 's/-/./2' | sed 's/-/./2' )
e l s e
# use tags
2021-07-21 15:00:43 +00:00
VERSION := $( shell git describe --dirty --always --tags --exclude 'helm*' | sed 's/-/./2' | sed 's/-/./2' )
2021-02-18 10:27:10 +00:00
e n d i f
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
# ====================================================================================
# Colors
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
BLUE := $( shell printf "\033[34m" )
YELLOW := $( shell printf "\033[33m" )
RED := $( shell printf "\033[31m" )
GREEN := $( shell printf "\033[32m" )
CNone := $( shell printf "\033[0m" )
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
# ====================================================================================
# Logger
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
TIME_LONG = ` date +%Y-%m-%d' ' %H:%M:%S`
TIME_SHORT = ` date +%H:%M:%S`
TIME = $( TIME_SHORT)
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
INFO = echo ${ TIME } ${ BLUE } [ .. ] ${ CNone }
WARN = echo ${ TIME } ${ YELLOW } [ WARN] ${ CNone }
ERR = echo ${ TIME } ${ RED } [ FAIL] ${ CNone }
OK = echo ${ TIME } ${ GREEN } [ OK ] ${ CNone }
FAIL = ( echo ${ TIME } ${ RED } [ FAIL] ${ CNone } && false )
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
# ====================================================================================
# Conformance
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
# Ensure a PR is ready for review.
2021-10-20 23:21:05 +00:00
reviewable : generate helm .generate lint
2021-02-18 10:27:10 +00:00
@go mod tidy
# Ensure branch is clean.
check-diff : reviewable
@$( INFO) checking that branch is clean
2021-05-18 16:37:16 +00:00
@test -z " $$ (git status --porcelain) " || ( echo " $$ (git status --porcelain) " && $( FAIL) )
2021-02-18 10:27:10 +00:00
@$( OK) branch is clean
# ====================================================================================
# Golang
.PHONY : test
test : generate ## Run tests
@$( INFO) go test unit-tests
2021-07-12 18:27:48 +00:00
go test -race -v $( shell go list ./... | grep -v e2e) -coverprofile cover.out
2021-04-24 23:39:06 +00:00
@$( OK) go test unit-tests
.PHONY : test .e 2e
test.e2e : generate ## Run e2e tests
@$( INFO) go test e2e-tests
$( MAKE) -C ./e2e test
2021-02-18 10:27:10 +00:00
@$( OK) go test unit-tests
.PHONY : build
2021-07-21 15:00:43 +00:00
build : $( addprefix build -,$ ( ARCH ) )
.PHONY : build -%
build-% : generate ## Build binary for the specified arch
@$( INFO) go build $*
@CGO_ENABLED= 0 GOOS = linux GOARCH = $* \
go build -o '$(OUTPUT_DIR)/external-secrets-linux-$*' main.go
@$( OK) go build $*
2020-11-23 14:21:01 +00:00
2021-02-18 10:27:10 +00:00
# Check install of golanci-lint
lint.check :
2020-12-21 19:31:28 +00:00
@if ! golangci-lint --version > /dev/null 2>& 1; then \
2021-07-23 15:58:22 +00:00
echo -e "\033[0;33mgolangci-lint is not installed: run \`\033[0;32mmake lint.install\033[0m\033[0;33m\` or install it from https://golangci-lint.run\033[0m" ; \
2020-12-21 19:31:28 +00:00
exit 1; \
fi
2021-02-18 10:27:10 +00:00
# installs golangci-lint to the go bin dir
lint.install :
2020-12-21 19:31:28 +00:00
@if ! golangci-lint --version > /dev/null 2>& 1; then \
echo "Installing golangci-lint" ; \
curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | sh -s -- -b $( GOBIN) v1.33.0; \
fi
2021-02-18 10:27:10 +00:00
lint : lint .check ## run golangci-lint
2020-12-21 19:31:28 +00:00
@if ! golangci-lint run; then \
echo -e "\033[0;33mgolangci-lint failed: some checks can be fixed with \`\033[0;32mmake fmt\033[0m\033[0;33m\`\033[0m" ; \
exit 1; \
fi
2021-10-20 23:21:21 +00:00
@$( OK) Finished linting
2020-12-21 19:31:28 +00:00
2021-02-18 10:27:10 +00:00
fmt : lint .check ## ensure consistent code style
@go mod tidy
@go fmt ./...
@golangci-lint run --fix > /dev/null 2>& 1 || true
@$( OK) Ensured consistent code style
2020-12-22 19:12:39 +00:00
2021-03-27 22:14:54 +00:00
generate : ## Generate code and crds
@go run sigs.k8s.io/controller-tools/cmd/controller-gen object:headerFile= "hack/boilerplate.go.txt" paths = "./..."
@go run sigs.k8s.io/controller-tools/cmd/controller-gen $( CRD_OPTIONS) paths = "./..." output:crd:artifacts:config= $( CRD_DIR)
2021-02-18 10:27:10 +00:00
# Remove extra header lines in generated CRDs
@for i in $( CRD_DIR) /*.yaml; do \
tail -n +3 <" $$ i " >" $$ i.bkp " && \
cp " $$ i.bkp " " $$ i " && \
rm " $$ i.bkp " ; \
done
2021-03-27 22:14:54 +00:00
@$( OK) Finished generating deepcopy and crds
2020-12-21 19:31:28 +00:00
2021-02-18 10:27:10 +00:00
# ====================================================================================
# Local Utility
# This is for running out-of-cluster locally, and is for convenience.
# For more control, try running the binary directly with different arguments.
run : generate
go run ./main.go
2021-03-27 22:14:54 +00:00
# Generate manifests from helm chart
manifests : helm .generate
mkdir -p $( OUTPUT_DIR) /deploy/manifests
helm template external-secrets $( HELM_DIR) -f deploy/manifests/helm-values.yaml > $( OUTPUT_DIR) /deploy/manifests/external-secrets.yaml
2021-02-18 10:27:10 +00:00
# Install CRDs into a cluster. This is for convenience.
crds.install : generate
kubectl apply -f $( CRD_DIR)
# Uninstall CRDs from a cluster. This is for convenience.
crds.uninstall :
kubectl delete -f $( CRD_DIR)
# ====================================================================================
# Helm Chart
helm.docs : ## Generate helm docs
2021-05-27 18:09:10 +00:00
@cd $( HELM_DIR) ; \
docker run --rm -v $( shell pwd ) /$( HELM_DIR) :/helm-docs -u $( shell id -u) jnorwood/helm-docs:v1.5.0
2021-02-18 10:27:10 +00:00
2021-03-27 22:14:54 +00:00
HELM_VERSION ?= $( shell helm show chart $( HELM_DIR) | grep 'version:' | sed 's/version: //g' )
2021-02-18 10:27:10 +00:00
helm.build : helm .generate ## Build helm chart
@$( INFO) helm package
@helm package $( HELM_DIR) --dependency-update --destination $( OUTPUT_DIR) /chart
2021-03-27 22:14:54 +00:00
@mv $( OUTPUT_DIR) /chart/external-secrets-$( HELM_VERSION) .tgz $( OUTPUT_DIR) /chart/external-secrets.tgz
2021-02-18 10:27:10 +00:00
@$( OK) helm package
# Copy crds to helm chart directory
2021-05-27 18:09:10 +00:00
helm.generate : helm .docs
2021-02-18 10:27:10 +00:00
@cp $( CRD_DIR) /*.yaml $( HELM_DIR) /templates/crds/
# Add helm if statement for controlling the install of CRDs
@for i in $( HELM_DIR) /templates/crds/*.yaml; do \
cp " $$ i " " $$ i.bkp " && \
echo "{{- if .Values.installCRDs }}" > " $$ i " && \
cat " $$ i.bkp " >> " $$ i " && \
echo "{{- end }}" >> " $$ i " && \
rm " $$ i.bkp " ; \
done
@$( OK) Finished generating helm chart files
2021-03-01 07:31:02 +00:00
# ====================================================================================
# Documentation
.PHONY : docs
docs : generate
$( MAKE) -C ./hack/api-docs build
.PHONY : serve -docs
serve-docs :
$( MAKE) -C ./hack/api-docs serve
2021-02-18 10:27:10 +00:00
# ====================================================================================
# Build Artifacts
build.all : docker .build helm .build
2021-07-21 15:00:43 +00:00
docker.build : $( addprefix build -,$ ( ARCH ) ) ## Build the docker image
2021-02-18 10:27:10 +00:00
@$( INFO) docker build
2021-03-21 21:39:26 +00:00
@docker build . $( BUILD_ARGS) -t $( IMAGE_REGISTRY) :$( VERSION)
2021-02-18 10:27:10 +00:00
@$( OK) docker build
docker.push :
@$( INFO) docker push
@docker push $( IMAGE_REGISTRY) :$( VERSION)
@$( OK) docker push
# RELEASE_TAG is tag to promote. Default is promooting to main branch, but can be overriden
# to promote a tag to a specific version.
RELEASE_TAG ?= main
SOURCE_TAG ?= $( VERSION)
docker.promote :
2021-07-21 15:00:43 +00:00
@$( INFO) promoting $( SOURCE_TAG) to $( RELEASE_TAG)
docker manifest inspect $( IMAGE_REGISTRY) :$( SOURCE_TAG) > .tagmanifest
for digest in $$ ( jq -r '.manifests[].digest' < .tagmanifest) ; do \
docker pull $( IMAGE_REGISTRY) @$$ digest; \
done
docker manifest create $( IMAGE_REGISTRY) :$( RELEASE_TAG) \
$$ ( jq -j '"--amend $(IMAGE_REGISTRY)@" + .manifests[].digest + " "' < .tagmanifest)
docker manifest push $( IMAGE_REGISTRY) :$( RELEASE_TAG)
@$( OK) docker push $( RELEASE_TAG) \
2021-02-18 10:27:10 +00:00
# ====================================================================================
# Help
# only comments after make target name are shown as help text
2020-12-21 19:31:28 +00:00
help : ## displays this help message
2021-02-18 10:27:10 +00:00
@echo -e " $$ (grep -hE '^\S+:.*##' $( MAKEFILE_LIST) | sed -e 's/:.*##\s*/:/' -e 's/^\(.\+\):\(.*\)/\\x1b[36m\1\\x1b[m:\2/' | column -c2 -t -s : | sort) "