Skip to content

Commit a3e9f69

Browse files
committed
Switch to scratch based libgit2 container image
This moves the `libgit2` compilation to the image, to ensure it can be build on builders that aren't backed by AMD64. The image is structured in such a way that e.g. running nightly builds targeting a different Go version, or targeting a different OS vendor would be possible in the future via build arguments. Signed-off-by: Hidde Beydals <[email protected]>
1 parent 58e21f3 commit a3e9f69

File tree

6 files changed

+84
-30
lines changed

6 files changed

+84
-30
lines changed

Dockerfile

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,37 @@
1-
ARG BASE_IMG=ghcr.io/hiddeco/golang-with-libgit2
2-
ARG BASE_TAG=dev
3-
FROM ${BASE_IMG}:${BASE_TAG} AS build
1+
ARG BASE_VARIANT=bullseye
2+
ARG GO_VERSION=1.16.8
3+
ARG XX_VERSION=1.0.0-rc.2
4+
5+
ARG LIBGIT2_IMG=ghcr.io/fluxcd/golang-with-libgit2
6+
ARG LIBGIT2_TAG=libgit2-1.1.1
7+
8+
FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx
9+
FROM ${LIBGIT2_IMG}:${LIBGIT2_TAG} as libgit2
10+
11+
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-${BASE_VARIANT} as gostable
12+
FROM --platform=$BUILDPLATFORM golang:1.17rc1-${BASE_VARIANT} AS golatest
13+
14+
FROM gostable AS go-linux
15+
16+
FROM go-${TARGETOS} AS build-base-bullseye
17+
18+
# Copy the build utiltiies
19+
COPY --from=xx / /
20+
COPY --from=libgit2 /Makefile /libgit2/
21+
22+
# Install the libgit2 build dependencies
23+
RUN make -C /libgit2 cmake
24+
25+
ARG TARGETPLATFORM
26+
RUN make -C /libgit2 dependencies
27+
28+
FROM build-base-${BASE_VARIANT} as libgit2-bullseye
29+
30+
# Compile and install libgit2
31+
ARG TARGETPLATFORM
32+
RUN FLAGS=$(xx-clang --print-cmake-defines) make -C /libgit2 libgit2
33+
34+
FROM libgit2-${BASE_VARIANT} as build-bullseye
435

536
# Configure workspace
637
WORKDIR /workspace
@@ -28,7 +59,16 @@ ARG TARGETPLATFORM
2859
RUN xx-go build -o image-automation-controller -trimpath \
2960
main.go
3061

31-
FROM debian:bullseye-slim as controller
62+
FROM build-${BASE_VARIANT} as prepare-bullseye
63+
64+
# Move libgit2 lib to generic and predictable location
65+
ARG TARGETPLATFORM
66+
RUN mkdir -p /libgit2/lib/ \
67+
&& cp -d /usr/lib/$(xx-info triple)/libgit2.so* /libgit2/lib/
68+
69+
FROM prepare-${BASE_VARIANT} as build
70+
71+
FROM debian:${BASE_VARIANT}-slim as controller
3272

3373
# Configure user
3474
RUN groupadd controller && \

Makefile

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,21 @@ TAG ?= latest
77
CRD_OPTIONS ?= crd:crdVersions=v1
88

99
# Base image used to build the Go binary
10-
BASE_IMG ?= ghcr.io/hiddeco/golang-with-libgit2
11-
BASE_TAG ?= dev
10+
LIBGIT2_IMG ?= ghcr.io/fluxcd/golang-with-libgit2
11+
LIBGIT2_TAG ?= libgit2-1.1.1
12+
13+
# Allows for defining additional Docker buildx arguments,
14+
# e.g. '--push'.
15+
BUILD_ARGS ?=
16+
# Architectures to build images for
17+
BUILD_PLATFORMS ?= linux/amd64,linux/arm64,linux/arm/v7
1218

1319
# Directory with versioned, downloaded things
1420
CACHE := cache
1521

1622
# Version of the source-controller from which to get the GitRepository CRD.
1723
# Change this if you bump the source-controller/api version in go.mod.
18-
SOURCE_VER ?= v0.15.4
24+
SOURCE_VER ?= v0.16.0
1925

