Skip to content

Commit 990b4a3

Browse files
author
Paulo Gomes
committed
Use static libraries from built image
Signed-off-by: Paulo Gomes <[email protected]>
1 parent ddc6cfe commit 990b4a3

File tree

7 files changed

+181
-139
lines changed

7 files changed

+181
-139
lines changed

.github/actions/run-tests/Dockerfile

Lines changed: 0 additions & 35 deletions
This file was deleted.

.github/actions/run-tests/action.yml

Lines changed: 0 additions & 12 deletions
This file was deleted.

.github/workflows/e2e.yaml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ jobs:
2727
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
2828
restore-keys: |
2929
${{ runner.os }}-go-
30+
- name: Run tests
31+
run: make test
3032
- name: Setup Kubernetes
3133
uses: engineerd/[email protected]
3234
with:
@@ -36,11 +38,6 @@ jobs:
3638
uses: fluxcd/pkg/actions/kustomize@main
3739
- name: Setup Helm
3840
uses: fluxcd/pkg/actions/helm@main
39-
- name: Run tests
40-
uses: ./.github/actions/run-tests
41-
env:
42-
GOROOT:
43-
GOPATH: /github/home/go
4441
- name: Verify
4542
run: make verify
4643
- name: Run E2E tests
@@ -59,6 +56,8 @@ jobs:
5956
uses: actions/setup-go@v2
6057
with:
6158
go-version: 1.17.x
59+
- name: Run tests
60+
run: make test
6261
- name: Prepare
6362
id: prep
6463
run: |

Dockerfile

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,27 @@ ARG BASE_VARIANT=alpine
22
ARG GO_VERSION=1.17
33
ARG XX_VERSION=1.1.0
44

5-
ARG LIBGIT2_IMG=ghcr.io/fluxcd/golang-with-libgit2
6-
ARG LIBGIT2_TAG=libgit2-1.1.1-4
5+
ARG LIBGIT2_IMG
6+
ARG LIBGIT2_TAG
77

8-
FROM --platform=linux/amd64 ${LIBGIT2_IMG}:${LIBGIT2_TAG} as build-amd64
9-
FROM --platform=linux/arm64 ${LIBGIT2_IMG}:${LIBGIT2_TAG} as build-arm64
10-
FROM --platform=linux/arm/v7 ${LIBGIT2_IMG}:${LIBGIT2_TAG} as build-armv7
8+
FROM ${LIBGIT2_IMG}:${LIBGIT2_TAG} AS libgit2-libs
119

12-
FROM --platform=$BUILDPLATFORM build-$TARGETARCH$TARGETVARIANT AS build
10+
FROM --platform=$BUILDPLATFORM tonistiigi/xx:${XX_VERSION} AS xx
11+
12+
FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-${BASE_VARIANT} as gostable
13+
14+
FROM gostable AS go-linux
15+
16+
# Build-base consists of build platform dependencies and xx.
17+
# These will be used at current arch to yield execute the cross compilations.
18+
FROM go-${TARGETOS} AS build-base
19+
20+
RUN apk add --no-cache clang lld pkgconfig
21+
22+
COPY --from=xx / /
23+
24+
# build-go-mod can still be cached at build platform architecture.
25+
FROM build-base as build-go-mod
1326

1427
# Configure workspace
1528
WORKDIR /workspace
@@ -24,26 +37,35 @@ COPY go.sum go.sum
2437
# Cache modules
2538
RUN go mod download
2639

27-
RUN apk add clang lld pkgconfig ca-certificates
40+
# Build stage install per target platform
41+
# dependency and effectively cross compile the application.
42+
FROM build-go-mod as build
2843

29-
# Build the binary
30-
ENV CGO_ENABLED=1
3144
ARG TARGETPLATFORM
3245

46+
COPY --from=libgit2-libs /usr/local/ /usr/local/
47+
48+
# Some dependencies have to installed
49+
# for the target platform: https://github.com/tonistiigi/xx#go--cgo
3350
RUN xx-apk add --no-cache \
3451
musl-dev gcc lld binutils-gold
3552

