Skip to content

Commit 3fb1bec

Browse files
committed
feat: add arm64 support for images
Signed-off-by: Anish Ramasekar <[email protected]>
1 parent bda7f6a commit 3fb1bec

File tree

6 files changed

+90
-36
lines changed

6 files changed

+90
-36
lines changed

.pipelines/templates/e2e-kind-template.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
jobs:
22
- job: e2e_tests
3-
timeoutInMinutes: 10
3+
timeoutInMinutes: 15
44
cancelTimeoutInMinutes: 5
55
workspace:
66
clean: all

.pipelines/templates/scan-images-template.yml

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ steps:
22
- script: |
33
export REGISTRY="e2e"
44
export IMAGE_VERSION="test"
5-
make build-image
5+
export OUTPUT_TYPE="type=docker"
6+
make docker-build
7+
68
wget https://github.com/aquasecurity/trivy/releases/download/v$(TRIVY_VERSION)/trivy_$(TRIVY_VERSION)_Linux-64bit.tar.gz
79
tar zxvf trivy_$(TRIVY_VERSION)_Linux-64bit.tar.gz
810

.pipelines/templates/unit-tests-template.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ jobs:
3232
sudo ./_output/kubernetes-kms --keyvault-name $KV_NAME --key-name $KV_KEY --key-version $KV_KEY_VERSION --listen-addr "unix:///opt/azurekms.sock" > /dev/null &
3333
echo Waiting 2 seconds for the server to start
3434
sleep 2
35-
make integration-test
35+
sudo make integration-test
3636
displayName: Run integration tests
3737
- template: scan-images-template.yml

Dockerfile

+22-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
1-
ARG BASEIMAGE="gcr.io/distroless/static:nonroot-amd64"
2-
FROM $BASEIMAGE
1+
FROM golang:1.17 as builder
32

4-
COPY ./_output/kubernetes-kms /bin/
3+
WORKDIR /workspace
4+
# Copy the Go Modules manifests
5+
COPY go.mod go.mod
6+
COPY go.sum go.sum
7+
# cache deps before building and copying source so that we don't need to re-download as much
8+
# and so that source changes don't invalidate our downloaded layer
9+
RUN go mod download
510

6-
ENTRYPOINT [ "/bin/kubernetes-kms" ]
11+
# Copy the go source
12+
COPY cmd/server/main.go main.go
13+
COPY pkg/ pkg/
14+
15+
ARG GOARCH
16+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=${GOARCH} GO111MODULE=on go build -a -ldflags "${LDFLAGS:--X github.com/Azure/kubernetes-kms/pkg/version.BuildVersion=latest}" -o _output/kubernetes-kms main.go
17+
18+
# Use distroless as minimal base image to package the manager binary
19+
# Refer to https://github.com/GoogleContainerTools/distroless for more details
20+
FROM --platform=${TARGETPLATFORM:-linux/amd64} gcr.io/distroless/static:nonroot
21+
WORKDIR /
22+
COPY --from=builder /workspace/_output/kubernetes-kms .
23+
24+
ENTRYPOINT [ "/kubernetes-kms" ]

Makefile

+59-27
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ BUILD_DATE_VAR := $(REPO_PATH)/pkg/version.BuildDate
1818
BUILD_DATE := $$(date +%Y-%m-%d-%H:%M)
1919
GIT_VAR := $(REPO_PATH)/pkg/version.GitCommit
2020
GIT_HASH := $$(git rev-parse --short HEAD)
21+
LDFLAGS ?= "-X $(BUILD_DATE_VAR)=$(BUILD_DATE) -X $(BUILD_VERSION_VAR)=$(IMAGE_VERSION) -X $(GIT_VAR)=$(GIT_HASH)"
2122

2223
GO_FILES=$(shell go list ./... | grep -v /test/e2e)
2324
TOOLS_MOD_DIR := ./tools
@@ -30,9 +31,11 @@ export DOCKER_BUILDKIT
3031
# Testing var
3132
KIND_VERSION ?= 0.11.0
3233
KUBERNETES_VERSION ?= v1.21.1
33-
BATS_VERSION ?= 1.2.1
34+
BATS_VERSION ?= 1.4.1
3435

35-
GO_BUILD_OPTIONS := --tags "netgo osusergo" -ldflags "-s -X $(BUILD_VERSION_VAR)=$(IMAGE_VERSION) -X $(GIT_VAR)=$(GIT_HASH) -X $(BUILD_DATE_VAR)=$(BUILD_DATE) -extldflags '-static'"
36+
## --------------------------------------
37+
## Linting
38+
## --------------------------------------
3639

3740
$(TOOLS_DIR)/golangci-lint: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
3841
cd $(TOOLS_MOD_DIR) && \
@@ -42,41 +45,70 @@ $(TOOLS_DIR)/golangci-lint: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TO
4245
lint: $(TOOLS_DIR)/golangci-lint
4346
$(TOOLS_DIR)/golangci-lint run --timeout=5m -v
4447

