Skip to content

Commit

Permalink
Use static libraries from built image
Browse files Browse the repository at this point in the history
Signed-off-by: Paulo Gomes <paulo.gomes@weave.works>
  • Loading branch information
Paulo Gomes committed Jan 26, 2022
1 parent 93c636e commit 3a14cb8
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 87 deletions.
21 changes: 1 addition & 20 deletions .github/actions/run-tests/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,27 +1,8 @@
ARG BASE_VARIANT=bullseye
ARG GO_VERSION=1.17.5
ARG XX_VERSION=1.1.0

ARG LIBGIT2_IMG=ghcr.io/fluxcd/golang-with-libgit2
ARG LIBGIT2_TAG=libgit2-1.1.1-3

FROM tonistiigi/xx:${XX_VERSION} AS xx
FROM ${LIBGIT2_IMG}:${LIBGIT2_TAG} as libgit2
ARG GO_VERSION=1.17

FROM golang:${GO_VERSION}-${BASE_VARIANT} as gostable

# Copy the build utiltiies
COPY --from=xx / /
COPY --from=libgit2 /Makefile /libgit2/

# Install the libgit2 build dependencies
RUN make -C /libgit2 cmake

RUN make -C /libgit2 dependencies

# Compile and install libgit2
RUN FLAGS=$(xx-clang --print-cmake-defines) make -C /libgit2 libgit2

# Use the GitHub Actions uid:gid combination for proper fs permissions
RUN groupadd -g 116 test && \
useradd -u 1001 --gid test --shell /bin/sh --create-home test
Expand Down
82 changes: 15 additions & 67 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,31 +18,20 @@ CRD_OPTIONS ?= crd:crdVersions=v1
# Repository root based on Git metadata
REPOSITORY_ROOT := $(shell git rev-parse --show-toplevel)

# Libgit2 version
LIBGIT2_VERSION ?= 1.1.1

# Other dependency versions
ENVTEST_BIN_VERSION ?= 1.19.2

# libgit2 related magical paths
# These are used to determine if the target libgit2 version is already available on
# the system, or where they should be installed to
SYSTEM_LIBGIT2_VERSION := $(shell pkg-config --modversion libgit2 2>/dev/null)
KUBEBUILDER_ASSETS?="$(shell $(ENVTEST) --arch=$(ENVTEST_ARCH) use -i $(ENVTEST_KUBERNETES_VERSION) --bin-dir=$(ENVTEST_ASSETS_DIR) -p path)"

LIBGIT2_PATH := $(REPOSITORY_ROOT)/hack/libgit2
LIBGIT2_LIB_PATH := $(LIBGIT2_PATH)/lib
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.so.$(LIBGIT2_VERSION)

ifneq ($(LIBGIT2_VERSION),$(SYSTEM_LIBGIT2_VERSION))
LIBGIT2_FORCE ?= 1
endif
LIBGIT2_LIB64_PATH := $(LIBGIT2_PATH)/lib64
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.a

ifeq ($(shell uname -s),Darwin)
LIBGIT2 := $(LIBGIT2_LIB_PATH)/libgit2.$(LIBGIT2_VERSION).dylib
HAS_BREW := $(shell brew --version 2>/dev/null)
ifdef HAS_BREW
HAS_OPENSSL := $(shell brew --prefix openssl@1.1)
endif
endif
export LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH):$(LIBGIT2_LIB64_PATH)
export PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH)
export CGO_LDFLAGS=-I$(LIBGIT2_LIB_PATH)/include -L$(LIBGIT2_LIB_PATH) -L$(LIBGIT2_LIB64_PATH) -lssh2 -lz -lgit2 -lrt -lssl -lcrypto -lz -ldl -pthread
KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS)


# API (doc) generation utilities
Expand All @@ -56,59 +45,28 @@ else
GOBIN=$(shell go env GOBIN)
endif

ifeq ($(strip ${PKG_CONFIG_PATH}),)
MAKE_PKG_CONFIG_PATH = $(LIBGIT2_LIB_PATH)/pkgconfig
else
MAKE_PKG_CONFIG_PATH = ${PKG_CONFIG_PATH}:$(LIBGIT2_LIB_PATH)/pkgconfig
endif

ifdef HAS_OPENSSL
MAKE_PKG_CONFIG_PATH := $(MAKE_PKG_CONFIG_PATH):$(HAS_OPENSSL)/lib/pkgconfig
endif

# Architecture to use envtest with
ENVTEST_ARCH ?= amd64

all: build