36-
# Performance related changes:
37-
# - Use read-only bind instead of copying go source files.
38-
# - Cache go packages.
39-
RUN --mount=target=. \
40-
--mount=type=cache,target=/root/.cache/go-build \
41-
--mount=type=cache,target=/go/pkg \
42-
export LIBRARY_PATH="/usr/local/$(xx-info triple)/lib:/usr/local/$(xx-info triple)/lib64:${LIBRARY_PATH}" && \
53+
RUN xx-apk add --no-cache musl-utils
54+
55+
WORKDIR /workspace
56+
57+
# Copy source code
58+
COPY main.go main.go
59+
COPY controllers/ controllers/
60+
COPY pkg/ pkg/
61+
COPY internal/ internal/
62+
63+
ENV CGO_ENABLED=1
64+
RUN export LIBRARY_PATH="/usr/local/$(xx-info triple):/usr/local/$(xx-info triple)/lib64" && \
4365
export PKG_CONFIG_PATH="/usr/local/$(xx-info triple)/lib/pkgconfig:/usr/local/$(xx-info triple)/lib64/pkgconfig" && \
44-
export FLAGS="$(pkg-config --static --libs --cflags libssh2 openssl libgit2)" && \
45-
CGO_LDFLAGS="${FLAGS} -static" \
46-
xx-go build \
66+
export FLAGS="$(pkg-config --static --libs --cflags libssh2 openssl libgit2)" && \
67+
export CGO_LDFLAGS="${FLAGS} -static" && \
68+
xx-go build \
4769
-ldflags "-s -w" \
4870
-tags 'netgo,osusergo,static_build' \
4971
-o /source-controller -trimpath main.go;

Makefile

Lines changed: 34 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,36 @@ CRD_OPTIONS ?= crd:crdVersions=v1
1818
# Repository root based on Git metadata
1919
REPOSITORY_ROOT := $(shell git rev-parse --show-toplevel)
2020

21-
# Libgit2 version
22-
LIBGIT2_VERSION ?= 1.1.1
23-
2421
# Other dependency versions
2522
ENVTEST_BIN_VERSION ?= 1.19.2
2623

27-
# libgit2 related magical paths
28-
# These are used to determine if the target libgit2 version is already available on
29-
# the system, or where they should be installed to
30-
SYSTEM_LIBGIT2_VERSION := $(shell pkg-config --modversion libgit2 2>/dev/null)
31-
LIBGIT2_PATH := $(REPOSITORY_ROOT)/hack/libgit2
24+
# Caches libgit2 versions per tag, "forcing" rebuild only when needed.
25+
LIBGIT2_PATH := $(REPOSITORY_ROOT)/build/libgit2/$(LIBGIT2_TAG)
3226
LIBGIT2_LIB_PATH := $(LIBGIT2_PATH)/lib
33-
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.so.$(LIBGIT2_VERSION)
27+
LIBGIT2_LIB64_PATH := $(LIBGIT2_PATH)/lib64
28+
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.a
29+
MUSL-CC =
3430

35-
ifneq ($(LIBGIT2_VERSION),$(SYSTEM_LIBGIT2_VERSION))
36-
LIBGIT2_FORCE ?= 1
37-
endif
31+
export CGO_ENABLED=1
32+
export PKG_CONFIG_PATH=$(LIBGIT2_LIB_PATH)/pkgconfig:$(LIBGIT2_LIB64_PATH)/pkgconfig
33+
export LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH):$(LIBGIT2_LIB64_PATH)
34+
export CGO_CFLAGS=-I$(LIBGIT2_PATH)/include -I$(LIBGIT2_PATH)/include/openssl
3835