2026
# Version of the image-reflector-controller from which to get the ImagePolicy CRD.
2127
# Change this if you bump the image-reflector-controller/api version in go.mod.
@@ -27,13 +33,21 @@ LIBGIT2_VER ?= 1.1.1
2733
# Repository root based on Git metadata.
2834
REPOSITORY_ROOT := $(shell git rev-parse --show-toplevel)
2935

30-
# libgit2 related magical paths.
36+
# libgit2 related magical paths
3137
# These are used to determine if the target libgit2 version is already available on
32-
# the system, or where they should be installed to.
33-
SYSTEM_LIBGIT2_VER := $(shell pkg-config --modversion libgit2 2>/dev/null)
38+
# the system, or where they should be installed to
39+
SYSTEM_LIBGIT2_VERSION := $(shell pkg-config --modversion libgit2 2>/dev/null)
3440
LIBGIT2_PATH := $(REPOSITORY_ROOT)/hack/libgit2
3541
LIBGIT2_LIB_PATH := $(LIBGIT2_PATH)/lib
36-
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.so.$(LIBGIT2_VER)
42+
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.so.$(LIBGIT2_VERSION)
43+
44+
ifneq ($(LIBGIT2_VERSION),$(SYSTEM_LIBGIT2_VERSION))
45+
LIBGIT2_FORCE ?= 1
46+
endif
47+
48+
ifeq ($(shell uname -s),Darwin)
49+
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.$(LIBGIT2_VERSION).dylib
50+
endif
3751

3852
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
3953
ifeq (,$(shell go env GOBIN))
@@ -127,10 +141,12 @@ generate: controller-gen ## Generate code
127141
cd api; $(CONTROLLER_GEN) object:headerFile="../hack/boilerplate.go.txt" paths="./..."
128142

129143
docker-build: ## Build the Docker image
130-
docker build \
131-
--build-arg BASE_IMG=$(BASE_IMG) \
132-
--build-arg BASE_TAG=$(BASE_TAG) \
133-
-t $(IMG):$(TAG) .
144+
docker buildx build \
145+
--build-arg LIBGIT2_IMG=$(LIBGIT2_IMG) \
146+
--build-arg LIBGIT2_TAG=$(LIBGIT2_TAG) \
147+
--platform=$(BUILD_PLATFORMS) \
148+
-t $(IMG):$(TAG) \
149+
$(BUILD_ARGS) .
134150

135151
docker-push: ## Push the Docker image
136152
docker push $(IMG):$(TAG)
@@ -168,16 +184,15 @@ else
168184
API_REF_GEN=$(shell which gen-crd-api-reference-docs)
169185
endif
170186

171-
libgit2: $(LIBGIT2) ## Detect or download libgit2 library
187+
libgit2: $(LIBGIT2) ## Detect or download libgit2 library
172188

173189
$(LIBGIT2):
174-
ifeq ($(LIBGIT2_VER),$(SYSTEM_LIBGIT2_VER))
175-
else
190+
ifeq (1, $(LIBGIT2_FORCE))
176191
@{ \
177192
set -e; \
178193
mkdir -p $(LIBGIT2_PATH); \
179-
docker cp $(shell docker create --rm $(BASE_IMG):$(BASE_TAG)):/libgit2/Makefile $(LIBGIT2_PATH); \
180-
INSTALL_PREFIX=$(LIBGIT2_PATH) LIGBIT2_VERSION=$(LIBGIT2_VER) make -C $(LIBGIT2_PATH); \
194+
curl -sL https://raw.githubusercontent.com/fluxcd/golang-with-libgit2/$(LIBGIT2_TAG)/hack/Makefile -o $(LIBGIT2_PATH)/Makefile; \
195+
INSTALL_PREFIX=$(LIBGIT2_PATH) make -C $(LIBGIT2_PATH) libgit2; \
181196
}
182197
endif
183198

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.16
44

55
require (
66
github.com/fluxcd/pkg/apis/meta v0.10.0
7-
github.com/fluxcd/source-controller/api v0.15.4
7+
github.com/fluxcd/source-controller/api v0.16.0
88
k8s.io/apimachinery v0.21.3
99
sigs.k8s.io/controller-runtime v0.9.5
1010
)

