Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 57 additions & 50 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -96,50 +96,41 @@ gke-gcloud-auth-plugin-windows-amd64 gke-gcloud-auth-plugin-windows-arm64: gke-g
gke-gcloud-auth-plugin-darwin-arm64:
mkdir -p release/$(GIT_VERSION)/gke-gcloud-auth-plugin/darwin/arm64
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build $(LDFLAGS) -o release/$(GIT_VERSION)/gke-gcloud-auth-plugin/darwin/arm64/gke-gcloud-auth-plugin k8s.io/cloud-provider-gcp/cmd/gke-gcloud-auth-plugin

.PHONY: copy-binaries-to-gcs
copy-binaries-to-gcs: build-all ## Build and copy binaries to GCS.
gcloud storage cp --recursive release/$(GIT_VERSION) gs://$(BUCKET_NAME)/$(GIT_VERSION)

.PHONY: release-tars
release-tars: build-all ## Build all release artifacts.
# Clean up any existing tarballs (but NOT the binaries we just built)
rm -f release/$(GIT_VERSION)/*.tar.gz
rm -rf release/$(GIT_VERSION)/manifests
mkdir -p release/$(GIT_VERSION)

@echo "Determining Kubernetes version..."
@if [ -n "$(KUBE_VERSION_OVERRIDE)" ]; then \
echo "Using override version: $(KUBE_VERSION_OVERRIDE)"; \
echo $(KUBE_VERSION_OVERRIDE) > release/$(GIT_VERSION)/kube-version.txt; \
else \
echo "Downloading stable version..."; \
curl -sL https://dl.k8s.io/release/stable.txt > release/$(GIT_VERSION)/kube-version.txt; \
release-tars: release-tars-linux-amd64 release-tars-windows-amd64 release-manifests generate-all-checksums ## Build all release artifacts.

# This is a helper target, not intended for direct use.
.PHONY: .ensure-kube-version
.ensure-kube-version:
@mkdir -p release/$(GIT_VERSION)
@if [ ! -f release/$(GIT_VERSION)/kube-version.txt ]; then \
if [ -n "$(KUBE_VERSION_OVERRIDE)" ]; then \
echo "Using override version: $(KUBE_VERSION_OVERRIDE)"; \
echo $(KUBE_VERSION_OVERRIDE) > release/$(GIT_VERSION)/kube-version.txt; \
else \
echo "Downloading stable version..."; \
curl -sL https://dl.k8s.io/release/stable.txt > release/$(GIT_VERSION)/kube-version.txt; \
fi; \
fi


.PHONY: release-tars-linux-amd64
release-tars-linux-amd64: cloud-controller-manager-linux-amd64 auth-provider-gcp-linux-amd64 bundle .ensure-kube-version ## Build release artifacts for linux/amd64.
# Download upstream tarballs
mkdir -p release/upstream
@echo "Packing release tarballs for linux/amd64..."
mkdir -p release/upstream release/temp/server release/temp/node
@KUBE_VERSION=$$(cat release/$(GIT_VERSION)/kube-version.txt); \
echo "Building release for Kubernetes version: $$KUBE_VERSION"; \
echo "Downloading upstream server tarball..."; \
curl -L "https://dl.k8s.io/release/$$KUBE_VERSION/kubernetes-server-linux-amd64.tar.gz" -o release/upstream/server.tar.gz; \
echo "Downloading upstream node tarball..."; \
curl -L "https://dl.k8s.io/release/$$KUBE_VERSION/kubernetes-node-linux-amd64.tar.gz" -o release/upstream/node.tar.gz

# Dockerize cloud-controller-manager
mkdir -p release/$(GIT_VERSION)/docker-build
cp release/$(GIT_VERSION)/cloud-controller-manager/linux/amd64/cloud-controller-manager release/$(GIT_VERSION)/docker-build/
echo "FROM registry.k8s.io/build-image/go-runner:v2.4.0-go1.24.10-bookworm.0" > release/$(GIT_VERSION)/docker-build/Dockerfile
echo "COPY cloud-controller-manager /cloud-controller-manager" >> release/$(GIT_VERSION)/docker-build/Dockerfile
echo "CMD [\"/cloud-controller-manager\"]" >> release/$(GIT_VERSION)/docker-build/Dockerfile

docker build -t registry.k8s.io/cloud-controller-manager:$(GIT_VERSION) release/$(GIT_VERSION)/docker-build/
docker save registry.k8s.io/cloud-controller-manager:$(GIT_VERSION) > release/$(GIT_VERSION)/cloud-controller-manager.tar
echo "$(GIT_VERSION)" > release/$(GIT_VERSION)/cloud-controller-manager.docker_tag
rm -rf release/$(GIT_VERSION)/docker-build

# Unpack and Inject Server
mkdir -p release/temp/server
tar xzf release/upstream/server.tar.gz -C release/temp/server

# Inject CCM logic
Expand All @@ -158,26 +149,35 @@ release-tars: build-all ## Build all release artifacts.
tar -czf release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz -C release/temp/server kubernetes

# Unpack and Inject Node
mkdir -p release/temp/node
tar xzf release/upstream/node.tar.gz -C release/temp/node

# Inject Auth Provider to Node (needed for kubelet credential provider)
cp release/$(GIT_VERSION)/auth-provider-gcp/linux/amd64/auth-provider-gcp release/temp/node/kubernetes/node/bin/

# Repack Node
tar -czf release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz -C release/temp/node kubernetes

rm -rf release/temp release/upstream
@echo "Linux amd64 release tarballs created in release/$(GIT_VERSION)/"

.PHONY: release-tars-windows-amd64
release-tars-windows-amd64: auth-provider-gcp-windows-amd64 ## Build release artifacts for windows/amd64.
# Pack kubernetes-node-windows-amd64.tar.gz (Minimal, per existing logic)
@echo "Packing kubernetes-node-windows-amd64.tar.gz..."
mkdir -p release/$(GIT_VERSION)/node-windows
cp -f release/$(GIT_VERSION)/auth-provider-gcp/windows/amd64/auth-provider-gcp.exe release/$(GIT_VERSION)/node-windows/auth-provider-gcp.exe
tar -czf release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz \
--transform 's|release/$(GIT_VERSION)/node-windows/auth-provider-gcp.exe|kubernetes/node/bin/auth-provider-gcp.exe|' \
release/$(GIT_VERSION)/node-windows/auth-provider-gcp.exe
rm -rf release/$(GIT_VERSION)/node-windows
@echo "Windows amd64 release tarball created in release/$(GIT_VERSION)/"

.PHONY: release-manifests
release-manifests: .ensure-kube-version ## Build the kubernetes-manifests.tar.gz artifact.
# Pack kubernetes-manifests.tar.gz
# 1. Download and unpack the UPSTREAM manifests
mkdir -p release/$(GIT_VERSION)/manifests
@echo "Packing kubernetes-manifests.tar.gz..."
mkdir -p release/$(GIT_VERSION)/manifests release/upstream
curl -L "https://dl.k8s.io/release/$$(cat release/$(GIT_VERSION)/kube-version.txt)/kubernetes-manifests.tar.gz" -o release/upstream/manifests.tar.gz
tar xzf release/upstream/manifests.tar.gz -C release/$(GIT_VERSION)/manifests

Expand Down Expand Up @@ -206,7 +206,7 @@ release-tars: build-all ## Build all release artifacts.
find release/$(GIT_VERSION)/manifests/kubernetes/addons -name "*.yaml" -exec sed -i "s|{{ prometheus_to_sd_endpoint }}|$(PROMETHEUS_TO_SD_ENDPOINT)|g" {} +
find release/$(GIT_VERSION)/manifests/kubernetes/addons -name "*.yaml" -exec sed -i "s|{{ fluentd_gcp_configmap_name }}|$(FLUENTD_GCP_CONFIGMAP_NAME)|g" {} +
find release/$(GIT_VERSION)/manifests/kubernetes/addons -name "*.yaml" -exec sed -i "s|{{cloud_controller_manager_docker_tag}}|$(GIT_VERSION)|g" {} +

# Verify critical substitutions
if grep -qr --include="*.yaml" "{{cloud_controller_manager_docker_tag}}" release/$(GIT_VERSION)/manifests/kubernetes/addons; then \
echo "Error: Placeholder {{cloud_controller_manager_docker_tag}} still present in addons."; \
Expand All @@ -223,24 +223,31 @@ release-tars: build-all ## Build all release artifacts.
cp cluster/gce/gci/gke-internal-configure-helper.sh release/$(GIT_VERSION)/manifests/kubernetes/gci-trusty/; \
fi
# 3. Repack the combined manifests
tar -czf release/$(GIT_VERSION)/kubernetes-manifests.tar.gz \
-C release/$(GIT_VERSION)/manifests .
rm -rf release/$(GIT_VERSION)/manifests

# Cleanup temp
rm -rf release/temp release/upstream

echo "4. Generating Checksums..."
shasum -a 1 release/$(GIT_VERSION)/kubernetes-manifests.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-manifests.tar.gz.sha1
shasum -a 1 release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz.sha1
shasum -a 1 release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz.sha1
shasum -a 1 release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz.sha1
shasum -a 256 release/$(GIT_VERSION)/kubernetes-manifests.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-manifests.tar.gz.sha256
shasum -a 256 release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz.sha256
shasum -a 256 release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz.sha256
shasum -a 256 release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz.sha256

echo "Release artifacts generated in release/$(GIT_VERSION)"
tar -czf release/$(GIT_VERSION)/kubernetes-manifests.tar.gz -C release/$(GIT_VERSION)/manifests .
rm -rf release/$(GIT_VERSION)/manifests release/upstream
@echo "Manifests artifact generated in release/$(GIT_VERSION)"

.PHONY: generate-all-checksums
generate-all-checksums: ## Generate checksums for all release artifacts.
# Final step: generate checksums for all artifacts.
@echo "Generating Checksums for all release artifacts..."
@if [ -f release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz ]; then \
shasum -a 1 release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz.sha1; \
shasum -a 256 release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-server-linux-amd64.tar.gz.sha256; \
fi
@if [ -f release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz ]; then \
shasum -a 1 release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz.sha1; \
shasum -a 256 release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-windows-amd64.tar.gz.sha256; \
fi
@if [ -f release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz ]; then \
shasum -a 1 release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz.sha1; \
shasum -a 256 release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-node-linux-amd64.tar.gz.sha256; \
fi
@if [ -f release/$(GIT_VERSION)/kubernetes-manifests.tar.gz ]; then \
shasum -a 1 release/$(GIT_VERSION)/kubernetes-manifests.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-manifests.tar.gz.sha1; \
shasum -a 256 release/$(GIT_VERSION)/kubernetes-manifests.tar.gz | awk '{print $$1}' > release/$(GIT_VERSION)/kubernetes-manifests.tar.gz.sha256; \
fi
@echo "Release artifacts generated in release/$(GIT_VERSION)"

## --------------------------------------
##@ Test
Expand Down
18 changes: 11 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,30 @@ IMAGE_REPO=us-central1-docker.pkg.dev/my-project/my-repo IMAGE_TAG=v0 make push-

# Cross-compiling

Selecting the target platform is done with the `--platforms` option with `bazel`.
This command builds release tarballs for Windows:
Platform-specific release tarballs can be built using the following commands.

This command builds the release tarball for Windows (`kubernetes-node-windows-amd64.tar.gz`):

```sh
bazel build --platforms=@io_bazel_rules_go//go/toolchain:windows_amd64 //release:release-tars
make release-tars-windows-amd64
```

This command explicitly targets Linux as the target platform:
This command builds the release tarballs for Linux (`kubernetes-server-linux-amd64.tar.gz` and `kubernetes-node-linux-amd64.tar.gz`):

```sh
make release-tars-linux-amd64
```

To build all release artifacts for all platforms, run:
```sh
bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 //release:release-tars
make release-tars
```


# Dependency management

Dependencies are managed using [Go modules](https://github.com/golang/go/wiki/Modules) (`go mod` subcommands).

Note that builds are done with Bazel and not the Go tool. Don't follow public
Go module docs, instead use instructions in this readme.

## Working within GOPATH

Expand Down