45-
.PHONY: build
46-
build:
47-
$Q GOOS=linux CGO_ENABLED=0 go build $(GO_BUILD_OPTIONS) -o _output/kubernetes-kms ./cmd/server/
48-
49-
.PHONY: build-darwin
50-
build-darwin:
51-
$Q GOOS=darwin CGO_ENABLED=0 go build $(GO_BUILD_OPTIONS) -o _output/kubernetes-kms ./cmd/server/
52-
53-
build-image: clean build
54-
$Q docker build -t $(IMAGE_TAG) .
48+
## --------------------------------------
49+
## Images
50+
## --------------------------------------
5551

56-
push-image: build-image
57-
$Q docker push $(IMAGE_TAG)
52+
ALL_LINUX_ARCH ?= amd64 arm64
53+
# Output type of docker buildx build
54+
OUTPUT_TYPE ?= type=registry
5855

59-
.PHONY: clean unit-test integration-test
56+
BUILDX_BUILDER_NAME ?= img-builder
57+
QEMU_VERSION ?= 5.2.0-2
58+
# The architecture of the image
59+
ARCH ?= amd64
6060

61-
clean:
62-
$Q rm -rf _output/
61+
.PHONY: build
62+
build:
63+
go build -a -ldflags $(LDFLAGS) -o _output/kubernetes-kms ./cmd/server/
64+
65+
.PHONY: docker-build
66+
docker-build:
67+
@if ! docker buildx ls | grep $(BUILDX_BUILDER_NAME); then \
68+
docker run --rm --privileged multiarch/qemu-user-static:$(QEMU_VERSION) --reset -p yes; \
69+
docker buildx create \
70+
--name $(BUILDX_BUILDER_NAME) \
71+
--use; \
72+
docker buildx inspect $(BUILDX_BUILDER_NAME) --bootstrap; \
73+
fi
74+
docker buildx build \
75+
--build-arg GOARCH=$(ARCH) \
76+
--build-arg LDFLAGS=$(LDFLAGS) \
77+
--no-cache \
78+
--platform="linux/$(ARCH)" \
79+
--output=$(OUTPUT_TYPE) \
80+
-t $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)-linux-$(ARCH) . \
81+
--progress=plain; \
82+
@if [ "$(ARCH)" = "amd64" ] && [ "$(OUTPUT_TYPE)" = "type=docker" ]; then \
83+
docker tag $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)-linux-$(ARCH) $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION); \
84+
fi
85+
86+
.PHONY: docker-build-all
87+
docker-build-all:
88+
@for ARCH in $(ALL_LINUX_ARCH); do \
89+
$(MAKE) ARCH=$(ARCH) docker-build; \
90+
done
91+
92+
.PHONY: docker-push-manifest
93+
docker-push-manifest:
94+
docker manifest create --amend $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION) $(foreach arch,$(ALL_LINUX_ARCH),$(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)-linux-$(arch)); \
95+
for arch in $(ALL_LINUX_ARCH); do \
96+
docker manifest annotate --os linux --arch $${arch} $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION) $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION)-linux-$${arch}; \
97+
done; \
98+
docker manifest push --purge $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_VERSION); \
6399

64-
authors:
65-
$Q git log --all --format='%aN <%cE>' | sort -u | sed -n '/github/!p' > GITAUTHORS
66-
$Q cat AUTHORS GITAUTHORS | sort -u > NEWAUTHORS
67-
$Q mv NEWAUTHORS AUTHORS
68-
$Q rm -f NEWAUTHORS
69-
$Q rm -f GITAUTHORS
100+
## --------------------------------------
101+
## Testing
102+
## --------------------------------------
70103

104+
.PHONY: integration-test
71105
integration-test:
72-
$Q sudo GOPATH=$(GOPATH) go test -v -count=1 -failfast github.com/Azure/kubernetes-kms/tests/client
106+
go test -v -count=1 -failfast github.com/Azure/kubernetes-kms/tests/client
73107

108+
.PHONY: unit-test
74109
unit-test:
75110
go test -race -v -count=1 -failfast `go list ./... | grep -v client`
76111

77-
.PHONY: mod
78-
mod:
79-
@go mod tidy
80112

81113
## --------------------------------------
82114
## E2E Testing

scripts/setup-local-registry.sh

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ fi
1717
export REGISTRY=localhost:${REGISTRY_PORT}
1818
export IMAGE_NAME=keyvault
1919
export IMAGE_VERSION=e2e-$(git rev-parse --short HEAD)
20+
export OUTPUT_TYPE=type=docker
2021

2122
# push build image to local registry
22-
echo "Pushing image to local registry"
23-
make push-image
23+
echo "Build and push image to local registry"
24+
make docker-build
25+
docker push "${REGISTRY}/${IMAGE_NAME}:${IMAGE_VERSION}"
2426

2527
# generate manifest for local
2628
make e2e-generate-manifests

0 commit comments

Comments
 (0)