###################################
# #
# CONFIGURATION #
# #
###################################
########## Shell/Terminal Settings ##########
SHELL := /bin/bash
# determine if make is being executed from interactive terminal
INTERACTIVE := $( shell [ -t 0 ] && echo 1)
# Use Go Modules for everything
export GO111MODULE = on
########## Tags ##########
# get git tag
i f n e q ( $( GIT_TAG_OVERRIDE ) , )
$( info GIT_TAG set from env override !)
GIT_TAG := $( GIT_TAG_OVERRIDE)
e n d i f
GIT_TAG ?= $( shell git describe --tags)
i f e q ( $( GIT_TAG ) , )
GIT_TAG := $( shell git describe --always)
e n d i f
# Docker image tag derived from Git tag (with prefix "v" stripped off)
K3D_IMAGE_TAG := $( GIT_TAG:v%= %)
# get latest k3s version: grep the tag and replace + with - (difference between git and dockerhub tags)
K3S_TAG := $( shell curl --silent --retry 3 "https://update.k3s.io/v1-release/channels/stable" | egrep -o '/v[^ ]+"' | sed -E 's/\/|\"//g' | sed -E 's/\+/\-/' )
i f e q ( $( K 3S_TAG ) , )
$(warning K3S_TAG undefined : couldn 't get latest k 3s image tag !)
$(warning Output of curl : $( shell curl "https ://update .k 3s .io /v 1-release /channels /stable ") )
$( error exiting )
e n d i f
########## Source Options ##########
# DIRS defines a single level directly, we only look at *.go in this directory.
# REC_DIRS defines a source code tree. All go files are analyzed recursively.
DIRS := .
REC_DIRS := cmd
########## Test Settings ##########
E2E_LOG_LEVEL ?= WARN
E2E_INCLUDE ?=
E2E_EXCLUDE ?=
E2E_EXTRA ?=
E2E_RUNNER_START_TIMEOUT ?= 10
E2E_HELPER_IMAGE_TAG ?=
E2E_KEEP ?=
E2E_PARALLEL ?=
E2E_DIND_VERSION ?=
E2E_K3S_VERSION ?=
E2E_FAIL_FAST ?=
########## Go Build Options ##########
# Build targets
TARGETS ?= darwin/amd64 darwin/arm64 linux/amd64 linux/386 linux/arm linux/arm64 windows/amd64
TARGET_OBJS ?= darwin-amd64.tar.gz darwin-amd64.tar.gz.sha256 darwin-arm64.tar.gz darwin-arm64.tar.gz.sha256 linux-amd64.tar.gz linux-amd64.tar.gz.sha256 linux-386.tar.gz linux-386.tar.gz.sha256 linux-arm.tar.gz linux-arm.tar.gz.sha256 linux-arm64.tar.gz linux-arm64.tar.gz.sha256 windows-amd64.zip windows-amd64.zip.sha256
K3D_HELPER_VERSION ?=
# Go options
GO ?= go
GOENVPATH := $( shell go env GOPATH)
PKG := $( shell go work vendor)
TAGS :=
TESTS := ./...
TESTFLAGS :=
LDFLAGS := -w -s -X github.com/k3d-io/k3d/v5/version.Version= ${ GIT_TAG } -X github.com/k3d-io/k3d/v5/version.K3sVersion= ${ K3S_TAG }
GCFLAGS :=
GOFLAGS := -mod= readonly
BINDIR := $( CURDIR) /bin
BINARIES := k3d
# Set version of the k3d helper images for build
i f n e q ( $( K 3D_HELPER_VERSION ) , )
$( info [INFO ] Helper Image version set to $ {K 3D_HELPER_VERSION })
LDFLAGS += -X github.com/k3d-io/k3d/v5/version.HelperVersionOverride= ${ K3D_HELPER_VERSION }
e n d i f
# Rules for finding all go source files using 'DIRS' and 'REC_DIRS'
GO_SRC := $( foreach dir,$( DIRS) ,$( wildcard $( dir) /*.go) )
GO_SRC += $( foreach dir,$( REC_DIRS) ,$( shell find $( dir) -name "*.go" ) )
########## Required Tools ##########
# Go Package required
PKG_GOX := github.com/iwilltry42/gox@v0.1.0
PKG_GOLANGCI_LINT_VERSION := 1.57.2
PKG_GOLANGCI_LINT_SCRIPT := https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh
PKG_GOLANGCI_LINT := github.com/golangci/golangci-lint/cmd/golangci-lint@v${ PKG_GOLANGCI_LINT_VERSION }
########## Linting Options ##########
# configuration adjustments for golangci-lint
GOLANGCI_LINT_DISABLED_LINTERS := "" # disabling typecheck, because it currently (06.09.2019) fails with Go 1.13
# Rules for directory list as input for the golangci-lint program
LINT_DIRS := $( DIRS) $( foreach dir,$( REC_DIRS) ,$( dir) /...)
#############################
# #
# TARGETS #
# #
#############################
.PHONY : all build build -cross clean fmt check -fmt lint check extra -clean install -tools
all : clean fmt check test build
############################
########## Builds ##########
############################
# debug builds
build-debug : GCFLAGS +="all =-N -l "
build-debug : build
# default build target for the local platform
build :
CGO_ENABLED = 0 $( GO) build $( GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -gcflags '$(GCFLAGS)' -o '$(BINDIR)/$(BINARIES)'
# cross-compilation for all targets
build-cross : LDFLAGS += -extldflags "-static "
build-cross :
CGO_ENABLED = 0 gox -parallel= 3 -output= " _dist/ $( BINARIES) -{{.OS}}-{{.Arch}} " -osarch= '$(TARGETS)' $( GOFLAGS) $( if $( TAGS) ,-tags '$(TAGS)' ,) -ldflags '$(LDFLAGS)'
gen-checksum : build -cross
$( eval ARTIFACTS_TO_PUBLISH := $( shell ls _dist/*) )
$$ ( sha256sum $( ARTIFACTS_TO_PUBLISH) > _dist/checksums.txt)
# build a specific docker target ( '%' matches the target as specified in the Dockerfile)
build-docker-% :
@echo " Building Docker image k3d: $( K3D_IMAGE_TAG) - $* "
DOCKER_BUILDKIT = 1 docker build . --quiet --no-cache -t k3d:$( K3D_IMAGE_TAG) -$* --target $*
# build helper images
build-helper-images : build -proxy -image build -tools -image
build-proxy-image :
@echo " Building docker image ghcr.io/k3d-io/k3d-proxy: $( K3D_IMAGE_TAG) "
DOCKER_BUILDKIT = 1 docker build --quiet --no-cache proxy/ -f proxy/Dockerfile -t ghcr.io/k3d-io/k3d-proxy:$( K3D_IMAGE_TAG)
build-tools-image :
@echo " Building docker image ghcr.io/k3d-io/k3d-tools: $( K3D_IMAGE_TAG) "
DOCKER_BUILDKIT = 1 docker build --quiet --no-cache tools/ -f tools/Dockerfile -t ghcr.io/k3d-io/k3d-tools:$( K3D_IMAGE_TAG) --build-arg GIT_TAG = $( GIT_TAG)
##############################
########## Cleaning ##########
##############################
clean :
@rm -rf $( BINDIR) _dist/
extra-clean : clean
$( GO) clean -i $( PKG_GOX)
$( GO) clean -i $( PKG_GOLANGCI_LINT)
##########################################
########## Formatting & Linting ##########
##########################################
# fmt will fix the golang source style in place.
fmt :
@gofmt -s -l -w $( GO_SRC)
# check-fmt returns an error code if any source code contains format error.
check-fmt :
@test -z $( shell gofmt -s -l $( GO_SRC) | tee /dev/stderr) || echo "[WARN] Fix formatting issues with 'make fmt'"
lint :
@golangci-lint run -D $( GOLANGCI_LINT_DISABLED_LINTERS) $( LINT_DIRS)
ci-lint :
golangci-lint run --timeout 5m0s --out-format= github-actions -D $( GOLANGCI_LINT_DISABLED_LINTERS) $( LINT_DIRS)
check : check -fmt lint
###########################
########## Tests ##########
###########################
test :
$( GO) test $( TESTS) $( TESTFLAGS)
e2e :
@echo "Running e2e tests"
LOG_LEVEL = " $( E2E_LOG_LEVEL) " E2E_INCLUDE = " $( E2E_INCLUDE) " E2E_EXCLUDE = " $( E2E_EXCLUDE) " E2E_EXTRA = " $( E2E_EXTRA) " E2E_RUNNER_START_TIMEOUT = $( E2E_RUNNER_START_TIMEOUT) E2E_HELPER_IMAGE_TAG = " $( E2E_HELPER_IMAGE_TAG) " E2E_KEEP = " $( E2E_KEEP) " E2E_PARALLEL = " $( E2E_PARALLEL) " E2E_DIND_VERSION = " $( E2E_DIND_VERSION) " E2E_K3S_VERSION = " $( E2E_K3S_VERSION) " E2E_FAIL_FAST = " $( E2E_FAIL_FAST) " tests/dind.sh " ${ K3D_IMAGE_TAG } "
ci-tests : fmt check e 2e
##########################
########## Misc ##########
##########################
#########################################
########## Setup & Preparation ##########
#########################################
# Check for required executables
HAS_GOX := $( shell command -v gox 2> /dev/null)
HAS_GOLANGCI := $( shell command -v golangci-lint)
HAS_GOLANGCI_VERSION := $( shell golangci-lint --version | grep " version $( PKG_GOLANGCI_LINT_VERSION) " 2>& 1)
install-tools :
i f n d e f H A S _ G O X
( $( GO) install $( PKG_GOX) )
e n d i f
i f n d e f H A S _ G O L A N G C I
( curl -sfL $( PKG_GOLANGCI_LINT_SCRIPT) | sh -s -- -b $( GOENVPATH) /bin v${ PKG_GOLANGCI_LINT_VERSION } )
e n d i f
i f d e f H A S _ G O L A N G C I
i f e q ( $( HAS_GOLANGCI_VERSION ) , )
i f d e f I N T E R A C T I V E
@echo " Warning: Your installed version of golangci-lint (interactive: ${ INTERACTIVE } ) differs from what we'd like to use. Switch to v ${ PKG_GOLANGCI_LINT_VERSION } ? [Y/n] "
@read line; if [ $$ line = = "y" ] ; then ( curl -sfL $( PKG_GOLANGCI_LINT_SCRIPT) | sh -s -- -b $( GOENVPATH) /bin v${ PKG_GOLANGCI_LINT_VERSION } ) ; fi
e l s e
@echo " Warning: you're not using the same version of golangci-lint as us (v ${ PKG_GOLANGCI_LINT_VERSION } ) "
e n d i f
e n d i f
e n d i f
# In the CI system, we need...
# - golangci-lint for linting (lint)
# - gox for cross-compilation (build-cross)
# - kubectl for E2E-tests (e2e)
ci-setup :
@echo "### Installing Go tools..."
@echo "### -> Installing golangci-lint..."
curl -sfL $( PKG_GOLANGCI_LINT_SCRIPT) | sh -s -- -b $( GOENVPATH) /bin v$( PKG_GOLANGCI_LINT_VERSION)
@echo "### -> Installing gox..."
./scripts/install-tools.sh gox
@echo "### Installing kubectl..."
./scripts/install-tools.sh kubectl