Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Multi Arch Container Image builds #407

Merged
merged 28 commits into from
Aug 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7b97efa
create buildx context
jsirianni Aug 24, 2021
5d34bd1
Merge branch 'master' into buildx-context
jsirianni Aug 24, 2021
ae6aae9
build image on ci runs, but dont push when not a release
jsirianni Aug 24, 2021
66f5624
use the context
jsirianni Aug 24, 2021
f4bdec1
fetch plugins during container build
jsirianni Aug 24, 2021
beccbf7
setup experimental
jsirianni Aug 24, 2021
002c799
Revert experimental, it is set with env
Aug 25, 2021
3be8209
use docker buildx org for installing buildx and qemu
Aug 25, 2021
30d217b
fetch plugins before building container image
Aug 25, 2021
a1926e9
update gcloud cli
Aug 25, 2021
01c672f
run buildx org install command
Aug 25, 2021
ada4cbf
gcloud org version typo
Aug 25, 2021
3ceb2e3
sensu docker buildx orb has some issues, so lets base our implementat…
Aug 25, 2021
795a5f1
Add qemu version
Aug 25, 2021
36dc362
create docker context
Aug 25, 2021
7a564ae
Set gcloud sdk version
Aug 25, 2021
ad2fc68
use context when creating buildx builder
Aug 25, 2021
9eb0619
fix gcloud syntax
Aug 25, 2021
ca1a4b2
always fetch plugins
Aug 25, 2021
97a7dc2
use large builder for docker
Aug 25, 2021
b7f4b7c
ignore entire artifacts dir
Aug 25, 2021
05c28a6
use plan docker output
Aug 25, 2021
cd5f614
fix plugin install by adding them to the stage build
Aug 25, 2021
f84aca3
Merge branch 'master' into buildx-context
Aug 25, 2021
1f2283f
use larger instance and increase timeout for build
Aug 25, 2021
3255238
we dont need fetch plugins for build anymore
Aug 25, 2021
6899314
increase timeout
Aug 25, 2021
35a99cf
build finished in 27 minutes, so increase timeout from 30 to 45m
Aug 25, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 102 additions & 6 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ version: 2.1

orbs:
win: circleci/[email protected]
gcp-cli: circleci/gcp-cli@1.8.4
gcp-cli: circleci/gcp-cli@2.2.0
codecov: codecov/[email protected]
pr-comment: benjlevesque/[email protected]

Expand Down Expand Up @@ -34,6 +34,64 @@ jobs:
root: ./artifacts
paths:
- "*"
build-docker:
resource_class: large
docker:
- image: circleci/buildpack-deps:stretch
steps:
- checkout
- setup_remote_docker:
version: 19.03.14
- attach_workspace:
at: ./artifacts
- run:
name: Install Docker buildx
command: |
mkdir -p ~/.docker/cli-plugins
curl -sSL -o ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.6.2/buildx-v0.6.2.linux-amd64
chmod a+x ~/.docker/cli-plugins/docker-buildx
- run:
name: Enable experimental Docker features
command: echo 'export DOCKER_CLI_EXPERIMENTAL="enabled"' >> $BASH_ENV
- run:
name: Create Docker context
command: docker context create tls-environment
- run:
name: Initialize Docker buildx
command: docker buildx install
- run:
name: Start multiarch/qemu-user-static container
command: >
docker run --rm --privileged
multiarch/qemu-user-static:5.2.0-2
--reset -p yes
- run:
name: Remove buildx multiarch container in case it exists
command: docker rm -f buildx_buildkit_docker-multiarch0 || continue
- run:
name: Create docker-multiarch builder
command: >
docker buildx create --name docker-multiarch tls-environment
--platform linux/386,linux/amd64,linux/arm/v5,linux/arm/v6,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x
- run:
name: Inspect & bootstrap docker-multiarch builder
command: docker buildx inspect --builder docker-multiarch --bootstrap
- run:
name: Set docker-multiarch as default builder
command: docker buildx use docker-multiarch
- run:
name: "Build container image"
no_output_timeout: 45m
command: |
docker_tag=$(echo ${CIRCLE_TAG} | cut -b2- )
docker login -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_TOKEN}
export DOCKER_CLI_EXPERIMENTAL=enabled

docker buildx build \
--progress=plain \
--platform linux/amd64,linux/arm64 \
--tag observiq/stanza:latest \
.

fetch-plugins:
executor: golang
Expand Down Expand Up @@ -72,29 +130,61 @@ jobs:
ghr -t ${GHI_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} ${CIRCLE_TAG} ./artifacts/

