diff --git a/Makefile b/Makefile index bfc0a8656ef1..2ecaf23b03db 100755 --- a/Makefile +++ b/Makefile @@ -19,11 +19,14 @@ VERSION_BUILD ?= 2 RAW_VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).${VERSION_BUILD} VERSION ?= v$(RAW_VERSION) +KUBERNETES_VERSION ?= $(shell egrep "^var DefaultKubernetesVersion" pkg/minikube/constants/constants.go | cut -d \" -f2) + # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions ISO_VERSION ?= v$(VERSION_MAJOR).$(VERSION_MINOR).0 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) RPM_VERSION ?= $(DEB_VERSION) +KIC_VERSION ?= 0.0.5 # used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below GO_VERSION ?= 1.13.4 @@ -505,9 +508,18 @@ storage-provisioner-image: out/storage-provisioner-$(GOARCH) ## Build storage-pr .PHONY: kic-base-image kic-base-image: ## builds the base image used for kic. - docker rmi -f $(REGISTRY)/kicbase:v0.0.5-snapshot || true - docker build -f ./hack/images/kicbase.Dockerfile -t $(REGISTRY)/kicbase:v0.0.5-snapshot --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) . + docker rmi -f $(REGISTRY)/kicbase:v$(KIC_VERSION)-snapshot || true + docker build -f ./hack/images/kicbase.Dockerfile -t $(REGISTRY)/kicbase:v$(KIC_VERSION)-snapshot --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) --target base . + + +.PHONY: kic-preloaded-base-image +kic-preloaded-base-image: generate-preloaded-images-tar ## builds the base image used for kic. + docker rmi -f $(REGISTRY)/kicbase:v$(KIC_VERSION)-k8s-${KUBERNETES_VERSION} || true + docker build -f ./hack/images/kicbase.Dockerfile -t $(REGISTRY)/kicbase:v$(KIC_VERSION)-k8s-${KUBERNETES_VERSION} --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) --build-arg KUBERNETES_VERSION=${KUBERNETES_VERSION} . +.PHONY: generate-preloaded-images-tar +generate-preloaded-images-tar: out/minikube + go run ./hack/preload-images/preload_images.go -kubernetes-version ${KUBERNETES_VERSION} .PHONY: push-storage-provisioner-image diff --git a/hack/images/kicbase.Dockerfile b/hack/images/kicbase.Dockerfile index 7bb8458c897d..58fe4bb55b31 100644 --- a/hack/images/kicbase.Dockerfile +++ b/hack/images/kicbase.Dockerfile @@ -2,7 +2,7 @@ ARG COMMIT_SHA # using base image created by kind https://github.com/kubernetes-sigs/kind # which is an ubuntu 19.10 with an entry-point that helps running systemd # could be changed to any debian that can run systemd -FROM kindest/base:v20200122-2dfe64b2 +FROM kindest/base:v20200122-2dfe64b2 as base USER root RUN apt-get update && apt-get install -y --no-install-recommends \ sudo \ @@ -34,12 +34,22 @@ USER root # https://github.com/kubernetes-sigs/kind/blob/master/images/base/files/usr/local/bin/entrypoint RUN mkdir -p /kind RUN rm -rf \ - /var/cache/debconf/* \ - /var/lib/apt/lists/* \ - /var/log/* \ - /tmp/* \ - /var/tmp/* \ - /usr/share/doc/* \ - /usr/share/man/* \ - /usr/share/local/* \ -RUN echo "kic! Build: ${COMMIT_SHA} Time :$(date)" > "/kic.txt" + /var/cache/debconf/* \ + /var/lib/apt/lists/* \ + /var/log/* \ + /tmp/* \ + /var/tmp/* \ + /usr/share/doc/* \ + /usr/share/man/* \ + /usr/share/local/* \ + RUN echo "kic! Build: ${COMMIT_SHA} Time :$(date)" > "/kic.txt" + + +FROM busybox +ARG KUBERNETES_VERSION +COPY out/preloaded-images-k8s-$KUBERNETES_VERSION.tar /preloaded-images.tar +RUN tar xvf /preloaded-images.tar -C / + +FROM base +COPY --from=1 /var/lib/docker /var/lib/docker +COPY --from=1 /var/lib/minikube/binaries /var/lib/minikube/binaries diff --git a/hack/preload-images/preload_images.go b/hack/preload-images/preload_images.go new file mode 100644 index 000000000000..609ef0971a1c --- /dev/null +++ b/hack/preload-images/preload_images.go @@ -0,0 +1,107 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "flag" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "github.com/pkg/errors" +) + +const ( + profile = "generate-preloaded-images-tar" + minikubePath = "out/minikube" +) + +var ( + kubernetesVersion = "" + tarballFilename = "" +) + +func init() { + flag.StringVar(&kubernetesVersion, "kubernetes-version", "", "desired kubernetes version, for example `v1.17.2`") + flag.Parse() + tarballFilename = fmt.Sprintf("preloaded-images-k8s-%s.tar", kubernetesVersion) +} + +func main() { + if err := executePreloadImages(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func executePreloadImages() error { + defer func() { + if err := deleteMinikube(); err != nil { + fmt.Println(err) + } + }() + if err := startMinikube(); err != nil { + return err + } + if err := createImageTarball(); err != nil { + return err + } + return copyTarballToHost() +} + +func startMinikube() error { + cmd := exec.Command(minikubePath, "start", "-p", profile, "--memory", "4000", "--kubernetes-version", kubernetesVersion, "--wait=false") + cmd.Stdout = os.Stdout + return cmd.Run() +} + +func createImageTarball() error { + cmd := exec.Command(minikubePath, "ssh", "-p", profile, "--", "sudo", "tar", "cvf", tarballFilename, "/var/lib/docker", "/var/lib/minikube/binaries") + cmd.Stdout = os.Stdout + return cmd.Run() +} + +func copyTarballToHost() error { + sshKey, err := runCmd([]string{minikubePath, "ssh-key", "-p", profile}) + if err != nil { + return errors.Wrap(err, "getting ssh-key") + } + + ip, err := runCmd([]string{minikubePath, "ip", "-p", profile}) + if err != nil { + return errors.Wrap(err, "getting ip") + } + + dest := filepath.Join("out/", tarballFilename) + args := []string{"scp", "-o", "StrictHostKeyChecking=no", "-i", string(sshKey), fmt.Sprintf("docker@%s:/home/docker/%s", ip, tarballFilename), dest} + _, err = runCmd(args) + return err +} + +func deleteMinikube() error { + cmd := exec.Command(minikubePath, "delete", "-p", profile) + cmd.Stdout = os.Stdout + return cmd.Run() +} + +func runCmd(command []string) (string, error) { + cmd := exec.Command(command[0], command[1:]...) + output, err := cmd.Output() + return strings.Trim(string(output), "\n "), err +}