diff --git a/.github/workflows/build-multiarch.yaml b/.github/workflows/build-multiarch.yaml new file mode 100644 index 00000000..9b9776db --- /dev/null +++ b/.github/workflows/build-multiarch.yaml @@ -0,0 +1,38 @@ +name: BuildContainerImage + +on: + push: + tags: + - 'v3*' + +jobs: + build: + name: Build + runs-on: ubuntu-latest + env: + GO111MODULE: on + steps: + - name: Set env + run: echo "RELEASE_TAG=${GITHUB_REF:10}" >> $GITHUB_ENV + + - name: Check out code into the Go module directory + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + + - name: Set up Docker buildx + uses: docker/setup-buildx-action@v1 + + - name: Build and push docker images + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + if: github.event_name == 'push' + run: | + echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + make release-prod \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 3c2aeadb..7584f3b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,6 @@ +# Build architecture +ARG ARCH + # Download dependencies FROM alpine:3.11 as base_os_context @@ -46,7 +49,7 @@ RUN --mount=type=cache,target=/root/.cache/go-build \ go build -ldflags "${LDFLAGS}" \ -o manager ${package} -FROM alpine:3.11 +FROM --platform=${ARCH} alpine:3.16 WORKDIR / diff --git a/Makefile b/Makefile index 3f63971d..5cfaf59d 100644 --- a/Makefile +++ b/Makefile @@ -280,20 +280,14 @@ docker-build: docker-pull-prerequisites ## Run docker-build-* targets for all pr .PHONY: docker-build-capkk docker-build-capkk: ## Build the docker image for capkk DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg ldflags="$(LDFLAGS)" . -t $(CAPKK_CONTROLLER_IMG)-$(ARCH):$(TAG) - $(MAKE) set-manifest-image MANIFEST_IMG=$(CAPKK_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./config/default/manager_image_patch.yaml" - $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./config/default/manager_pull_policy.yaml" .PHONY: docker-build-k3s-bootstrap docker-build-k3s-bootstrap: ## Build the docker image for k3s bootstrap controller manager DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./bootstrap/k3s --build-arg ldflags="$(LDFLAGS)" . -t $(K3S_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH):$(TAG) - $(MAKE) set-manifest-image MANIFEST_IMG=$(K3S_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./bootstrap/k3s/config/default/manager_image_patch.yaml" - $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./bootstrap/k3s/config/default/manager_pull_policy.yaml" .PHONY: docker-build-k3s-control-plane docker-build-k3s-control-plane: ## Build the docker image for k3s control plane controller manager DOCKER_BUILDKIT=1 docker build --build-arg builder_image=$(GO_CONTAINER_IMAGE) --build-arg goproxy=$(GOPROXY) --build-arg ARCH=$(ARCH) --build-arg package=./controlplane/k3s --build-arg ldflags="$(LDFLAGS)" . -t $(K3S_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH):$(TAG) - $(MAKE) set-manifest-image MANIFEST_IMG=$(K3S_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH) MANIFEST_TAG=$(TAG) TARGET_RESOURCE="./controlplane/k3s/config/default/manager_image_patch.yaml" - $(MAKE) set-manifest-pull-policy TARGET_RESOURCE="./controlplane/k3s/config/default/manager_pull_policy.yaml" .PHONY: docker-build-e2e docker-build-e2e: ## Build the docker image for capkk @@ -434,12 +428,24 @@ manifest-modification: # Set the manifest images to the staging/production bucke $(MAKE) set-manifest-image \ MANIFEST_IMG=$(REGISTRY)/$(CAPKK_IMAGE_NAME) MANIFEST_TAG=$(RELEASE_TAG) \ TARGET_RESOURCE="./config/default/manager_image_patch.yaml" + $(MAKE) set-manifest-image \ + MANIFEST_IMG=$(REGISTRY)/$(K3S_BOOTSTRAP_CONTROLLER_IMG) MANIFEST_TAG=$(RELEASE_TAG) \ + TARGET_RESOURCE="./bootstrap/k3s/config/default/manager_image_patch.yaml" + $(MAKE) set-manifest-image \ + MANIFEST_IMG=$(REGISTRY)/$(K3S_CONTROL_PLANE_CONTROLLER_IMG) MANIFEST_TAG=$(RELEASE_TAG) \ + TARGET_RESOURCE="./controlplane/k3s/config/default/manager_image_patch.yaml" $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./config/default/manager_pull_policy.yaml" + $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./bootstrap/k3s/config/default/manager_pull_policy.yaml" + $(MAKE) set-manifest-pull-policy PULL_POLICY=IfNotPresent TARGET_RESOURCE="./controlplane/k3s/config/default/manager_pull_policy.yaml" .PHONY: release-manifests release-manifests: $(RELEASE_DIR) $(KUSTOMIZE) ## Build the manifests to publish with a release # Build capkk-components. $(KUSTOMIZE) build config/default > $(RELEASE_DIR)/infrastructure-components.yaml + # Build bootstrap-components. + $(KUSTOMIZE) build bootstrap/k3s/config/default > $(RELEASE_DIR)/bootstrap-components.yaml + # Build control-plane-components. + $(KUSTOMIZE) build controlplane/k3s/config/default > $(RELEASE_DIR)/control-plane-components.yaml # Add metadata to the release artifacts cp metadata.yaml $(RELEASE_DIR)/metadata.yaml @@ -448,14 +454,49 @@ release-manifests: $(RELEASE_DIR) $(KUSTOMIZE) ## Build the manifests to publish release-templates: $(RELEASE_DIR) ## Generate release templates cp templates/cluster-template*.yaml $(RELEASE_DIR)/ +.PHONY: release-prod +release-prod: ## Build and push container images to the prod + REGISTRY=$(PROD_REGISTRY) TAG=$(RELEASE_TAG) $(MAKE) docker-build-all docker-push-all + ## -------------------------------------- ## Docker ## -------------------------------------- +.PHONY: docker-push-all +docker-push-all: $(addprefix docker-push-,$(ALL_ARCH)) ## Push the docker images to be included in the release for all architectures + related multiarch manifests + $(MAKE) docker-push-manifest-capkk + $(MAKE) docker-push-manifest-k3s-bootstrap + $(MAKE) docker-push-manifest-k3s-control-plane + +docker-push-%: + $(MAKE) ARCH=$* docker-push + .PHONY: docker-push docker-push: ## Push the docker images docker push $(CAPKK_CONTROLLER_IMG)-$(ARCH):$(TAG) docker push $(K3S_BOOTSTRAP_CONTROLLER_IMG)-$(ARCH):$(TAG) + docker push $(K3S_CONTROL_PLANE_CONTROLLER_IMG)-$(ARCH):$(TAG) + +.PHONY: docker-push-manifest-capkk +docker-push-manifest-capkk: ## Push the multiarch manifest for the capkk docker images + ## Minimum docker version 18.06.0 is required for creating and pushing manifest images. + docker manifest create --amend $(CAPKK_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(CAPKK_CONTROLLER_IMG)\-&:$(TAG)~g") + @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${CAPKK_CONTROLLER_IMG}:${TAG} ${CAPKK_CONTROLLER_IMG}-$${arch}:${TAG}; done + docker manifest push --purge $(CAPKK_CONTROLLER_IMG):$(TAG) + +.PHONY: docker-push-manifest-k3s-bootstrap +docker-push-manifest-k3s-bootstrap: ## Push the multiarch manifest for the k3s bootstrap docker images + ## Minimum docker version 18.06.0 is required for creating and pushing manifest images. + docker manifest create --amend $(K3S_BOOTSTRAP_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(K3S_BOOTSTRAP_CONTROLLER_IMG)\-&:$(TAG)~g") + @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${K3S_BOOTSTRAP_CONTROLLER_IMG}:${TAG} ${K3S_BOOTSTRAP_CONTROLLER_IMG}-$${arch}:${TAG}; done + docker manifest push --purge $(K3S_BOOTSTRAP_CONTROLLER_IMG):$(TAG) + +.PHONY: docker-push-manifest-k3s-control-plane +docker-push-manifest-k3s-control-plane: ## Push the multiarch manifest for the k3s control plane docker images + ## Minimum docker version 18.06.0 is required for creating and pushing manifest images. + docker manifest create --amend $(K3S_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(K3S_CONTROL_PLANE_CONTROLLER_IMG)\-&:$(TAG)~g") + @for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${K3S_CONTROL_PLANE_CONTROLLER_IMG}:${TAG} ${K3S_CONTROL_PLANE_CONTROLLER_IMG}-$${arch}:${TAG}; done + docker manifest push --purge $(K3S_CONTROL_PLANE_CONTROLLER_IMG):$(TAG) .PHONY: set-manifest-pull-policy set-manifest-pull-policy: