From 2c08fab7079c0baef42c8fa832473e4fb367377d Mon Sep 17 00:00:00 2001 From: Travis Turner Date: Tue, 28 Feb 2023 23:09:55 -0600 Subject: [PATCH] Build fbsql with cgo in docker for CI --- .gitlab/.gitlab-ci.yml | 46 ++++++++++++++++++++++++++++----- Dockerfile-fbsql | 48 ++++++++++++++++++++++++++++++++++ Makefile | 58 +++++++++++++++++++++++++++++++++++++----- idk/ingest.go | 2 +- 4 files changed, 141 insertions(+), 13 deletions(-) create mode 100644 Dockerfile-fbsql diff --git a/.gitlab/.gitlab-ci.yml b/.gitlab/.gitlab-ci.yml index 038373591..997156a54 100644 --- a/.gitlab/.gitlab-ci.yml +++ b/.gitlab/.gitlab-ci.yml @@ -173,16 +173,48 @@ build featurebase: for goos in "darwin" "linux"; do for goarch in "amd64" "arm64"; do GOOS="${goos}" GOARCH="${goarch}" make build FLAGS="-o featurebase_${goos}_${goarch}" - GOOS="${goos}" GOARCH="${goarch}" make build-fbsql FLAGS="-o fbsql_${goos}_${goarch}" done done artifacts: paths: - featurebase_* - - fbsql_* needs: - job: build lattice +build fbsql amd64: + stage: test + variables: + BUILD_NAME: build_${CI_COMMIT_SHA}_${CI_CONCURRENT_ID} + tags: + - shell + rules: + - if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"' + script: + - export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) + - date + - GOOS="linux" GOARCH="amd64" make docker-build-fbsql BUILD_CGO=1 + - GOOS="darwin" GOARCH="amd64" make docker-build-fbsql + artifacts: + paths: + - ./build/fbsql_* + +build fbsql arm64: + stage: test + variables: + BUILD_NAME: build_${CI_COMMIT_SHA}_${CI_CONCURRENT_ID} + tags: + - shell-arm64 + rules: + - if: '$CI_PIPELINE_SOURCE == "push" || $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "web"' + script: + - export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct) + - date + - GOOS="linux" GOARCH="arm64" make docker-build-fbsql BUILD_CGO=1 + - GOOS="darwin" GOARCH="arm64" make docker-build-fbsql + artifacts: + paths: + - ./build/fbsql_* + build amd container fb: stage: test tags: @@ -649,14 +681,16 @@ s3 dump: - | for goos in "darwin" "linux"; do for goarch in "amd64" "arm64"; do - for binary in "featurebase" "fbsql"; do - aws s3 cp ${binary}_${goos}_${goarch} s3://molecula-artifact-storage/featurebase/${CI_COMMIT_BRANCH}/${CI_COMMIT_SHORT_SHA}/${binary}_${goos}_${goarch} - aws s3 cp ${binary}_${goos}_${goarch} s3://molecula-artifact-storage/featurebase/${CI_COMMIT_BRANCH}/_latest/${binary}_${goos}_${goarch} - done + aws s3 cp featurebase_${goos}_${goarch} s3://molecula-artifact-storage/featurebase/${CI_COMMIT_BRANCH}/${CI_COMMIT_SHORT_SHA}/featurebase_${goos}_${goarch} + aws s3 cp featurebase_${goos}_${goarch} s3://molecula-artifact-storage/featurebase/${CI_COMMIT_BRANCH}/_latest/featurebase_${goos}_${goarch} + aws s3 cp ./build/fbsql_${goos}_${goarch} s3://molecula-artifact-storage/featurebase/${CI_COMMIT_BRANCH}/${CI_COMMIT_SHORT_SHA}/fbsql_${goos}_${goarch} + aws s3 cp ./build/fbsql_${goos}_${goarch} s3://molecula-artifact-storage/featurebase/${CI_COMMIT_BRANCH}/_latest/fbsql_${goos}_${goarch} done done needs: - job: build featurebase + - job: build fbsql amd64 + - job: build fbsql arm64 s3 dump tag: stage: post build diff --git a/Dockerfile-fbsql b/Dockerfile-fbsql new file mode 100644 index 000000000..305bc84dc --- /dev/null +++ b/Dockerfile-fbsql @@ -0,0 +1,48 @@ +ARG GO_VERSION=1.19 + +FROM golang:1.19-buster as builder + +WORKDIR / +RUN apt-get update -y -qq && apt-get install -y -qq \ + build-essential \ + git \ + musl-tools \ + netcat \ + unixodbc \ + unixodbc-dev \ + && rm -rf /var/lib/apt/lists/* +RUN ["git", "clone", "https://github.com/edenhill/librdkafka.git"] +WORKDIR /librdkafka +RUN ./configure --prefix /usr && \ + make && \ + make install + +WORKDIR /featurebase + +COPY . . + +ARG MAKE_FLAGS +ARG GO_BUILD_FLAGS +ARG SOURCE_DATE_EPOCH + +WORKDIR /featurebase/ + +ENV SOURCE_DATE_EPOCH=${SOURCE_DATE_EPOCH} +RUN make build-fbsql GO_BUILD_FLAGS="-mod=vendor ${GO_BUILD_FLAGS}" ${MAKE_FLAGS} + +FROM ubuntu:20.04 as runner + +RUN apt-get update -y -qq && apt-get install -y -qq \ + ca-certificates \ + musl-tools \ + netcat \ + unixodbc-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /featurebase/fbsql /usr/local/bin/ + +# Verify that the linker can find everything. +FROM runner as linkcheck +RUN if [ -e /usr/local/bin/fbsql ] ; then ldd /usr/local/bin/fbsql; fi + +FROM runner diff --git a/Makefile b/Makefile index 3a6e6fc6f..c74219aef 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build clean build-lattice cover cover-viz default docker docker-build docker-tag-push generate generate-protoc generate-pql generate-statik generate-stringer install install-protoc-gen-gofast install-protoc install-statik install-peg test docker-login +.PHONY: build clean build-lattice cover cover-viz default docker docker-build docker-build-fbsql docker-tag-push generate generate-protoc generate-pql generate-statik generate-stringer install install-protoc-gen-gofast install-protoc install-statik install-peg test docker-login SHELL := /bin/bash VERSION := $(shell git describe --tags 2> /dev/null || echo unknown) @@ -19,6 +19,7 @@ SHARD_WIDTH = 20 COMMIT := $(shell git describe --exact-match >/dev/null 2>&1 || git rev-parse --short HEAD) LDFLAGS="-X github.com/featurebasedb/featurebase/v3.Version=$(VERSION) -X github.com/featurebasedb/featurebase/v3.BuildTime=$(BUILD_TIME) -X github.com/featurebasedb/featurebase/v3.Variant=$(VARIANT) -X github.com/featurebasedb/featurebase/v3.Commit=$(COMMIT) -X github.com/featurebasedb/featurebase/v3.TrialDeadline=$(TRIAL_DEADLINE)" GO_VERSION=1.19 +GO_BUILD_FLAGS= DOCKER_BUILD= # set to 1 to use `docker-build` instead of `build` when creating a release BUILD_TAGS += TEST_TAGS = roaringparanoia @@ -120,11 +121,6 @@ cover-viz: cover build: $(GO) build -tags='$(BUILD_TAGS)' -ldflags $(LDFLAGS) $(FLAGS) ./cmd/featurebase -# Build fbsql -build-fbsql: - CGO_ENABLED=1 $(GO) build -tags='$(BUILD_TAGS)' -ldflags $(LDFLAGS) $(FLAGS) ./cmd/fbsql - - package: GOOS=$(GOOS) GOARCH=$(GOARCH) $(MAKE) build GOOS=$(GOOS) GOARCH=$(GOARCH) $(MAKE) build-fbsql @@ -345,3 +341,53 @@ test-external-lookup: bnf: ebnf2railroad --no-overview-diagram --no-optimizations ./sql3/sql3.ebnf + +################################# +# fbsql builds in docker +################################# + +# This allows multiple concurrent builds to happen in CI without +# creating container name conflicts and such. (different BUILD_NAMEs +# are passed in from gitlab-ci.yml) +BUILD_NAME ?= fbsql-build + +LDFLAGS_STATIC="-linkmode external -extldflags \"-static\" -X 'github.com/featurebasedb/featurebase/v3/fbsql.Version=$(VERSION)' -X 'github.com/featurebasedb/featurebase/v3/fbsql.BuildTime=$(BUILD_TIME)' " + +UNAME_P := $(shell uname -p) +BUILD_CGO ?= 0 + +# Build fbsql +build-fbsql: + @echo GOOS=$(GOOS) GOARCH=$(GOARCH) uname -p=$(UNAME_P) build_cgo=$(BUILD_CGO) +ifeq ($(BUILD_CGO), 0) + make build-fbsql-non-cgo +endif +ifeq ($(BUILD_CGO), 1) + make build-fbsql-cgo +endif + +build-fbsql-non-cgo: + CGO_ENABLED=0 $(GO) build -ldflags $(LDFLAGS) $(GO_BUILD_FLAGS) -o fbsql ./cmd/fbsql + +build-fbsql-cgo: +ifeq ($(GOARCH), arm64) + CGO_ENABLED=1 $(GO) build -tags dynamic $(GO_BUILD_FLAGS) -o fbsql ./cmd/fbsql +endif +ifeq ($(GOARCH), amd64) + CC=/usr/bin/musl-gcc CGO_ENABLED=1 $(GO) build -tags "musl static" -ldflags $(LDFLAGS_STATIC) $(GO_BUILD_FLAGS) -o fbsql ./cmd/fbsql +endif + +docker-build-fbsql: vendor + DOCKER_BUILDKIT=0 docker build \ + --file Dockerfile-fbsql \ + --build-arg GO_VERSION=$(GO_VERSION) \ + --build-arg MAKE_FLAGS="GOOS=$(GOOS) GOARCH=$(GOARCH) BUILD_CGO=$(BUILD_CGO)" \ + --build-arg GO_BUILD_FLAGS=$(GO_BUILD_FLAGS) \ + --build-arg SOURCE_DATE_EPOCH=$(SOURCE_DATE_EPOCH) \ + --target builder \ + --tag fbsql:$(BUILD_NAME) . + mkdir -p build + docker create --name $(BUILD_NAME) fbsql:$(BUILD_NAME) + docker cp $(BUILD_NAME):/featurebase/fbsql ./build/fbsql_$(GOOS)_$(GOARCH) + docker rm $(BUILD_NAME) + diff --git a/idk/ingest.go b/idk/ingest.go index 208e806b0..67e495de6 100644 --- a/idk/ingest.go +++ b/idk/ingest.go @@ -124,7 +124,7 @@ type Main struct { NewImporterFn func() pilosacore.Importer `flag:"-"` - Batcher pilosabatch.Batcher + Batcher pilosabatch.Batcher `flag:"-"` // basic, when true, will only set up the things required to run a basic // ingester. For example, it does not set up the pilosa client.