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)