3936
ifeq ($(shell uname -s),Darwin)
40-
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.$(LIBGIT2_VERSION).dylib
41-
HAS_BREW := $(shell brew --version 2>/dev/null)
42-
ifdef HAS_BREW
43-
HAS_OPENSSL := $(shell brew --prefix [email protected])
44-
endif
37+
export CGO_LDFLAGS=-L$(LIBGIT2_LIB_PATH) -lssh2 -lssl -lcrypto -lgit2
38+
else
39+
export CGO_LDFLAGS=$(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) pkg-config --libs --static --cflags libssh2 openssl libgit2)
4540
endif
4641

4742

43+
ifeq ($(shell uname -s),Linux)
44+
MUSL-PREFIX=$(REPOSITORY_ROOT)/build/musl/$(shell uname -m)-linux-musl-native/bin/$(shell uname -m)-linux-musl
45+
MUSL-CC=$(MUSL-PREFIX)-gcc
46+
export CC=$(MUSL-PREFIX)-gcc
47+
export CXX=$(MUSL-PREFIX)-g++
48+
export AR=$(MUSL-PREFIX)-ar
49+
endif
50+
4851
# API (doc) generation utilities
4952
CONTROLLER_GEN_VERSION ?= v0.7.0
5053
GEN_API_REF_DOCS_VERSION ?= v0.3.0
@@ -56,59 +59,32 @@ else
5659
GOBIN=$(shell go env GOBIN)
5760
endif
5861

59-
ifeq ($(strip ${PKG_CONFIG_PATH}),)
60-
MAKE_PKG_CONFIG_PATH = $(LIBGIT2_LIB_PATH)/pkgconfig
61-
else
62-
MAKE_PKG_CONFIG_PATH = ${PKG_CONFIG_PATH}:$(LIBGIT2_LIB_PATH)/pkgconfig
63-
endif
64-
65-
ifdef HAS_OPENSSL
66-
MAKE_PKG_CONFIG_PATH := $(MAKE_PKG_CONFIG_PATH):$(HAS_OPENSSL)/lib/pkgconfig
67-
endif
6862

6963
# Architecture to use envtest with
64+
ifeq ($(shell uname -m),x86_64)
7065
ENVTEST_ARCH ?= amd64
66+
else
67+
ENVTEST_ARCH ?= arm64
68+
endif
7169

7270
all: build
7371

7472
build: $(LIBGIT2) ## Build manager binary
75-
ifeq ($(shell uname -s),Darwin)
76-
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
77-
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
7873
go build -o bin/manager main.go
79-
else
80-
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
81-
go build -o bin/manager main.go
82-
endif
8374

8475
KUBEBUILDER_ASSETS?="$(shell $(ENVTEST) --arch=$(ENVTEST_ARCH) use -i $(ENVTEST_KUBERNETES_VERSION) --bin-dir=$(ENVTEST_ASSETS_DIR) -p path)"
8576
test: $(LIBGIT2) install-envtest test-api ## Run tests
86-
ifeq ($(shell uname -s),Darwin)
87-
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
88-
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
89-
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
9077
KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS) \
91-
go test ./... -coverprofile cover.out
92-
else
93-
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
94-
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
95-
KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS) \
96-
go test ./... -coverprofile cover.out
97-
endif
78+
go test ./... \
79+
-ldflags "-s -w" \
80+
-coverprofile cover.out \
81+
-tags 'netgo,osusergo,static_build'
9882

9983
test-api: ## Run api tests
10084
cd api; go test ./... -coverprofile cover.out
10185

10286
run: $(LIBGIT2) generate fmt vet manifests ## Run against the configured Kubernetes cluster in ~/.kube/config
103-
ifeq ($(shell uname -s),Darwin)
104-
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
105-
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
10687
go run ./main.go
107-
else
108-
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
109-
go run ./main.go
110-
endif
111-
11288

11389
install: manifests ## Install CRDs into a cluster
11490
kustomize build config/crd | kubectl apply -f -
@@ -142,16 +118,8 @@ fmt: ## Run go fmt against code
142118
cd api; go fmt ./...
143119