build: $(LIBGIT2) ## Build manager binary
ifeq ($(shell uname -s),Darwin)
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
go build -o bin/manager main.go
else
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
go build -o bin/manager main.go
endif

KUBEBUILDER_ASSETS?="$(shell $(ENVTEST) --arch=$(ENVTEST_ARCH) use -i $(ENVTEST_KUBERNETES_VERSION) --bin-dir=$(ENVTEST_ASSETS_DIR) -p path)"

test: $(LIBGIT2) install-envtest test-api ## Run tests
ifeq ($(shell uname -s),Darwin)
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS) \
go test ./... -coverprofile cover.out
else
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
KUBEBUILDER_ASSETS=$(KUBEBUILDER_ASSETS) \
go test ./... -coverprofile cover.out
endif
go test ./... \
-ldflags "-s -w" \
-tags 'netgo,osusergo,static_build' \
-coverprofile cover.out

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

run: $(LIBGIT2) generate fmt vet manifests ## Run against the configured Kubernetes cluster in ~/.kube/config
ifeq ($(shell uname -s),Darwin)
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
go run ./main.go
else
LD_LIBRARY_PATH=$(LIBGIT2_LIB_PATH) \
go run ./main.go
endif


install: manifests ## Install CRDs into a cluster
kustomize build config/crd | kubectl apply -f -
Expand Down Expand Up @@ -142,16 +100,8 @@ fmt: ## Run go fmt against code
cd api; go fmt ./...

vet: $(LIBGIT2) ## Run go vet against code
ifeq ($(shell uname -s),Darwin)
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
CGO_LDFLAGS="-Wl,-rpath,$(LIBGIT2_LIB_PATH)" \
go vet ./...
cd api; go vet ./...
else
PKG_CONFIG_PATH=$(MAKE_PKG_CONFIG_PATH) \
go vet ./...
cd api; go vet ./...
endif

generate: controller-gen ## Generate API code
cd api; $(CONTROLLER_GEN) object:headerFile="../hack/boilerplate.go.txt" paths="./..."
Expand Down Expand Up @@ -195,13 +145,11 @@ libgit2: $(LIBGIT2) ## Detect or download libgit2 library
$(LIBGIT2):
ifeq (1, $(LIBGIT2_FORCE))
@{ \
set -e; \
mkdir -p $(LIBGIT2_PATH); \
curl -sL https://raw.githubusercontent.com/fluxcd/golang-with-libgit2/$(LIBGIT2_TAG)/hack/Makefile -o $(LIBGIT2_PATH)/Makefile; \
INSTALL_PREFIX=$(LIBGIT2_PATH) make -C $(LIBGIT2_PATH) libgit2; \
IMG_TAG=$(LIBGIT2_IMG):$(LIBGIT2_TAG) ./hack/extract-libraries.sh; \
}
endif


.PHONY: help
help: ## Display this help menu
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
Expand Down
57 changes: 57 additions & 0 deletions hack/extract-libraries.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/usr/bin/env bash

set -euxo pipefail

IMG_TAG="${IMG_TAG:-.}"

function extract(){
PLATFORM=$1
DIR=$2

id=$(docker create --platform="${PLATFORM}" "${IMG_TAG}")
docker cp "${id}":/usr/local - > output.tar.gz
docker rm -v "${id}"

tar -xf output.tar.gz "local/${DIR}" --strip-component=1
rm output.tar.gz
}

function setup() {
PLATFORM=$1
DIR=$2

extract "${PLATFORM}" "${DIR}"

NEW_DIR=$(realpath "./hack/libgit2")
INSTALLED_DIR="/usr/local/${DIR}"

mv "${DIR}" "libgit2"
mv "libgit2" "./hack/"

# Update the prefix paths included in the .pc files.
# This will make it easier to update to the location in which they will be used.
find "${NEW_DIR}" -type f -name "*.pc" | xargs -I {} sed -i "s;${INSTALLED_DIR};${NEW_DIR};g" {}
}

function setup_current() {
if [ -d "./hack/libgit2" ]; then
echo "Skipping libgit2 setup as it already exists"
exit 0
fi

DIR="x86_64-alpine-linux-musl"
PLATFORM="linux/amd64"

if [ "$(uname -m)" = "armv7l" ]; then
DIR="armv7-alpine-linux-musleabihf"
PLATFORM="linux/arm/v7"
fi
if [ "$(uname -m)" = "aarch64" ]; then
DIR="aarch64-alpine-linux-musl"
PLATFORM="linux/amd64"
fi

setup "${PLATFORM}" "${DIR}"
}

setup_current

0 comments on commit 3a14cb8

Please sign in to comment.