From d3de286c552e2be9861f8794ea031b633f4ac597 Mon Sep 17 00:00:00 2001 From: Ian Fijolek Date: Tue, 14 Jul 2020 10:16:13 -0700 Subject: [PATCH] Try go get builds set up --- .drone.yml | 84 +++++++++++++++++++++++++++++++++++++++++ .gitignore | 2 + Dockerfile | 12 ++++++ Dockerfile.build-env | 6 +++ Dockerfile.multi-stage | 23 ++++++++++++ Makefile | 85 ++++++++++++++++++++++++++++++++++++++++++ build.sh | 24 ++++++++++++ manifest.tmpl | 25 +++++++++++++ 8 files changed, 261 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Dockerfile.build-env create mode 100644 Dockerfile.multi-stage create mode 100644 Makefile create mode 100755 build.sh create mode 100644 manifest.tmpl diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..8257c36 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,84 @@ +--- +kind: pipeline +name: publish + +trigger: + event: + - push + - tag + refs: + - refs/heads/master + - refs/tags/v* + +steps: + - name: build all binaries + image: golang:1.14 + environment: + VERSION: ${DRONE_TAG:-master} + commands: + - apt-get update + - apt-get install -y --no-install-recommends git dmsetup + - make all + + - name: push image - arm + image: plugins/docker + settings: + repo: iamthefij/cadvisor + auto_tag: true + auto_tag_suffix: linux-arm + username: + from_secret: docker_username + password: + from_secret: docker_password + build_args: + - ARCH=arm + - REPO=arm32v7 + + - name: push image - arm64 + image: plugins/docker + settings: + repo: iamthefij/cadvisor + auto_tag: true + auto_tag_suffix: linux-arm64 + username: + from_secret: docker_username + password: + from_secret: docker_password + build_args: + - ARCH=arm64 + - REPO=arm64v8 + + - name: push image - amd64 + image: plugins/docker + settings: + repo: iamthefij/cadvisor + auto_tag: true + auto_tag_suffix: linux-amd64 + username: + from_secret: docker_username + password: + from_secret: docker_password + + - name: publish manifest + image: plugins/manifest + settings: + spec: manifest.tmpl + auto_tag: true + ignore_missing: true + username: + from_secret: docker_username + password: + from_secret: docker_password + + - name: notify + image: drillster/drone-email + settings: + host: + from_secret: SMTP_HOST + username: + from_secret: SMTP_USER + password: + from_secret: SMTP_PASS + from: drone@iamthefij.com + when: + status: [changed, failure] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43508d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +src/ +cadvisor-* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fabaa44 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,12 @@ +ARG REPO=library +FROM multiarch/qemu-user-static:4.2.0-2 as qemu-user-static +FROM ${REPO}/alpine:3.10 + +# Copying all qemu files because amd64 doesn't exist and cannot condional copy +COPY --from=qemu-user-static /usr/bin/qemu-* /usr/bin/ + +ARG GOARCH=amd64 +COPY ./cadvisor-${GOARCH} /usr/bin/cadvisor + +EXPOSE 8080 +ENTRYPOINT ["/usr/bin/cadvisor", "-logtostderr"] diff --git a/Dockerfile.build-env b/Dockerfile.build-env new file mode 100644 index 0000000..5fb41d9 --- /dev/null +++ b/Dockerfile.build-env @@ -0,0 +1,6 @@ +# Builder +FROM golang:1.14 AS builder + +RUN apt-get update && apt-get install -y --no-install-recommends git dmsetup && apt-get clean + +WORKDIR /go/src/github.com/google/cadvisor diff --git a/Dockerfile.multi-stage b/Dockerfile.multi-stage new file mode 100644 index 0000000..027d9cd --- /dev/null +++ b/Dockerfile.multi-stage @@ -0,0 +1,23 @@ +ARG REPO=library +# Builder +FROM golang:1.14 AS builder + +RUN apt-get update && apt-get install -y --no-install-recommends git dmsetup && apt-get clean + +ARG SRC_DIR=./src/cadvisor-master +COPY ${SRC_DIR} /go/src/github.com/google/cadvisor + +WORKDIR /go/src/github.com/google/cadvisor + +ARG GOARCH=amd64 +ENV GOARCH=${GOARCH} +RUN make build # release + +FROM ${REPO}/alpine:3.10 + +COPY --from=builder /go/src/github.com/google/cadvisor/cadvisor /usr/bin/cadvisor + +EXPOSE 8080 +ENTRYPOINT ["/usr/bin/cadvisor", "-logtostderr"] + +# vim: set filetype=dockerfile: diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..15b00ef --- /dev/null +++ b/Makefile @@ -0,0 +1,85 @@ +PROJECT = cadvisor +DOCKER_TAG ?= $(PROJECT)-${USER} +VERSION ?= master +# Extracted src directory +SRC_DIR = src/$(PROJECT)-$(subst v,,$(VERSION)) +# Multi-arch targets are generated from this +TARGETS = cadvisor-amd64 cadvisor-arm cadvisor-arm64 + +# Default make target will run tests +.DEFAULT_GOAL = build + +.PHONY: test +test: + @echo "no tests" + +# Build all static Minitor binaries +.PHONY: all +all: $(TARGETS) + +$(SRC_DIR): + mkdir -p ./src + git clone --depth=1 --branch $(VERSION) https://github.com/google/cadvisor.git $(SRC_DIR) + +.PHONY: clean +clean: + rm -f ./src + +.PHONY: build +build: $(SRC_DIR) + ./build.sh "$(DOCKER_TAG)" "$(SRC_DIR)" + +## Multi-arch targets +$(TARGETS): $(SRC_DIR) + GOARCH=$(lastword $(subst -, ,$(@))) \ + ./build.sh "$(DOCKER_TAG)" "$(SRC_DIR)" + +.PHONY: docker-build-env +docker-build-env: $(SRC_DIR) + docker build -f Dockerfile.build-env . -t $(DOCKER_TAG)-build-env + +.PHONY: build-in-docker +build-in-docker: docker-build-env + docker run --rm \ + -v $(shell pwd)/$(SRC_DIR):/go/src/github.com/google/cadvisor \ + -e GOARCH=amd64 \ + $(DOCKER_TAG)-build-env \ + make build \ + && cp $(SRC_DIR)/$(PROJECT) ./$(PROJECT)-amd64 + +.PHONY: build-in-docker-arm +build-in-docker-arm: docker-build-env + docker run --rm \ + -v $(shell pwd)/$(SRC_DIR):/go/src/github.com/google/cadvisor \ + -e GOARCH=arm \ + $(DOCKER_TAG)-build-env \ + make build \ + && cp $(SRC_DIR)/$(PROJECT) ./$(PROJECT)-arm + +.PHONY: build-in-docker-arm64 +build-in-docker-arm64: docker-build-env + docker run --rm \ + -v $(shell pwd)/$(SRC_DIR):/go/src/github.com/google/cadvisor \ + -e GOARCH=arm64 \ + $(DOCKER_TAG)-build-env \ + make build \ + && cp $(SRC_DIR)/$(PROJECT) ./$(PROJECT)-arm64 + +# Arch specific docker build targets +.PHONY: docker-build +docker-build: cadvisor-amd64 + docker build . -t ${DOCKER_TAG} + +.PHONY: docker-build-arm +docker-build-arm: cadvisor-arm + docker build \ + --build-arg REPO=arm32v7 \ + --build-arg GOARCH=arm\ + . -t ${DOCKER_TAG}-arm + +.PHONY: docker-build-arm64 +docker-build-arm64: cadvisor-arm64 + docker build \ + --build-arg REPO=arm64v8 \ + --build-arg GOARCH=arm64 \ + . -t ${DOCKER_TAG}-arm64 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..cb1c987 --- /dev/null +++ b/build.sh @@ -0,0 +1,24 @@ +#! /bin/sh + +docker_tag="$1" +src_dir="$2" +dmsetup="$(which dmsetup)" +docker="$(which docker)" +export GOARCH="${GOARCH:-amd64}" + +if [ -n "$dmsetup" ]; then + # We will build using make + make -C "$src_dir" build \ + && cp "${src_dir}/cadvisor" "./cadvisor-$GOARCH" +elif [ -n "$docker" ]; then + # We will build using docker + docker run --rm -it \ + -v "$(pwd)/${src_dir}:/go/src/github.com/google/cadvisor" \ + -e GOARCH="${GOARCH}" \ + "${docker_tag}-build-env" \ + make build \ + && cp "${src_dir}/cadvisor" "./cadvisor-$GOARCH" +else + echo "Either install build dependencies (dmsetup) or Docker" + exit 1 +fi diff --git a/manifest.tmpl b/manifest.tmpl new file mode 100644 index 0000000..884fb27 --- /dev/null +++ b/manifest.tmpl @@ -0,0 +1,25 @@ +image: iamthefij/cadvisor:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} +{{#if build.tags}} +tags: +{{#each build.tags}} + - {{this}} +{{/each}} +{{/if}} +manifests: + - + image: iamthefij/cadvisor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 + platform: + architecture: amd64 + os: linux + - + image: iamthefij/cadvisor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 + platform: + architecture: arm64 + os: linux + variant: v8 + - + image: iamthefij/cadvisor:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm + platform: + architecture: arm + os: linux + variant: v7