publish-docker-release:
# building amd64 + arm64 is compute intensive
resource_class: 2xlarge
docker:
- image: circleci/buildpack-deps:stretch
steps:
- checkout
- setup_remote_docker
- setup_remote_docker:
version: 19.03.14
- attach_workspace:
at: ./artifacts
- run:
name: "Configure Docker multi arch builds"
name: Install Docker buildx
command: |
mkdir -p ~/.docker/cli-plugins
curl -fL https://github.com/docker/buildx/releases/download/v0.6.1/buildx-v0.6.1.linux-amd64 -o ~/.docker/cli-plugins/docker-buildx
curl -sSL -o ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.6.2/buildx-v0.6.2.linux-amd64
chmod a+x ~/.docker/cli-plugins/docker-buildx
docker buildx create --name stanza --use
docker buildx inspect --bootstrap
- run:
name: Enable experimental Docker features
command: echo 'export DOCKER_CLI_EXPERIMENTAL="enabled"' >> $BASH_ENV
- run:
name: Create Docker context
command: docker context create tls-environment
- run:
name: Initialize Docker buildx
command: docker buildx install
- run:
name: Start multiarch/qemu-user-static container
command: >
docker run --rm --privileged
multiarch/qemu-user-static:5.2.0-2
--reset -p yes
- run:
name: Remove buildx multiarch container in case it exists
command: docker rm -f buildx_buildkit_docker-multiarch0 || continue
- run:
name: Create docker-multiarch builder
command: >
docker buildx create --name docker-multiarch tls-environment
--platform linux/386,linux/amd64,linux/arm/v5,linux/arm/v6,linux/arm/v7,linux/arm64,linux/mips64le,linux/ppc64le,linux/riscv64,linux/s390x
- run:
name: Inspect & bootstrap docker-multiarch builder
command: docker buildx inspect --builder docker-multiarch --bootstrap
- run:
name: Set docker-multiarch as default builder
command: docker buildx use docker-multiarch
- run:
name: "Publish Release on Docker Hub"
no_output_timeout: 45m
command: |
docker_tag=$(echo ${CIRCLE_TAG} | cut -b2- )
docker login -u ${DOCKER_HUB_USER} -p ${DOCKER_HUB_TOKEN}
export DOCKER_CLI_EXPERIMENTAL=enabled

docker buildx build \
--progress=plain \
--platform linux/amd64,linux/arm64 \
--tag observiq/stanza:${docker_tag} \
--tag observiq/stanza:latest \
Expand Down Expand Up @@ -441,6 +531,12 @@ workflows:
filters:
tags:
only: /^v\d+\.\d+\.\d+.*/
- build-docker:
filters:
tags:
only: /^v\d+\.\d+\.\d+.*/
requires:
- build
- fetch-plugins:
filters:
branches:
Expand Down
3 changes: 1 addition & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
artifacts/stanza_darwin_amd64
artifacts/stanza_windows_amd64
artifacts/
.git/
dev/
23 changes: 16 additions & 7 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,22 +1,31 @@
FROM golang:1.16 as stage

ARG plugins_url="https://github.com/observiq/stanza-plugins/releases/latest/download/stanza-plugins.zip"
# arm cross builds do not have these symlinks in palce
RUN \
ln -s /usr/bin/dpkg-split /usr/sbin/dpkg-split && \
ln -s /usr/bin/dpkg-deb /usr/sbin/dpkg-deb && \
ln -s /bin/tar /usr/sbin/tar && \
ln -s /bin/rm /usr/sbin/rm && \
echo "resolvconf resolvconf/linkify-resolvconf boolean false" | debconf-set-selections
# unzip is required because tar does not work on arm
RUN apt-get update && apt-get install unzip -y
WORKDIR /stanza/artifacts
RUN curl -fL "${plugins_url}" -o stanza-plugins.zip
RUN unzip stanza-plugins.zip
WORKDIR /stanza
COPY . .
RUN rm -rf artifacts/*
RUN make build
WORKDIR /stanza/artifacts
# hack: "mv stanza_* stanza" gives an error because mv does not like '_*'
RUN for f in stanza_*; do mv "$f" stanza; done
RUN mv "artifacts/stanza_$(go env GOOS)_$(go env GOARCH)" artifacts/stanza


FROM gcr.io/observiq-container-images/stanza-base:v1.1.0

RUN mkdir -p /stanza_home
ENV STANZA_HOME=/stanza_home
RUN echo "pipeline:\n" >> /stanza_home/config.yaml

COPY --from=stage /stanza/artifacts/stanza /stanza_home/stanza
COPY ./artifacts/stanza-plugins.tar.gz /tmp/stanza-plugins.tar.gz
RUN tar -zxvf /tmp/stanza-plugins.tar.gz -C /stanza_home/
COPY --from=stage /stanza/artifacts/plugins /stanza_home/plugins
ENTRYPOINT /stanza_home/stanza \
--config /stanza_home/config.yaml \
--database /stanza_home/stanza.db \
Expand Down