From ed933df7a71fde6a7bb5c8d7d6deccf81967559d Mon Sep 17 00:00:00 2001 From: Jacob Blain Christen Date: Fri, 22 Jan 2021 01:22:18 -0700 Subject: [PATCH] ci: updated build/ci support Added Makefile, updated Dockerfilem added .drone.yml Signed-off-by: Jacob Blain Christen --- .dockerignore | 2 + .drone.yml | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++ Dockerfile | 27 ++++++++++--- Makefile | 90 +++++++++++++++++++++++++++++++++++++++++++ README.md | 9 ++--- go.mod | 1 + go.sum | 2 + 7 files changed, 223 insertions(+), 12 deletions(-) create mode 100644 .drone.yml create mode 100644 Makefile diff --git a/.dockerignore b/.dockerignore index 8002ed4..b8c86c1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,3 @@ +/bin/ +/dist/ /k3c diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..70dd5d0 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,104 @@ +--- +kind: pipeline +type: docker +name: amd64 + +platform: + os: linux + arch: amd64 + +steps: + - name: build-binaries + image: rancher/dapper:v0.5.0 + environment: + GOLANG: golang:1.16beta1-alpine + commands: + - dapper -f Dockerfile --target dapper make GOOS=linux GOARCH=amd64 DRONE_TAG=${DRONE_TAG} dist + - dapper -f Dockerfile --target dapper make GOOS=linux GOARCH=arm64 DRONE_TAG=${DRONE_TAG} dist + - dapper -f Dockerfile --target dapper make GOOS=darwin GOARCH=amd64 DRONE_TAG=${DRONE_TAG} dist + - dapper -f Dockerfile --target dapper make GOOS=darwin GOARCH=arm64 DRONE_TAG=${DRONE_TAG} dist + - dapper -f Dockerfile --target dapper make GOOS=windows GOARCH=amd64 DRONE_TAG=${DRONE_TAG} dist + volumes: + - name: docker + path: /var/run/docker.sock + + - name: publish-binaries + image: plugins/github-release + settings: + api_key: + from_secret: github_token + checksum: + - sha256 + checksum_file: CHECKSUMsum.txt + checksum_flatten: true + files: + - dist/artifacts/* + prerelease: true + when: + event: + - tag + instance: + - drone-publish.rancher.io + ref: + - refs/head/master + - refs/tags/* + + - name: publish-images + image: rancher/dapper:v0.5.0 + commands: + - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD + - make DRONE_TAG=${DRONE_TAG} publish + environment: + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + when: + event: + - tag + instance: + - drone-publish.rancher.io + ref: + - refs/head/master + - refs/tags/* + +volumes: + - name: docker + host: + path: /var/run/docker.sock + +--- +kind: pipeline +type: docker +name: arm64 + +platform: + os: linux + arch: arm64 + +steps: + - name: publish-images + image: rancher/dapper:v0.5.0 + commands: + - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD + - make DRONE_TAG=${DRONE_TAG} publish + environment: + DOCKER_USERNAME: + from_secret: docker_username + DOCKER_PASSWORD: + from_secret: docker_password + when: + event: + - tag + instance: + - drone-publish.rancher.io + ref: + - refs/head/master + - refs/tags/* + +volumes: + - name: docker + host: + path: /var/run/docker.sock + +... \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 284d069..9fadaef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG GOLANG=golang:1.15-alpine -FROM ${GOLANG} AS build +FROM ${GOLANG} AS base RUN apk --no-cache add \ file \ gcc \ @@ -13,13 +13,28 @@ RUN apk --no-cache add \ RUN GO111MODULE=on go get github.com/gogo/protobuf/protoc-gen-gofast@v1.3.2 COPY . /go/src/k3c WORKDIR /go/src/k3c -ENV CGO_ENABLED=1 -ENV GO_BUILDTAGS="seccomp,selinux,static_build,netgo,osusergo" + +FROM base AS dapper +RUN apk --no-cache add docker-cli +ENV DAPPER_ENV GOLANG GODEBUG GOARCH GOOS ORG TAG DRONE_TAG DRONE_BUILD_EVENT +ARG DAPPER_HOST_ARCH +ENV GOARCH $DAPPER_HOST_ARCH +ENV DAPPER_SOURCE /go/src/k3c +ENV DAPPER_OUTPUT ./dist ./bin +ENV DAPPER_DOCKER_SOCKET true +ENV DAPPER_TARGET dapper +ENV DAPPER_RUN_ARGS "--privileged --network host -v k3c-pkg:/go/pkg -v k3c-cache:/root/.cache/go-build" +RUN go version + +FROM base AS build RUN go mod vendor RUN go generate -x -#RUN go build -ldflags '-w -linkmode=external -extldflags=-static' -tags="${GO_BUILDTAGS}" -o /usr/local/bin/k3c . -RUN go build -ldflags '-w -extldflags=-static' -tags="${GO_BUILDTAGS}" -o /usr/local/bin/k3c . -RUN file /usr/local/bin/k3c +ARG ORG=rancher +ARG PKG=github.com/rancher/k3c +ARG TAG=0.0.0-dev +RUN make bin/k3c ORG=${ORG} PKG=${PKG} TAG=${TAG} +RUN file bin/k3c +RUN install -s bin/k3c -m 0755 /usr/local/bin FROM scratch AS release COPY --from=build /usr/local/bin/k3c /bin/k3c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..24a59d6 --- /dev/null +++ b/Makefile @@ -0,0 +1,90 @@ +ifeq ($(GOARCH),) +GOARCH := $(shell go env GOARCH) +endif + +ifeq ($(GOOS),) +GOOS := $(shell go env GOOS) +endif + +ifneq ($(DRONE_TAG),) +TAG := $(DRONE_TAG) +endif + +DOCKER_BUILDKIT ?= 1 + +ORG ?= rancher +PKG ?= github.com/rancher/k3c +TAG ?= v0.0.0-dev + +ifeq ($(GO_BUILDTAGS),) +GO_BUILDTAGS := static_build,netgo,osusergo +#ifeq ($(GOOS),linux) +#GO_BUILDTAGS := $(GO_BUILDTAGS),seccomp,selinux +#endif +endif + +GO_LDFLAGS ?= -w -extldflags=-static +GO_LDFLAGS += -X $(PKG)/pkg/version.GitCommit=$(shell git rev-parse HEAD) +GO_LDFLAGS += -X $(PKG)/pkg/version.Version=$(TAG) +GO_LDFLAGS += -X $(PKG)/pkg/server.DefaultAgentImage=docker.io/$(ORG)/k3c + +GO ?= go +GOLANG ?= docker.io/library/golang:1.15-alpine +ifeq ($(GOOS),windows) +BINSUFFIX := .exe +endif +BIN ?= bin/k3c +BIN := $(BIN)$(BINSUFFIX) + +.PHONY: build package validate ci publish +build: $(BIN) +package: | dist image-build +validate: +publish: | image-build image-push image-manifest +ci: | build package validate +.PHONY: $(BIN) +$(BIN): + $(GO) build -ldflags "$(GO_LDFLAGS)" -tags "$(GO_BUILDTAGS)" -o $@ . + +.PHONY: dist +dist: + @mkdir -p dist/artifacts + @make GOOS=$(GOOS) GOARCH=$(GOARCH) BIN=dist/artifacts/k3c-$(GOOS)-$(GOARCH)$(BINSUFFIX) -C . + +.PHONY: clean +clean: + rm -rf bin dist + +.PHONY: image-build +image-build: + DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) docker build \ + --build-arg GOLANG=$(GOLANG) \ + --build-arg ORG=$(ORG) \ + --build-arg PKG=$(PKG) \ + --build-arg TAG=$(TAG) \ + --tag $(ORG)/k3c:$(TAG) \ + --tag $(ORG)/k3c:$(TAG)-$(GOARCH) \ + . + +.PHONY: image-push +image-push: + docker push $(ORG)/k3c:$(TAG)-$(GOARCH) + +.PHONY: image-manifest +image-manifest: + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create --amend \ + $(ORG)/k3c:$(TAG) \ + $(ORG)/k3c:$(TAG)-$(GOARCH) + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push \ + $(ORG)/k3c:$(TAG) + +./.dapper: + @echo Downloading dapper + @curl -sL https://releases.rancher.com/dapper/v0.5.0/dapper-$$(uname -s)-$$(uname -m) > .dapper.tmp + @@chmod +x .dapper.tmp + @./.dapper.tmp -v + @mv .dapper.tmp .dapper + +dapper-%: .dapper + @mkdir -p ./bin/ ./dist/ + env DOCKER_BUILDKIT=$(DOCKER_BUILDKIT) ./.dapper -f Dockerfile --target dapper make $* \ No newline at end of file diff --git a/README.md b/README.md index 0819df4..bab67e7 100644 --- a/README.md +++ b/README.md @@ -48,10 +48,7 @@ because the `containerd` client code assumes a certain level of co-locality with # git clone --branch=trunk https://github.com/rancher/k3c.git ~/Projects/rancher/k3c # cd ~/Projects/rancher/k3c go generate # only necessary when modifying the gRPC protobuf IDL, see Dockerfile for pre-reqs -go build -ldflags '-w -extldflags=-static' -tags="seccomp,selinux,static_build,netgo,osusergo" . -# only needed until @dweomer gets the automated builds publishing again -docker build --tag your/image:tag . -docker push your/image:tag +make ORG= build publish ``` ## Running @@ -60,12 +57,12 @@ Have a working `k3s` installation with a working `$HOME/.kube/config` or `$KUBEC ```bash # Installation on a single-node cluster -./k3c install --agent-image=docker.io/your/image:tag +./k3c install --agent-image=docker.io/${ORG}/k3c ``` ```bash # Installation on a multi-node cluster, targeting a Node named "my-builder-node" -./k3c install --agent-image=docker.io/your/image:tag --selector k3s.io/hostname=my-builder-node +./k3c install --agent-image=docker.io/${ORG}/k3c --selector k3s.io/hostname=my-builder-node ``` diff --git a/go.mod b/go.mod index bdf83fa..d1dd4bd 100644 --- a/go.mod +++ b/go.mod @@ -51,6 +51,7 @@ require ( github.com/rancher/wrangler-cli v0.0.0-20200815040857-81c48cf8ab43 github.com/sirupsen/logrus v1.7.0 github.com/spf13/cobra v1.1.1 + golang.org/dl v0.0.0-20210120004500-be2bfd84e4cf // indirect golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 google.golang.org/grpc v1.29.1 k8s.io/api v0.19.0 diff --git a/go.sum b/go.sum index ad857e3..3109ba3 100644 --- a/go.sum +++ b/go.sum @@ -1229,6 +1229,8 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= gocloud.dev v0.19.0/go.mod h1:SmKwiR8YwIMMJvQBKLsC3fHNyMwXLw3PMDO+VVteJMI= +golang.org/dl v0.0.0-20210120004500-be2bfd84e4cf h1:oJo1nNktpOIZ5JOFRqbGRNdm2xpqA2mGfv1AOnnDxPE= +golang.org/dl v0.0.0-20210120004500-be2bfd84e4cf/go.mod h1:IUMfjQLJQd4UTqG1Z90tenwKoCX93Gn3MAQJMOSBsDQ= golang.org/x/build v0.0.0-20190314133821-5284462c4bec/go.mod h1:atTaCNAy0f16Ah5aV1gMSwgiKVHwu/JncqDpuRr7lS4= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=