Commit 45cf9f57 authored by Steve Azzopardi's avatar Steve Azzopardi

Split `make docker` for GitLab Runner Helper

GitLab Runner helper is built using `make docker` which builds the
binary, creates a Docker container and extract the files system of that
container for publishing at a later stage.

Because of  #3755 we
have to split this command up so we generate the binaries and the docker
archive separately since Windows containers cannot be built on Linux systems
or vice versa.

We are keeping the binary generation in one command to have both Windows
and Linux binaries consistent, and built them on a Linux platform where
`make` is installed. The make command already sets up the $GOPATH,
dependencies and environment for building the binaries so there is no
point of duplicating that. Then diverge when building the docker
containers, since they have to be done on different platforms.  Windows
does have GNUMake http://gnuwin32.sourceforge.net/packages/make.htm but
it's fairly outdated and doesn't seem to work when installing it on
Windows server 2019.

Drop support for `USE_PRECOMPILED_IMAGES` since it's just extra
complexity that is not needed, and it doesn't seem to be used anywhere.
If the user runs `make helper-docker` and the binaries are already
present they are not rebuild.
parent 40a22cf9
......@@ -70,7 +70,7 @@ helper images:
<<: *docker
stage: prebuild
script:
- make docker
- make helper-docker
artifacts:
paths:
- out/helper-images/
......
......@@ -65,9 +65,9 @@ MOCKERY_FLAGS = -note="This comment works around https://github.com/vektra/mocke
.PHONY: clean version mocks
all: deps docker build
all: deps helper-docker build
include Makefile.docker.mk
include Makefile.runner_helper.mk
help:
# Commands:
......@@ -76,7 +76,7 @@ help:
#
# Development commands:
# make install - install the version suitable for your OS as gitlab-runner
# make docker - build docker dependencies
# make helper-docker - build docker dependencies
#
# Testing commands:
# make test - run project tests
......@@ -117,13 +117,12 @@ build_simple: $(GOPATH_SETUP)
-o "out/binaries/$(NAME)" \
$(PKG)
build_current: docker build_simple
build_current: helper-docker build_simple
check_race_conditions:
@./scripts/check_race_conditions $(OUR_PACKAGES)
test: $(PKG_BUILD_DIR) docker
# Running tests...
test: $(PKG_BUILD_DIR) helper-docker
go test $(OUR_PACKAGES) $(TESTFLAGS)
parallel_test_prepare: $(GOPATH_SETUP)
......
ifeq (, $(shell docker info 2>/dev/null))
USE_PRECOMPILED_IMAGES ?= 1
endif
docker: out/helper-images/prebuilt-x86_64.tar.xz out/helper-images/prebuilt-arm.tar.xz
ifeq (, $(USE_PRECOMPILED_IMAGES))
HELPER_GO_FILES ?= $(shell find common network vendor -name '*.go')
GO_x86_64_ARCH = amd64
GO_arm_ARCH = arm
dockerfiles/build/binaries/gitlab-runner-helper.%: $(HELPER_GO_FILES) $(GOX)
gox -osarch=linux/$(GO_$*_ARCH) -ldflags "$(GO_LDFLAGS)" -output=$@ $(PKG)/apps/gitlab-runner-helper
out/helper-images/prebuilt-%.tar: dockerfiles/build/binaries/gitlab-runner-helper.%
@mkdir -p $$(dirname $@_)
docker build -t gitlab/gitlab-runner-helper:$*-$(REVISION) -f dockerfiles/build/Dockerfile.$* dockerfiles/build
-docker rm -f gitlab-runner-prebuilt-$*-$(REVISION)
docker create --name=gitlab-runner-prebuilt-$*-$(REVISION) gitlab/gitlab-runner-helper:$*-$(REVISION) /bin/sh
docker export -o $@ gitlab-runner-prebuilt-$*-$(REVISION)
docker rm -f gitlab-runner-prebuilt-$*-$(REVISION)
out/helper-images/prebuilt-%.tar.xz: out/helper-images/prebuilt-%.tar
xz -f -9 $<
else
out/helper-images/prebuilt-%.tar.xz:
$(warning WARNING: downloading prebuilt docker images that will be loaded by gitlab-runner: $@)
@mkdir -p $$(dirname $@_)
curl -o $@ https://gitlab-runner-downloads.s3.amazonaws.com/master/docker/$(shell basename $@)
endif
# -------------------------------------------------------------------------------
# The following make file does two things:
# 1. Create binaries for the gitlab-runner-helper app which can be found in
# `./apps/gitlab-runner-helper` for all the platforms we want to support.
# 2. Create Linux containers and extract their file system to be used later to
# build/publish.
#
# If you want to add a new arch or OS you would need to add a new
# file path to the $BINARIES variables and a new GO_ARCH_{{arch}}-{{OS}}
# variable. Note that Linux is implied by default.
# ---------------------------------------------------------------------------
# Tar files that we want to generate from the Docker file system, this is
# genarlly used for linux based Dockerfiles.
BASE_TAR_PATH := out/helper-images/prebuilt
TAR += ${BASE_TAR_PATH}-x86_64.tar.xz
TAR += ${BASE_TAR_PATH}-arm.tar.xz
# Binaries that we support for the helper image. We are using the following
# pattern match:
# dockerfiles/build/binaries/gitlab-runner-helper.{{arch}}-{{os}}, these should
# match up with GO_ARCH_* variables names. Note that Linux is implied by
# default.
BASE_BINARY_PATH := dockerfiles/build/binaries/gitlab-runner-helper
BINARIES := ${BASE_BINARY_PATH}.x86_64-windows
BINARIES += ${BASE_BINARY_PATH}.x86_64
BINARIES += ${BASE_BINARY_PATH}.arm
# Define variables with the archiecture for each matching binary. We are using
# the following pattern match GO_ARCH_{{arch}}-{{os}}, these should match up
# with BINARIES variables. The value of the varible is the dist name from `go tool dist list`
GO_ARCH_x86_64 = linux/amd64
GO_ARCH_arm = linux/arm
GO_ARCH_x86_64-windows = windows/amd64
# Go files that are used to create the helper binary.
HELPER_GO_FILES ?= $(shell find common network vendor -name '*.go')
.PHONY: helper-build helper-docker
# PHONY command to help build the binaries.
helper-build: $(BINARIES)
dockerfiles/build/binaries/gitlab-runner-helper.%: $(HELPER_GO_FILES) $(GOX)
gox -osarch=$(GO_ARCH_$*) -ldflags "$(GO_LDFLAGS)" -output=$@ $(PKG)/apps/gitlab-runner-helper
# PHONY command to help build the tar files for linux.
helper-docker: $(TAR)
out/helper-images/prebuilt-%.tar.xz: out/helper-images/prebuilt-%.tar
xz -f -9 $<
out/helper-images/prebuilt-%.tar: dockerfiles/build/binaries/gitlab-runner-helper.%
@mkdir -p $$(dirname $@_)
docker build -t gitlab/gitlab-runner-helper:$*-$(REVISION) -f dockerfiles/build/Dockerfile.$* dockerfiles/build
-docker rm -f gitlab-runner-prebuilt-$*-$(REVISION)
docker create --name=gitlab-runner-prebuilt-$*-$(REVISION) gitlab/gitlab-runner-helper:$*-$(REVISION) /bin/sh
docker export -o $@ gitlab-runner-prebuilt-$*-$(REVISION)
docker rm -f gitlab-runner-prebuilt-$*-$(REVISION)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment