github.com/GoogleContainerTools/skaffold@v1.39.18/Makefile (about) 1 # Copyright 2019 The Skaffold Authors 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License"); 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http://www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 GOPATH ?= $(shell go env GOPATH) 15 GOBIN ?= $(or $(shell go env GOBIN),$(GOPATH)/bin) 16 GOOS ?= $(shell go env GOOS) 17 GOARCH ?= $(shell go env GOARCH) 18 BUILD_DIR ?= ./out 19 ORG = github.com/GoogleContainerTools 20 PROJECT = skaffold 21 REPOPATH ?= $(ORG)/$(PROJECT) 22 RELEASE_BUCKET ?= $(PROJECT) 23 GSC_BUILD_PATH ?= gs://$(RELEASE_BUCKET)/builds/$(COMMIT) 24 GSC_BUILD_LATEST ?= gs://$(RELEASE_BUCKET)/builds/latest 25 GSC_LTS_BUILD_PATH ?= gs://$(RELEASE_BUCKET)/lts/builds/$(COMMIT) 26 GSC_LTS_BUILD_LATEST ?= gs://$(RELEASE_BUCKET)/lts/builds/latest 27 GSC_LTS_RELEASE_PATH ?= gs://$(RELEASE_BUCKET)/lts/releases/$(VERSION) 28 GSC_LTS_RELEASE_LATEST ?= gs://$(RELEASE_BUCKET)/lts/releases/latest 29 GSC_RELEASE_PATH ?= gs://$(RELEASE_BUCKET)/releases/$(VERSION) 30 GSC_RELEASE_LATEST ?= gs://$(RELEASE_BUCKET)/releases/latest 31 32 GCP_ONLY ?= false 33 GCP_PROJECT ?= k8s-skaffold 34 GKE_CLUSTER_NAME ?= integration-tests 35 GKE_ZONE ?= us-central1-a 36 37 SUPPORTED_PLATFORMS = linux-amd64 darwin-amd64 windows-amd64.exe linux-arm64 darwin-arm64 38 BUILD_PACKAGE = $(REPOPATH)/cmd/skaffold 39 40 SKAFFOLD_TEST_PACKAGES = ./pkg/skaffold/... ./cmd/... ./hack/... ./pkg/webhook/... 41 GO_FILES = $(shell find . -type f -name '*.go' -not -path "./pkg/diag/*") 42 43 VERSION_PACKAGE = $(REPOPATH)/pkg/skaffold/version 44 COMMIT = $(shell git rev-parse HEAD) 45 46 ifeq "$(strip $(VERSION))" "" 47 override VERSION = $(shell git describe --always --tags --dirty) 48 endif 49 50 DATE_FMT = +%Y-%m-%dT%H:%M:%SZ 51 ifdef SOURCE_DATE_EPOCH 52 BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "$(DATE_FMT)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "$(DATE_FMT)" 2>/dev/null || date -u "$(DATE_FMT)") 53 else 54 BUILD_DATE ?= $(shell date "$(DATE_FMT)") 55 endif 56 57 GO_LDFLAGS = -X $(VERSION_PACKAGE).version=$(VERSION) 58 GO_LDFLAGS += -X $(VERSION_PACKAGE).buildDate=$(BUILD_DATE) 59 GO_LDFLAGS += -X $(VERSION_PACKAGE).gitCommit=$(COMMIT) 60 GO_LDFLAGS += -s -w 61 62 GO_BUILD_TAGS_linux = osusergo netgo static_build release 63 LDFLAGS_linux = -static 64 65 GO_BUILD_TAGS_windows = release 66 67 GO_BUILD_TAGS_darwin = release 68 69 ifneq "$(strip $(LOCAL))" "true" 70 override STATIK_FILES = cmd/skaffold/app/cmd/statik/statik.go 71 endif 72 73 # when build for local development (`LOCAL=true make install` can skip license check) 74 $(BUILD_DIR)/$(PROJECT): $(STATIK_FILES) $(GO_FILES) $(BUILD_DIR) 75 $(eval ldflags = $(GO_LDFLAGS) $(patsubst %,-extldflags \"%\",$(LDFLAGS_$(GOOS)))) 76 $(eval tags = $(GO_BUILD_TAGS_$(GOOS)) $(GO_BUILD_TAGS_$(GOOS)_$(GOARCH))) 77 GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=1 \ 78 go build -gcflags="all=-N -l" -tags "$(tags)" -ldflags "$(ldflags)" -o $@ $(BUILD_PACKAGE) 79 ifeq ($(GOOS),darwin) 80 codesign --force --deep --sign - $@ 81 endif 82 83 .PHONY: install 84 install: $(BUILD_DIR)/$(PROJECT) 85 mkdir -p $(GOPATH)/bin 86 rm -f $(GOBIN)/$(PROJECT) 87 cp $(BUILD_DIR)/$(PROJECT) $(GOBIN)/$(PROJECT) 88 89 .PRECIOUS: $(foreach platform, $(SUPPORTED_PLATFORMS), $(BUILD_DIR)/$(PROJECT)-$(platform)) 90 91 .PHONY: cross 92 cross: $(foreach platform, $(SUPPORTED_PLATFORMS), $(BUILD_DIR)/$(PROJECT)-$(platform)) 93 94 $(BUILD_DIR)/$(PROJECT)-%: $(STATIK_FILES) $(GO_FILES) $(BUILD_DIR) 95 $(eval os = $(firstword $(subst -, ,$*))) 96 $(eval arch = $(lastword $(subst -, ,$(subst .exe,,$*)))) 97 $(eval ldflags = $(GO_LDFLAGS) $(patsubst %,-extldflags \"%\",$(LDFLAGS_$(os)))) 98 $(eval tags = $(GO_BUILD_TAGS_$(os)) $(GO_BUILD_TAGS_$(os)_$(arch))) 99 GOOS=$(os) GOARCH=$(arch) CGO_ENABLED=1 go build -tags "$(tags)" -ldflags "$(ldflags)" -o $@ ./cmd/skaffold 100 (cd `dirname $@`; shasum -a 256 `basename $@`) | tee $@.sha256 101 file $@ || true 102 103 .PHONY: $(BUILD_DIR)/VERSION 104 $(BUILD_DIR)/VERSION: $(BUILD_DIR) 105 @ echo $(VERSION) > $@ 106 107 $(BUILD_DIR): 108 mkdir -p $(BUILD_DIR) 109 110 .PHONY: test 111 test: $(BUILD_DIR) 112 @ ./hack/gotest.sh -count=1 -race -short -timeout=90s $(SKAFFOLD_TEST_PACKAGES) 113 @ ./hack/checks.sh 114 @ ./hack/linters.sh 115 116 .PHONY: coverage 117 coverage: $(BUILD_DIR) 118 @ ./hack/gotest.sh -count=1 -race -cover -short -timeout=90s -coverprofile=out/coverage.txt -coverpkg="./pkg/...,./cmd/..." $(SKAFFOLD_TEST_PACKAGES) 119 @- curl -s https://codecov.io/bash > $(BUILD_DIR)/upload_coverage && bash $(BUILD_DIR)/upload_coverage 120 121 .PHONY: checks 122 checks: $(BUILD_DIR) 123 @ ./hack/checks.sh 124 125 .PHONY: linters 126 linters: $(BUILD_DIR) 127 @ ./hack/linters.sh 128 129 .PHONY: quicktest 130 quicktest: 131 @ ./hack/gotest.sh -short -timeout=60s $(SKAFFOLD_TEST_PACKAGES) 132 133 .PHONY: integration-tests 134 integration-tests: 135 ifeq ($(GCP_ONLY),true) 136 gcloud container clusters get-credentials \ 137 $(GKE_CLUSTER_NAME) \ 138 --zone $(GKE_ZONE) \ 139 --project $(GCP_PROJECT) 140 endif 141 @ GCP_ONLY=$(GCP_ONLY) ./hack/gotest.sh -v $(REPOPATH)/integration/binpack $(REPOPATH)/integration -timeout 50m $(INTEGRATION_TEST_ARGS) 142 143 .PHONY: integration 144 integration: install integration-tests 145 146 .PHONY: release 147 release: $(BUILD_DIR)/VERSION 148 docker build \ 149 --build-arg VERSION=$(VERSION) \ 150 -f deploy/skaffold/Dockerfile \ 151 --target release \ 152 -t gcr.io/$(GCP_PROJECT)/skaffold:$(VERSION) \ 153 . 154 155 .PHONY: release-build 156 release-build: 157 docker build \ 158 -f deploy/skaffold/Dockerfile \ 159 --target release \ 160 -t gcr.io/$(GCP_PROJECT)/skaffold:edge \ 161 -t gcr.io/$(GCP_PROJECT)/skaffold:public-image-edge \ 162 -t gcr.io/$(GCP_PROJECT)/skaffold:$(COMMIT) \ 163 . 164 165 .PHONY: release-lts 166 release-lts: $(BUILD_DIR)/VERSION 167 docker build \ 168 --build-arg VERSION=$(VERSION) \ 169 -f deploy/skaffold/Dockerfile.lts \ 170 --target release \ 171 -t gcr.io/$(GCP_PROJECT)/skaffold:lts \ 172 -t gcr.io/$(GCP_PROJECT)/skaffold:$(VERSION)-lts \ 173 -t gcr.io/$(GCP_PROJECT)/skaffold:$(SCANNING_MARKER)-lts \ 174 . 175 176 .PHONY: release-lts-build 177 release-lts-build: 178 docker build \ 179 -f deploy/skaffold/Dockerfile.lts \ 180 --target release \ 181 -t gcr.io/$(GCP_PROJECT)/skaffold:edge-lts \ 182 -t gcr.io/$(GCP_PROJECT)/skaffold:$(COMMIT)-lts \ 183 . 184 185 .PHONY: clean 186 clean: 187 rm -rf $(BUILD_DIR) hack/bin $(STATIK_FILES) 188 189 .PHONY: build_deps 190 build_deps: 191 $(eval DEPS_DIGEST := $(shell ./hack/skaffold-deps-sha1.sh)) 192 docker build \ 193 -f deploy/skaffold/Dockerfile.deps \ 194 -t gcr.io/$(GCP_PROJECT)/build_deps:$(DEPS_DIGEST) \ 195 deploy/skaffold 196 docker push gcr.io/$(GCP_PROJECT)/build_deps:$(DEPS_DIGEST) 197 198 .PHONY: skaffold-builder 199 skaffold-builder: 200 time docker build \ 201 -f deploy/skaffold/Dockerfile \ 202 --target builder \ 203 -t gcr.io/$(GCP_PROJECT)/skaffold-builder \ 204 . 205 206 .PHONY: integration-in-kind 207 integration-in-kind: skaffold-builder 208 echo '{}' > /tmp/docker-config 209 docker network inspect kind >/dev/null 2>&1 || docker network create kind 210 docker run --rm \ 211 -v /var/run/docker.sock:/var/run/docker.sock \ 212 -v $(HOME)/.gradle:/root/.gradle \ 213 -v $(HOME)/.cache:/root/.cache \ 214 -v /tmp/docker-config:/root/.docker/config.json \ 215 -v $(CURDIR)/hack/maven/settings.xml:/root/.m2/settings.xml \ 216 -e KUBECONFIG=/tmp/kind-config \ 217 -e INTEGRATION_TEST_ARGS=$(INTEGRATION_TEST_ARGS) \ 218 -e IT_PARTITION=$(IT_PARTITION) \ 219 --network kind \ 220 gcr.io/$(GCP_PROJECT)/skaffold-builder \ 221 sh -eu -c ' \ 222 if ! kind get clusters | grep -q kind; then \ 223 trap "kind delete cluster" 0 1 2 15; \ 224 sh hack/generate-kind-config.sh > /tmp/kind-config.yaml; \ 225 cat /tmp/kind-config.yaml; \ 226 TERM=dumb kind create cluster --config /tmp/kind-config.yaml; \ 227 fi; \ 228 kind get kubeconfig --internal > /tmp/kind-config; \ 229 make integration \ 230 ' 231 232 .PHONY: integration-in-k3d 233 integration-in-k3d: skaffold-builder 234 echo '{}' > /tmp/docker-config 235 docker pull rancher/k3d-tools:v3.4.0 236 docker run --rm \ 237 --network="host" \ 238 -v /var/run/docker.sock:/var/run/docker.sock \ 239 -v $(HOME)/.gradle:/root/.gradle \ 240 -v $(HOME)/.cache:/root/.cache \ 241 -v /tmp/docker-config:/root/.docker/config.json \ 242 -v $(CURDIR)/hack/maven/settings.xml:/root/.m2/settings.xml \ 243 -e INTEGRATION_TEST_ARGS=$(INTEGRATION_TEST_ARGS) \ 244 -e IT_PARTITION=$(IT_PARTITION) \ 245 gcr.io/$(GCP_PROJECT)/skaffold-builder \ 246 sh -eu -c ' \ 247 if ! k3d cluster list | grep -q k3s-default; then \ 248 trap "k3d cluster delete" 0 1 2 15; \ 249 mkdir -p /tmp/k3d; \ 250 sh hack/generate-k3d-registries.sh > /tmp/k3d/registries.yaml; \ 251 cat /tmp/k3d/registries.yaml; \ 252 TERM=dumb k3d cluster create --verbose \ 253 --network k3d \ 254 --volume /tmp/k3d:/etc/rancher/k3s; \ 255 fi; \ 256 make integration \ 257 ' 258 259 .PHONY: integration-in-docker 260 integration-in-docker: skaffold-builder 261 docker run --rm \ 262 -v /var/run/docker.sock:/var/run/docker.sock \ 263 -v $(HOME)/.config/gcloud:/root/.config/gcloud \ 264 -v $(GOOGLE_APPLICATION_CREDENTIALS):$(GOOGLE_APPLICATION_CREDENTIALS) \ 265 -v $(CURDIR)/hack/maven/settings.xml:/root/.m2/settings.xml \ 266 -e GCP_ONLY=$(GCP_ONLY) \ 267 -e GCP_PROJECT=$(GCP_PROJECT) \ 268 -e GKE_CLUSTER_NAME=$(GKE_CLUSTER_NAME) \ 269 -e GKE_ZONE=$(GKE_ZONE) \ 270 -e DOCKER_CONFIG=/root/.docker \ 271 -e GOOGLE_APPLICATION_CREDENTIALS=$(GOOGLE_APPLICATION_CREDENTIALS) \ 272 -e INTEGRATION_TEST_ARGS=$(INTEGRATION_TEST_ARGS) \ 273 -e IT_PARTITION=$(IT_PARTITION) \ 274 gcr.io/$(GCP_PROJECT)/skaffold-builder \ 275 make integration 276 277 .PHONY: submit-build-trigger 278 submit-build-trigger: 279 gcloud builds submit . \ 280 --config=deploy/cloudbuild.yaml \ 281 --substitutions="_RELEASE_BUCKET=$(RELEASE_BUCKET),COMMIT_SHA=$(COMMIT)" 282 283 .PHONY: submit-release-trigger 284 submit-release-trigger: 285 gcloud builds submit . \ 286 --config=deploy/cloudbuild-release.yaml \ 287 --substitutions="_RELEASE_BUCKET=$(RELEASE_BUCKET),TAG_NAME=$(VERSION)" 288 289 # utilities for skaffold site - not used anywhere else 290 291 .PHONY: preview-docs 292 preview-docs: 293 ./deploy/docs/local-preview.sh hugo serve -D --bind=0.0.0.0 --ignoreCache 294 295 .PHONY: build-docs-preview 296 build-docs-preview: 297 ./deploy/docs/local-preview.sh hugo --baseURL=https://skaffold.dev 298 299 # schema generation 300 301 .PHONY: generate-schemas 302 generate-schemas: 303 go run hack/schemas/main.go 304 305 # telemetry generation 306 .PHONY: generate-schemas 307 generate-telemetry-json: 308 go run hack/struct-json/main.go -- pkg/skaffold/instrumentation/types.go docs/content/en/docs/resources/telemetry/metrics.json 309 310 # dashboards 311 .PHONY: generate-flags-dashboard 312 flags-dashboard: 313 go run hack/patch-dashboard/main.go $(GCP_PROJECT) 314 315 # static files 316 317 $(STATIK_FILES): go.mod docs/content/en/schemas/* 318 hack/generate-statik.sh 319 320 # run comparisonstats - ex: make COMPARISONSTATS_ARGS='usr/local/bin/skaffold /usr/local/bin/skaffold helm-deployment main.go "//per-dev-iteration-comment"' comparisonstats 321 .PHONY: comparisonstats 322 comparisonstats: 323 go run hack/comparisonstats/main.go $(COMPARISONSTATS_ARGS)