api/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQL
9393
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
9494
github.com/fluxcd/pkg/apis/meta v0.10.0 h1:N7wVGHC1cyPdT87hrDC7UwCwRwnZdQM46PBSLjG2rlE=
9595
github.com/fluxcd/pkg/apis/meta v0.10.0/go.mod h1:CW9X9ijMTpNe7BwnokiUOrLl/h13miwVr/3abEQLbKE=
96-
github.com/fluxcd/source-controller/api v0.15.4 h1:9aRcH/WKJWt7Bp954K/wzLRuiRiHuD2osvYp74GoP64=
97-
github.com/fluxcd/source-controller/api v0.15.4/go.mod h1:guUCCapjzE2kocwFreQTM/IGvtAglIJc4L97mokairo=
96+
github.com/fluxcd/source-controller/api v0.16.0 h1:xFz+K7lLg/82uOQp+a0g04GsgoWNfyzwXAoVQy4T/oI=
97+
github.com/fluxcd/source-controller/api v0.16.0/go.mod h1:guUCCapjzE2kocwFreQTM/IGvtAglIJc4L97mokairo=
9898
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
9999
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
100100
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=

go.mod

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,8 @@ require (
1515
github.com/fluxcd/pkg/runtime v0.12.1
1616
github.com/fluxcd/pkg/ssh v0.1.0
1717
// If you bump this, change SOURCE_VER in the Makefile to match
18-
// TODO(hidde): set to tagged version of release.
19-
github.com/fluxcd/source-controller v0.15.5-0.20210930103634-ac1b95090415
20-
github.com/fluxcd/source-controller/api v0.15.4
18+
github.com/fluxcd/source-controller v0.16.0
19+
github.com/fluxcd/source-controller/api v0.16.0
2120
github.com/go-git/go-billy/v5 v5.3.1
2221
github.com/go-git/go-git/v5 v5.4.2
2322
github.com/go-logr/logr v0.4.0

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,10 @@ github.com/fluxcd/pkg/testserver v0.1.0/go.mod h1:fvt8BHhXw6c1+CLw1QFZxcQprlcXzs
358358
github.com/fluxcd/pkg/untar v0.1.0/go.mod h1:aGswNyzB1mlz/T/kpOS58mITBMxMKc9tlJBH037A2HY=
359359
github.com/fluxcd/pkg/version v0.1.0 h1:v+SmCanmCB5Tj2Cx9TXlj+kNRfPGbAvirkeqsp7ZEAQ=
360360
github.com/fluxcd/pkg/version v0.1.0/go.mod h1:V7Z/w8dxLQzv0FHqa5ox5TeyOd2zOd49EeuWFgnwyj4=
361-
github.com/fluxcd/source-controller v0.15.5-0.20210930103634-ac1b95090415 h1:XrTvVFkWdFQX6GbosGNVtfreqAVqjBtFVk2cqy0uBYk=
362-
github.com/fluxcd/source-controller v0.15.5-0.20210930103634-ac1b95090415/go.mod h1:XPuJVVTs4eYwDWbZjaZY6JLiaNMPti+sl6LpCewEcvc=
363-
github.com/fluxcd/source-controller/api v0.15.4 h1:9aRcH/WKJWt7Bp954K/wzLRuiRiHuD2osvYp74GoP64=
364-
github.com/fluxcd/source-controller/api v0.15.4/go.mod h1:guUCCapjzE2kocwFreQTM/IGvtAglIJc4L97mokairo=
361+
github.com/fluxcd/source-controller v0.16.0 h1:GUzyh6+NmA8Tx9fhhz/shYo585ICM9lCG0gAWkr/kGA=
362+
github.com/fluxcd/source-controller v0.16.0/go.mod h1:WsrFDJcVFawfMvTuKaz52yU9NA+lxGy+6qRFO3tdbps=
363+
github.com/fluxcd/source-controller/api v0.16.0 h1:xFz+K7lLg/82uOQp+a0g04GsgoWNfyzwXAoVQy4T/oI=
364+
github.com/fluxcd/source-controller/api v0.16.0/go.mod h1:guUCCapjzE2kocwFreQTM/IGvtAglIJc4L97mokairo=
365365
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
366366
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
367367
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=

0 commit comments

Comments
 (0)