From 9c7691094a6ad7dfefee57b65ee5f61ac61393bf Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 21 Dec 2021 02:35:48 +0100 Subject: [PATCH] Add multiarch support agent (#622) - Makefile - Delete _with-docker - Fix version creation - Add default values for TARGETOS & TARGETARCH - Add multiarch Dockerfile for agent - pipeline config - target more platforms for agent docker builds (windows & darwin) close #181, close #187 --- .woodpecker/main.yml | 34 ++++++++++++++++++------ Makefile | 27 +++++++++---------- docker/Dockerfile.agent | 17 ------------ docker/Dockerfile.agent.alpine | 12 --------- docker/Dockerfile.agent.alpine.multiarch | 18 +++++++++++++ docker/Dockerfile.agent.multiarch | 20 ++++++++++++++ 6 files changed, 77 insertions(+), 51 deletions(-) delete mode 100644 docker/Dockerfile.agent delete mode 100644 docker/Dockerfile.agent.alpine create mode 100644 docker/Dockerfile.agent.alpine.multiarch create mode 100644 docker/Dockerfile.agent.multiarch diff --git a/.woodpecker/main.yml b/.woodpecker/main.yml index 072e57f73..1458cdd8c 100644 --- a/.woodpecker/main.yml +++ b/.woodpecker/main.yml @@ -17,6 +17,8 @@ pipeline: image: golang:1.16 commands: - make release-agent + when: + event: tag build-cli: group: build @@ -59,13 +61,26 @@ pipeline: branch: ${CI_REPO_DEFAULT_BRANCH} event: push + publish-agent-dryrun: + group: bundle + image: woodpeckerci/plugin-docker-buildx + settings: + dry_run: true + repo: woodpeckerci/woodpecker-agent + dockerfile: docker/Dockerfile.agent.multiarch + platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,windows/amd64,darwin/amd64,darwin/arm64 + tag: test + when: + event: pull_request + publish-agent: group: bundle - image: plugins/docker + image: woodpeckerci/plugin-docker-buildx secrets: [docker_username, docker_password] settings: repo: woodpeckerci/woodpecker-agent - dockerfile: docker/Dockerfile.agent + dockerfile: docker/Dockerfile.agent.multiarch + platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,windows/amd64,darwin/amd64,darwin/arm64 # TODO: only release as next after 0.15.0 got released tag: [next, latest] when: @@ -74,11 +89,12 @@ pipeline: publish-agent-alpine: group: bundle - image: plugins/docker + image: woodpeckerci/plugin-docker-buildx secrets: [ docker_username, docker_password ] settings: repo: woodpeckerci/woodpecker-agent - dockerfile: docker/Dockerfile.agent.alpine + dockerfile: docker/Dockerfile.agent.alpine.multiarch + platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le # TODO: only release as next-alpine after 0.15.0 got released tag: [next-alpine, latest-alpine] when: @@ -133,22 +149,24 @@ pipeline: release-agent: group: bundle - image: plugins/docker + image: woodpeckerci/plugin-docker-buildx secrets: [docker_username, docker_password] settings: repo: woodpeckerci/woodpecker-agent - dockerfile: docker/Dockerfile.agent + dockerfile: docker/Dockerfile.agent.multiarch + platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,windows/amd64,darwin/amd64,darwin/arm64 tag: [latest, "${CI_COMMIT_TAG}"] when: event: tag release-agent-alpine: group: bundle - image: plugins/docker + image: woodpeckerci/plugin-docker-buildx secrets: [ docker_username, docker_password ] settings: repo: woodpeckerci/woodpecker-agent - dockerfile: docker/Dockerfile.agent.alpine + dockerfile: docker/Dockerfile.agent.alpine.multiarch + platforms: linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le tag: [latest-alpine, "${CI_COMMIT_TAG}-alpine"] when: event: tag diff --git a/Makefile b/Makefile index 8594aaccd..0147c2925 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ -DOCKER_RUN_GO_VERSION=1.16 GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "./vendor/*" -not -path "./.git/*") GO_PACKAGES ?= $(shell go list ./... | grep -v /vendor/) +TARGETOS ?= linux +TARGETARCH ?= amd64 + VERSION ?= next ifneq ($(CI_COMMIT_TAG),) VERSION := $(CI_COMMIT_TAG:v%=%) @@ -10,15 +12,12 @@ endif # append commit-sha to next version BUILD_VERSION := $(VERSION) ifeq ($(BUILD_VERSION),next) + CI_COMMIT_SHA ?= $(shell git rev-parse HEAD) BUILD_VERSION := $(shell echo "next-$(shell echo ${CI_COMMIT_SHA} | head -c 8)") endif LDFLAGS := -s -w -extldflags "-static" -X github.com/woodpecker-ci/woodpecker/version.Version=${BUILD_VERSION} -DOCKER_RUN?= -_with-docker: - $(eval DOCKER_RUN=docker run --rm -v $(shell pwd):/go/src/ -v $(shell pwd)/build:/build -w /go/src golang:$(DOCKER_RUN_GO_VERSION)) - all: build vendor: @@ -51,16 +50,16 @@ lint-frontend: (cd web/; yarn lint --quiet) test-agent: - $(DOCKER_RUN) go test -race -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/agent github.com/woodpecker-ci/woodpecker/agent/... + go test -race -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/agent github.com/woodpecker-ci/woodpecker/agent/... test-server: - $(DOCKER_RUN) go test -race -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/server $(shell go list github.com/woodpecker-ci/woodpecker/server/... | grep -v '/store') + go test -race -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/server $(shell go list github.com/woodpecker-ci/woodpecker/server/... | grep -v '/store') test-cli: - $(DOCKER_RUN) go test -race -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/cli github.com/woodpecker-ci/woodpecker/cli/... + go test -race -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/cmd/cli github.com/woodpecker-ci/woodpecker/cli/... test-server-datastore: - $(DOCKER_RUN) go test -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/server/store/... + go test -cover -coverprofile coverage.out -timeout 30s github.com/woodpecker-ci/woodpecker/server/store/... test-frontend: frontend-dependencies (cd web/; yarn run lint) @@ -69,7 +68,7 @@ test-frontend: frontend-dependencies (cd web/; yarn run test) test-lib: - $(DOCKER_RUN) go test -race -cover -coverprofile coverage.out -timeout 30s $(shell go list ./... | grep -v '/cmd\|/agent\|/cli\|/server') + go test -race -cover -coverprofile coverage.out -timeout 30s $(shell go list ./... | grep -v '/cmd\|/agent\|/cli\|/server') test: test-agent test-server test-server-datastore test-cli test-lib test-frontend @@ -77,13 +76,13 @@ build-frontend: (cd web/; yarn install --frozen-lockfile; yarn build) build-server: build-frontend - $(DOCKER_RUN) go build -o dist/woodpecker-server github.com/woodpecker-ci/woodpecker/cmd/server + CGO_ENABLED=1 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -ldflags '${LDFLAGS}' -o dist/woodpecker-server github.com/woodpecker-ci/woodpecker/cmd/server build-agent: - $(DOCKER_RUN) go build -o dist/woodpecker-agent github.com/woodpecker-ci/woodpecker/cmd/agent + CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -ldflags '${LDFLAGS}' -o dist/woodpecker-agent github.com/woodpecker-ci/woodpecker/cmd/agent build-cli: - $(DOCKER_RUN) go build -o dist/woodpecker-cli github.com/woodpecker-ci/woodpecker/cmd/cli + CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -ldflags '${LDFLAGS}' -o dist/woodpecker-cli github.com/woodpecker-ci/woodpecker/cmd/cli build: build-agent build-server build-cli @@ -152,4 +151,4 @@ bundle: bundle-agent bundle-server bundle-cli .PHONY: version version: - @echo ${VERSION} + @echo ${BUILD_VERSION} diff --git a/docker/Dockerfile.agent b/docker/Dockerfile.agent deleted file mode 100644 index 76350add3..000000000 --- a/docker/Dockerfile.agent +++ /dev/null @@ -1,17 +0,0 @@ -# docker build --rm -f docker/Dockerfile.agent -t woodpeckerci/woodpecker-agent . - -# use golang image to copy ssl certs later -FROM golang:1.16 - -FROM scratch - -# copy certs from golang:1.16 image -COPY --from=0 /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt - -ENV GODEBUG=netdns=go -ADD dist/agent/linux_amd64/woodpecker-agent /bin/ - -EXPOSE 3000 -HEALTHCHECK CMD ["/bin/woodpecker-agent", "ping"] - -ENTRYPOINT ["/bin/woodpecker-agent"] diff --git a/docker/Dockerfile.agent.alpine b/docker/Dockerfile.agent.alpine deleted file mode 100644 index e2b4e074b..000000000 --- a/docker/Dockerfile.agent.alpine +++ /dev/null @@ -1,12 +0,0 @@ -# docker build --rm -f docker/Dockerfile.agent.alpine -t woodpeckerci/woodpecker-agent . - -FROM alpine:3.14 -RUN apk add -U --no-cache ca-certificates - -ENV GODEBUG=netdns=go -ADD dist/agent/linux_amd64/woodpecker-agent /bin/ - -EXPOSE 3000 -HEALTHCHECK CMD ["/bin/woodpecker-agent", "ping"] - -ENTRYPOINT ["/bin/woodpecker-agent"] diff --git a/docker/Dockerfile.agent.alpine.multiarch b/docker/Dockerfile.agent.alpine.multiarch new file mode 100644 index 000000000..436c78efe --- /dev/null +++ b/docker/Dockerfile.agent.alpine.multiarch @@ -0,0 +1,18 @@ +FROM --platform=$BUILDPLATFORM golang:1.16 AS build + +WORKDIR /src +COPY . . +ARG TARGETOS TARGETARCH +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/go/pkg \ + make build-agent + +FROM alpine:3.14 +RUN apk add -U --no-cache ca-certificates +ENV GODEBUG=netdns=go +EXPOSE 3000 + +COPY --from=build src/dist/woodpecker-agent /bin/ + +HEALTHCHECK CMD ["/bin/woodpecker-agent", "ping"] +ENTRYPOINT ["/bin/woodpecker-agent"] diff --git a/docker/Dockerfile.agent.multiarch b/docker/Dockerfile.agent.multiarch new file mode 100644 index 000000000..994db0c3d --- /dev/null +++ b/docker/Dockerfile.agent.multiarch @@ -0,0 +1,20 @@ +FROM --platform=$BUILDPLATFORM golang:1.16 AS build + +WORKDIR /src +COPY . . +ARG TARGETOS TARGETARCH +RUN --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/go/pkg \ + make build-agent + +FROM scratch +ENV GODEBUG=netdns=go +EXPOSE 3000 + +# copy certs from golang:1.16 image +COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +# copy agent binary +COPY --from=build src/dist/woodpecker-agent /bin/ + +HEALTHCHECK CMD ["/bin/woodpecker-agent", "ping"] +ENTRYPOINT ["/bin/woodpecker-agent"]