Skip to content

Commit 11d005d

Browse files
authored
Merge pull request #3631 from dgageot/restore-skaffold-builder
Build skaffold-builder image from a pre-pushed base
2 parents 5bd0f1e + a485ee7 commit 11d005d

8 files changed

+201
-141
lines changed

Makefile

+24-8
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ GO_LDFLAGS_darwin =" $(GO_LDFLAGS) -extldflags \"$(LDFLAGS_darwin)\""
6565
GO_LDFLAGS_linux =" $(GO_LDFLAGS) -extldflags \"$(LDFLAGS_linux)\""
6666

6767
GO_FILES := $(shell find . -type f -name '*.go' -not -path "./vendor/*")
68+
DEPS_DIGEST := $(shell ./hack/skaffold-deps-sha1.sh)
6869

6970
$(BUILD_DIR)/$(PROJECT): $(BUILD_DIR)/$(PROJECT)-$(GOOS)-$(GOARCH)
7071
cp $(BUILD_DIR)/$(PROJECT)-$(GOOS)-$(GOARCH) $@
@@ -73,11 +74,14 @@ $(BUILD_DIR)/$(PROJECT)-$(GOOS)-$(GOARCH): generate-statik $(GO_FILES) $(BUILD_D
7374
GOOS=$(GOOS) GOARCH=$(GOARCH) CGO_ENABLED=1 go build -tags $(GO_BUILD_TAGS_$(GOOS)) -ldflags $(GO_LDFLAGS_$(GOOS)) -gcflags $(GO_GCFLAGS) -asmflags $(GO_ASMFLAGS) -o $@ $(BUILD_PACKAGE)
7475

7576
$(BUILD_DIR)/$(PROJECT)-%-$(GOARCH): generate-statik $(GO_FILES) $(BUILD_DIR)
76-
docker build --build-arg PROJECT=$(REPOPATH) \
77+
docker build \
78+
--build-arg PROJECT=$(REPOPATH) \
7779
--build-arg TARGETS=$*/$(GOARCH) \
7880
--build-arg FLAG_LDFLAGS=$(GO_LDFLAGS_$(*)) \
7981
--build-arg FLAG_TAGS=$(GO_BUILD_TAGS_$(*)) \
80-
-f deploy/cross/Dockerfile -t skaffold/cross .
82+
-f deploy/cross/Dockerfile \
83+
-t skaffold/cross \
84+
.
8185
docker run --rm --entrypoint sh skaffold/cross -c "cat /build/skaffold*" > $@
8286

8387
%.sha256: %
@@ -133,11 +137,12 @@ endif
133137
.PHONY: release
134138
release: cross $(BUILD_DIR)/VERSION
135139
docker build \
136-
-f deploy/skaffold/Dockerfile \
137-
--cache-from gcr.io/$(GCP_PROJECT)/skaffold-builder \
138140
--build-arg VERSION=$(VERSION) \
141+
-f deploy/skaffold/Dockerfile \
142+
--target release \
139143
-t gcr.io/$(GCP_PROJECT)/skaffold:latest \
140-
-t gcr.io/$(GCP_PROJECT)/skaffold:$(VERSION) .
144+
-t gcr.io/$(GCP_PROJECT)/skaffold:$(VERSION) \
145+
.
141146
gsutil -m cp $(BUILD_DIR)/$(PROJECT)-* $(GSC_RELEASE_PATH)/
142147
gsutil -m cp $(BUILD_DIR)/VERSION $(GSC_RELEASE_PATH)/VERSION
143148
gsutil -m cp -r $(GSC_RELEASE_PATH)/* $(GSC_RELEASE_LATEST)
@@ -146,22 +151,33 @@ release: cross $(BUILD_DIR)/VERSION
146151
release-build: cross
147152
docker build \
148153
-f deploy/skaffold/Dockerfile \
149-
--cache-from gcr.io/$(GCP_PROJECT)/skaffold-builder \
154+
--target release \
150155
-t gcr.io/$(GCP_PROJECT)/skaffold:edge \
151-
-t gcr.io/$(GCP_PROJECT)/skaffold:$(COMMIT) .
156+
-t gcr.io/$(GCP_PROJECT)/skaffold:$(COMMIT) \
157+
.
152158
gsutil -m cp $(BUILD_DIR)/$(PROJECT)-* $(GSC_BUILD_PATH)/
153159
gsutil -m cp -r $(GSC_BUILD_PATH)/* $(GSC_BUILD_LATEST)
154160

155161
.PHONY: clean
156162
clean:
157163
rm -rf $(BUILD_DIR) hack/bin
158164

165+
.PHONY: build_deps
166+
build_deps:
167+
docker build \
168+
-f deploy/skaffold/Dockerfile.deps \
169+
-t gcr.io/$(GCP_PROJECT)/build_deps:$(DEPS_DIGEST) \
170+
deploy/skaffold
171+
docker push gcr.io/$(GCP_PROJECT)/build_deps:$(DEPS_DIGEST)
172+
@./hack/check-skaffold-builder.sh
173+
159174
.PHONY: skaffold-builder
160175
skaffold-builder:
161176
time docker build \
162177
-f deploy/skaffold/Dockerfile \
163178
--target builder \
164-
-t gcr.io/$(GCP_PROJECT)/skaffold-builder .
179+
-t gcr.io/$(GCP_PROJECT)/skaffold-builder \
180+
.
165181

166182
.PHONY: integration-in-kind
167183
integration-in-kind: skaffold-builder

deploy/cloudbuild-release.yaml

+6-16
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,13 @@
11
# using default substitutions, provided by Google Cloud Build
22
# see: https://cloud.google.com/container-builder/docs/configuring-builds/substitute-variable-values#using_default_substitutions
33
steps:
4-
5-
# Download the latest version of the builder image
6-
- name: 'gcr.io/cloud-builders/docker'
7-
entrypoint: 'bash'
8-
args:
9-
- '-c'
10-
- |
11-
docker pull gcr.io/$PROJECT_ID/skaffold-builder:latest || exit 0
12-
# until https://github.com/GoogleCloudPlatform/cloud-builders/issues/253 is fixed
13-
14-
# Rebuild the builder image if necessary
154
- name: 'gcr.io/cloud-builders/docker'
165
args:
176
- 'build'
187
- '-t'
198
- 'gcr.io/$PROJECT_ID/skaffold-builder:latest'
209
- '-f'
2110
- 'deploy/skaffold/Dockerfile'
22-
- '--cache-from'
23-
- 'gcr.io/$PROJECT_ID/skaffold-builder:latest'
24-
- '--target'
25-
- 'builder'
2611
- '.'
2712

2813
# Do the go build & push the results to GCS
@@ -35,8 +20,13 @@ steps:
3520
- 'RELEASE_BUCKET=$_RELEASE_BUCKET'
3621
- 'GCP_PROJECT=$PROJECT_ID'
3722

23+
# Check that skaffold is in the image
24+
- name: 'gcr.io/$PROJECT_ID/skaffold:latest'
25+
args:
26+
- 'skaffold'
27+
- 'version'
28+
3829
images:
39-
- 'gcr.io/$PROJECT_ID/skaffold-builder:latest'
4030
- 'gcr.io/$PROJECT_ID/skaffold:latest'
4131
- 'gcr.io/$PROJECT_ID/skaffold:$TAG_NAME'
4232

deploy/cloudbuild.yaml

+6-16
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,13 @@
11
# using default substitutions, provided by Google Cloud Build
22
# see: https://cloud.google.com/container-builder/docs/configuring-builds/substitute-variable-values#using_default_substitutions
33
steps:
4-
5-
# Download the latest version of the builder image
6-
- name: 'gcr.io/cloud-builders/docker'
7-
entrypoint: 'bash'
8-
args:
9-
- '-c'
10-
- |
11-
docker pull gcr.io/$PROJECT_ID/skaffold-builder:latest || exit 0
12-
# until https://github.com/GoogleCloudPlatform/cloud-builders/issues/253 is fixed
13-
14-
# Rebuild the builder image if necessary
154
- name: 'gcr.io/cloud-builders/docker'
165
args:
176
- 'build'
187
- '-t'
198
- 'gcr.io/$PROJECT_ID/skaffold-builder:latest'
209
- '-f'
2110
- 'deploy/skaffold/Dockerfile'
22-
- '--cache-from'
23-
- 'gcr.io/$PROJECT_ID/skaffold-builder:latest'
24-
- '--target'
25-
- 'builder'
2611
- '.'
2712

2813
# Do the go build & push the results to GCS
@@ -34,8 +19,13 @@ steps:
3419
- 'RELEASE_BUCKET=$_RELEASE_BUCKET'
3520
- 'GCP_PROJECT=$PROJECT_ID'
3621

22+
# Check that skaffold is in the image
23+
- name: 'gcr.io/$PROJECT_ID/skaffold:edge'
24+
args:
25+
- 'skaffold'
26+
- 'version'
27+
3728
images:
38-
- 'gcr.io/$PROJECT_ID/skaffold-builder:latest'
3929
- 'gcr.io/$PROJECT_ID/skaffold:edge'
4030
- 'gcr.io/$PROJECT_ID/skaffold:$COMMIT_SHA'
4131

deploy/skaffold/Dockerfile

+4-101
Original file line numberDiff line numberDiff line change
@@ -12,109 +12,12 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
# Download kubectl
16-
FROM alpine:3.10 as download-kubectl
17-
ENV KUBECTL_VERSION v1.12.8
18-
ENV KUBECTL_URL https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl
19-
RUN wget -O kubectl "${KUBECTL_URL}"
20-
RUN chmod +x kubectl
21-
22-
# Download helm
23-
FROM alpine:3.10 as download-helm
24-
ENV HELM_VERSION v2.12.0
25-
ENV HELM_URL https://storage.googleapis.com/kubernetes-helm/helm-${HELM_VERSION}-linux-amd64.tar.gz
26-
RUN wget -O helm.tar.gz "${HELM_URL}"
27-
RUN tar -xvf helm.tar.gz --strip-components 1
28-
29-
# Download kustomize
30-
FROM alpine:3.10 as download-kustomize
31-
ENV KUSTOMIZE_VERSION 2.1.0
32-
ENV KUSTOMIZE_URL https://github.com/kubernetes-sigs/kustomize/releases/download/v${KUSTOMIZE_VERSION}/kustomize_${KUSTOMIZE_VERSION}_linux_amd64
33-
RUN wget -O kustomize "${KUSTOMIZE_URL}"
34-
RUN chmod +x kustomize
35-
36-
# Download kompose
37-
FROM alpine:3.10 as download-kompose
38-
ENV KOMPOSE_VERSION v1.19.0
39-
ENV KOMPOSE_URL https://github.com/kubernetes/kompose/releases/download/${KOMPOSE_VERSION}/kompose-linux-amd64
40-
RUN wget -O kompose "${KOMPOSE_URL}"
41-
RUN chmod +x kompose
42-
43-
# Download container-structure-test
44-
FROM alpine:3.10 as download-container-structure-test
45-
ENV CONTAINER_STRUCTURE_TEST_VERSION v1.5.0
46-
ENV CONTAINER_STRUCTURE_TEST_URL https://storage.googleapis.com/container-structure-test/${CONTAINER_STRUCTURE_TEST_VERSION}/container-structure-test-linux-amd64
47-
RUN wget -O container-structure-test "${CONTAINER_STRUCTURE_TEST_URL}"
48-
RUN chmod +x container-structure-test
49-
50-
# Download kind
51-
FROM alpine:3.10 as download-kind
52-
ENV KIND_VERSION v0.7.0
53-
ENV KIND_URL https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-linux-amd64
54-
RUN wget -O kind "${KIND_URL}"
55-
RUN chmod +x kind
56-
57-
# Download gcloud
58-
FROM alpine:3.10 as download-gcloud
59-
ENV GCLOUD_VERSION 274.0.0
60-
ENV GCLOUD_URL https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${GCLOUD_VERSION}-linux-x86_64.tar.gz
61-
RUN wget -O gcloud.tar.gz "${GCLOUD_URL}"
62-
RUN tar -zxf gcloud.tar.gz
63-
64-
# Download bazel
65-
FROM alpine:3.10 as download-bazel
66-
ENV BAZEL_VERSION 2.0.0
67-
ENV BAZEL_URL https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-linux-x86_64
68-
RUN wget -O bazel "${BAZEL_URL}"
69-
RUN chmod +x bazel
70-
71-
FROM gcr.io/gcp-runtimes/ubuntu_16_0_4 as runtime_deps
72-
73-
RUN apt-get update && \
74-
apt-get install --no-install-recommends --no-install-suggests -y \
75-
git python unzip && \
76-
rm -rf /var/lib/apt/lists/*
77-
78-
COPY --from=docker:18.09.6 /usr/local/bin/docker /usr/local/bin/
79-
COPY --from=download-kubectl kubectl /usr/local/bin/
80-
COPY --from=download-helm helm /usr/local/bin/
81-
COPY --from=download-kustomize kustomize /usr/local/bin/
82-
COPY --from=download-kompose kompose /usr/local/bin/
83-
COPY --from=download-container-structure-test container-structure-test /usr/local/bin/
84-
COPY --from=download-bazel bazel /usr/local/bin/
85-
COPY --from=download-gcloud google-cloud-sdk/ /google-cloud-sdk/
86-
COPY --from=download-kind kind /usr/local/bin/
87-
88-
# Finish installation of bazel
89-
RUN bazel version
90-
91-
# Finish installation of gcloud
92-
RUN CLOUDSDK_PYTHON="python2.7" /google-cloud-sdk/install.sh \
93-
--usage-reporting=false \
94-
--bash-completion=false \
95-
--disable-installation-options
96-
ENV PATH=$PATH:/google-cloud-sdk/bin
97-
RUN gcloud auth configure-docker
98-
99-
FROM runtime_deps as builder
100-
RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y \
101-
build-essential \
102-
python-setuptools \
103-
lsb-release \
104-
openjdk-8-jdk \
105-
software-properties-common \
106-
jq \
107-
apt-transport-https && \
108-
rm -rf /var/lib/apt/lists/*
109-
COPY --from=golang:1.13 /usr/local/go /usr/local/go
110-
ENV PATH /usr/local/go/bin:/root/go/bin:$PATH
15+
# This base image has to be updated manually after running `make build_deps`
16+
FROM gcr.io/k8s-skaffold/build_deps:0c78248757f1753c4c64a791160d5e2fdd35f157 as builder
11117
WORKDIR /skaffold
11218
COPY . .
11319

114-
FROM builder as build-skaffold
20+
FROM builder as release
11521
ARG VERSION
11622
RUN make clean && make out/skaffold-linux-amd64 VERSION=$VERSION && mv out/skaffold-linux-amd64 /usr/bin/skaffold
117-
118-
FROM runtime_deps as distribution
119-
COPY --from=build-skaffold /usr/bin/skaffold /usr/bin/skaffold
120-
RUN skaffold credits -d /THIRD_PARTY_NOTICES
23+
RUN skaffold credits -d /THIRD_PARTY_NOTICES

deploy/skaffold/Dockerfile.deps

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# Copyright 2019 The Skaffold Authors All rights reserved.
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+
15+
# Download kubectl
16+
FROM alpine:3.10 as download-kubectl
17+
ENV KUBECTL_VERSION v1.14.10
18+
ENV KUBECTL_URL https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/linux/amd64/kubectl
19+
RUN wget -O kubectl "${KUBECTL_URL}"
20+
RUN chmod +x kubectl
21+
22+
# Download helm
23+
FROM alpine:3.10 as download-helm
24+
ENV HELM_VERSION v2.12.0
25+
ENV HELM_URL https://storage.googleapis.com/kubernetes-helm/helm-${HELM_VERSION}-linux-amd64.tar.gz
26+
RUN wget -O helm.tar.gz "${HELM_URL}"
27+
RUN tar -xvf helm.tar.gz --strip-components 1
28+
29+
# Download kustomize
30+
FROM alpine:3.10 as download-kustomize
31+
ENV KUSTOMIZE_VERSION 3.5.4
32+
ENV KUSTOMIZE_URL https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${KUSTOMIZE_VERSION}/kustomize_v${KUSTOMIZE_VERSION}_linux_amd64.tar.gz
33+
RUN wget -O kustomize.tar.gz "${KUSTOMIZE_URL}"
34+
RUN tar -xvf kustomize.tar.gz
35+
36+
# Download kompose
37+
FROM alpine:3.10 as download-kompose
38+
ENV KOMPOSE_VERSION v1.20.0
39+
ENV KOMPOSE_URL https://github.com/kubernetes/kompose/releases/download/${KOMPOSE_VERSION}/kompose-linux-amd64
40+
RUN wget -O kompose "${KOMPOSE_URL}"
41+
RUN chmod +x kompose
42+
43+
# Download container-structure-test
44+
FROM alpine:3.10 as download-container-structure-test
45+
ENV CONTAINER_STRUCTURE_TEST_VERSION v1.8.0
46+
ENV CONTAINER_STRUCTURE_TEST_URL https://storage.googleapis.com/container-structure-test/${CONTAINER_STRUCTURE_TEST_VERSION}/container-structure-test-linux-amd64
47+
RUN wget -O container-structure-test "${CONTAINER_STRUCTURE_TEST_URL}"
48+
RUN chmod +x container-structure-test
49+
50+
# Download kind
51+
FROM alpine:3.10 as download-kind
52+
ENV KIND_VERSION v0.7.0
53+
ENV KIND_URL https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-linux-amd64
54+
RUN wget -O kind "${KIND_URL}"
55+
RUN chmod +x kind
56+
57+
# Download gcloud
58+
FROM alpine:3.10 as download-gcloud
59+
ENV GCLOUD_VERSION 276.0.0
60+
ENV GCLOUD_URL https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-${GCLOUD_VERSION}-linux-x86_64.tar.gz
61+
RUN wget -O gcloud.tar.gz "${GCLOUD_URL}"
62+
RUN tar -zxf gcloud.tar.gz
63+
64+
# Download bazel
65+
FROM alpine:3.10 as download-bazel
66+
ENV BAZEL_VERSION 2.0.0
67+
ENV BAZEL_URL https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-linux-x86_64
68+
RUN wget -O bazel "${BAZEL_URL}"
69+
RUN chmod +x bazel
70+
71+
FROM gcr.io/gcp-runtimes/ubuntu_16_0_4 as runtime_deps
72+
73+
RUN apt-get update && \
74+
apt-get install --no-install-recommends --no-install-suggests -y \
75+
git python unzip && \
76+
rm -rf /var/lib/apt/lists/*
77+
78+
COPY --from=docker:18.09.6 /usr/local/bin/docker /usr/local/bin/
79+
COPY --from=download-kubectl kubectl /usr/local/bin/
80+
COPY --from=download-helm helm /usr/local/bin/
81+
COPY --from=download-kustomize kustomize /usr/local/bin/
82+
COPY --from=download-kompose kompose /usr/local/bin/
83+
COPY --from=download-container-structure-test container-structure-test /usr/local/bin/
84+
COPY --from=download-bazel bazel /usr/local/bin/
85+
COPY --from=download-gcloud google-cloud-sdk/ /google-cloud-sdk/
86+
COPY --from=download-kind kind /usr/local/bin/
87+
88+
# Finish installation of bazel
89+
RUN bazel version
90+
91+
# Finish installation of gcloud
92+
RUN CLOUDSDK_PYTHON="python2.7" /google-cloud-sdk/install.sh \
93+
--usage-reporting=false \
94+
--bash-completion=false \
95+
--disable-installation-options
96+
ENV PATH=$PATH:/google-cloud-sdk/bin
97+
RUN gcloud auth configure-docker
98+
99+
FROM runtime_deps
100+
RUN apt-get update && apt-get install --no-install-recommends --no-install-suggests -y \
101+
build-essential \
102+
python-setuptools \
103+
lsb-release \
104+
openjdk-8-jdk \
105+
software-properties-common \
106+
jq \
107+
apt-transport-https && \
108+
rm -rf /var/lib/apt/lists/*
109+
COPY --from=golang:1.13 /usr/local/go /usr/local/go
110+
ENV PATH /usr/local/go/bin:/root/go/bin:$PATH

0 commit comments

Comments
 (0)