144120
vet: $(LIBGIT2) ## Run go vet against code
145-
ifeq ($(shell uname -s),Darwin)
146-
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
147-
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
148-
go vet ./...
149-
cd api; go vet ./...
150-
else
151-
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
152121
go vet ./...
153122
cd api; go vet ./...
154-
endif
155123

156124
generate: controller-gen ## Generate API code
157125
cd api; $(CONTROLLER_GEN) object:headerFile="../hack/boilerplate.go.txt" paths="./..."
@@ -192,14 +160,12 @@ install-envtest: setup-envtest ## Download envtest binaries locally.
192160

193161
libgit2: $(LIBGIT2) ## Detect or download libgit2 library
194162

195-
$(LIBGIT2):
196-
ifeq (1, $(LIBGIT2_FORCE))
197-
@{ \
198-
set -e; \
199-
mkdir -p $(LIBGIT2_PATH); \
200-
curl -sL https://raw.githubusercontent.com/fluxcd/golang-with-libgit2/$(LIBGIT2_TAG)/hack/Makefile -o $(LIBGIT2_PATH)/Makefile; \
201-
INSTALL_PREFIX=$(LIBGIT2_PATH) make -C $(LIBGIT2_PATH) libgit2; \
202-
}
163+
$(LIBGIT2): $(MUSL-CC)
164+
IMG=$(LIBGIT2_IMG) TAG=$(LIBGIT2_TAG) ./hack/install-libraries.sh
165+
166+
$(MUSL-CC):
167+
ifneq ($(shell uname -s),Darwin)
168+
./hack/download-musl.sh
203169
endif
204170

205171
.PHONY: help

hack/download-musl.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bash
2+
3+
set -eoux pipefail
4+
5+
MUSL_X86_64_FILENAME=x86_64-linux-musl-native.tgz
6+
MUSL_X86_64_SHA512=44d441ad9aa11a06feddf3daa4c9f53ad7d9ca37af1f5a61379aca07793703d179410cea723c1b7fca94c4de19a321228bdb3656bc5cbdb5e3bea8e2d6dac6c7
7+
MUSL_AARCH64_FILENAME=aarch64-linux-musl-native.tgz
8+
MUSL_AARCH64_SHA512=16d544e09845c9dbba50f29e0cb04dd661e17eb63c56acad6a67fd2a78aa7596b792477c7177d3cd56d408a27dc291a90507df882f2b099c0f25511ce08fd3b5
9+
10+
MUSL_FILENAME="${MUSL_X86_64_FILENAME}"
11+
MUSL_SHA512="${MUSL_X86_64_SHA512}"
12+
if [ "$(uname -m)" = "arm64" ] || [ "$(uname -m)" = "aarch64" ]; then
13+
MUSL_FILENAME="${MUSL_AARCH64_FILENAME}"
14+
MUSL_SHA512="${MUSL_AARCH64_SHA512}"
15+
fi
16+
17+
MUSL_AARCH64_URL="https://more.musl.cc/11.2.1/x86_64-linux-musl/${MUSL_FILENAME}"
18+
19+
ROOT_DIR="$(git rev-parse --show-toplevel)"
20+
MUSL_DIR="${ROOT_DIR}/build/musl"
21+
22+
if [ ! -f "${MUSL_DIR}/bin" ]; then
23+
TARGET_FILE="${MUSL_DIR}/${MUSL_FILENAME}"
24+
mkdir -p "${MUSL_DIR}"
25+
26+
echo "${MUSL_SHA512} ${TARGET_FILE}"
27+
curl -o "${TARGET_FILE}" -LO "${MUSL_AARCH64_URL}"
28+
if ! echo "${MUSL_SHA512} ${TARGET_FILE}" | sha512sum --check; then
29+
echo "Checksum failed for ${MUSL_FILENAME}."
30+
rm -rf "${MUSL_DIR}"
31+
exit 1
32+
fi
33+
34+
tar xzf "${TARGET_FILE}" -C "${MUSL_DIR}"
35+
rm "${TARGET_FILE}"
36+
fi

0 commit comments

Comments
 (0)