From e52d6c706745ddb92b439c05f55de089357449d8 Mon Sep 17 00:00:00 2001 From: Prateek Pandey Date: Wed, 11 Nov 2020 14:16:33 +0530 Subject: [PATCH] feat(build): support for multi arch container image (#233) * support for multi arch container image via github actions * suffix amd64 arch tag in zfs driver image Signed-off-by: prateekpandey14 --- .github/workflows/build.yml | 88 +++++++++++++++++++ .github/workflows/pull_request.yml | 75 ++++++++++++++++ .github/workflows/release.yml | 57 ++++++++++++ Makefile | 4 +- Makefile.buildx.mk | 74 ++++++++++++++++ buildscripts/build.sh | 32 ++----- buildscripts/push | 26 ++++++ buildscripts/zfs-driver/Dockerfile | 1 - buildscripts/zfs-driver/zfs-driver.Dockerfile | 61 +++++++++++++ 9 files changed, 389 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/pull_request.yml create mode 100644 .github/workflows/release.yml create mode 100644 Makefile.buildx.mk create mode 100644 buildscripts/zfs-driver/zfs-driver.Dockerfile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..ca7670133 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,88 @@ +# Copyright 2020 The OpenEBS Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +name: build + +on: ['push'] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Shellcheck + uses: reviewdog/action-shellcheck@v1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review + path: '.' + pattern: '*.sh' + exclude: './.git/*,./vendor/*' + + + unit-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Unit test + run: make test + + - name: Upload Coverage Report + uses: codecov/codecov-action@v1 + + csi-driver: + runs-on: ubuntu-latest + needs: ['lint', 'unit-test'] + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Set tag + run: | + BRANCH="${GITHUB_REF##*/}" + CI_TAG=${BRANCH#v}-ci + if [ ${BRANCH} = "master" ]; then + CI_TAG="ci" + fi + echo "::set-env name=TAG::${CI_TAG}" + echo "::set-env name=BRANCH::${BRANCH}" + echo "BRANCH: ${BRANCH}" + echo "TAG: ${CI_TAG}" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + with: + version: latest + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build & Push Image + env: + IMAGE_ORG: ${{ secrets.IMAGE_ORG}} + run: | + make docker.buildx.csi-driver + make buildx.push.csi-driver diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 000000000..2ef9ec0cb --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,75 @@ +# Copyright 2020 The OpenEBS Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: ci + +on: + pull_request: + branches: + # on pull requests to master and release branches + - master + - 'v*' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Shellcheck + uses: reviewdog/action-shellcheck@v1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-review + path: '.' + pattern: '*.sh' + exclude: './vendor/*' + + + unit-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Unit test + run: make test + + - name: Upload Coverage Report + uses: codecov/codecov-action@v1 + + + csi-driver: + runs-on: ubuntu-latest + needs: ['lint', 'unit-test'] + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + with: + version: latest + + - name: Build Image + env: + IMG_RESULT: cache + run: make docker.buildx.csi-driver diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..c95b997ee --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,57 @@ +# Copyright 2020 The OpenEBS Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +name: release + +on: + create: + tags: + - 'v*' + +jobs: + csi-driver: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v1 + + - name: Set Tag + run: | + TAG="${GITHUB_REF#refs/*/v}" + echo "::set-env name=TAG::${TAG}" + echo "::set-env name=RELEASE_TAG::${TAG}" + echo "RELEASE_TAG ${TAG}" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + with: + platforms: all + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + with: + version: latest + + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build & Push Image + env: + IMAGE_ORG: ${{ secrets.IMAGE_ORG}} + run: | + make docker.buildx.csi-driver + make buildx.push.csi-driver diff --git a/Makefile b/Makefile index 2332bb63b..d19e34bb1 100644 --- a/Makefile +++ b/Makefile @@ -87,7 +87,7 @@ export XC_ARCH ARCH:=${XC_OS}_${XC_ARCH} export ARCH -export DBUILD_ARGS=--build-arg DBUILD_DATE=${DBUILD_DATE} --build-arg DBUILD_REPO_URL=${DBUILD_REPO_URL} --build-arg DBUILD_SITE_URL=${DBUILD_SITE_URL} --build-arg ARCH=${ARCH} +export DBUILD_ARGS=--build-arg DBUILD_DATE=${DBUILD_DATE} --build-arg DBUILD_REPO_URL=${DBUILD_REPO_URL} --build-arg DBUILD_SITE_URL=${DBUILD_SITE_URL} # Specify the name for the binary CSI_DRIVER=zfs-driver @@ -259,3 +259,5 @@ license-check: fi @echo "--> Done checking license." @echo + +include Makefile.buildx.mk diff --git a/Makefile.buildx.mk b/Makefile.buildx.mk new file mode 100644 index 000000000..94907eb6a --- /dev/null +++ b/Makefile.buildx.mk @@ -0,0 +1,74 @@ + +# Copyright 2018-2020 The OpenEBS Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Build zfs-driver docker images with buildx +# Experimental docker feature to build cross platform multi-architecture docker images +# https://docs.docker.com/buildx/working-with-buildx/ + +ifeq (${TAG}, ) + export TAG=ci +endif + +# default list of platforms for which multiarch image is built +ifeq (${PLATFORMS}, ) + export PLATFORMS="linux/amd64,linux/arm64" +endif + +# if IMG_RESULT is unspecified, by default the image will be pushed to registry +ifeq (${IMG_RESULT}, load) + export PUSH_ARG="--load" + # if load is specified, image will be built only for the build machine architecture. + export PLATFORMS="local" +else ifeq (${IMG_RESULT}, cache) + # if cache is specified, image will only be available in the build cache, it won't be pushed or loaded + # therefore no PUSH_ARG will be specified +else + export PUSH_ARG="--push" +endif + +# Name of the multiarch image for csi-driver +DOCKERX_IMAGE_CSI_DRIVER:=${IMAGE_ORG}/zfs-driver:${TAG} + +.PHONY: docker.buildx +docker.buildx: + export DOCKER_CLI_EXPERIMENTAL=enabled + @if ! docker buildx ls | grep -q container-builder; then\ + docker buildx create --platform ${PLATFORMS} --name container-builder --use;\ + fi + @docker buildx build --platform "${PLATFORMS}" \ + -t "$(DOCKERX_IMAGE_NAME)" ${BUILD_ARGS} \ + -f $(PWD)/buildscripts/$(COMPONENT)/$(COMPONENT).Dockerfile \ + . ${PUSH_ARG} + @echo "--> Build docker image: $(DOCKERX_IMAGE_NAME)" + @echo + +.PHONY: buildx.csi-driver +buildx.csi-driver: + @echo '--> Building csi-driver binary...' + @pwd + @PNAME=${CSI_DRIVER} CTLNAME=${CSI_DRIVER} BUILDX=true sh -c "'$(PWD)/buildscripts/build.sh'" + @echo '--> Built binary.' + @echo + +.PHONY: docker.buildx.csi-driver +docker.buildx.csi-driver: DOCKERX_IMAGE_NAME=$(DOCKERX_IMAGE_CSI_DRIVER) +docker.buildx.csi-driver: COMPONENT=$(CSI_DRIVER) +docker.buildx.csi-driver: BUILD_ARGS=$(DBUILD_ARGS) +docker.buildx.csi-driver: docker.buildx + + +.PHONY: buildx.push.csi-driver +buildx.push.csi-driver: + BUILDX=true DIMAGE=${IMAGE_ORG}/zfs-driver ./buildscripts/push diff --git a/buildscripts/build.sh b/buildscripts/build.sh index 80377953e..683b8635b 100755 --- a/buildscripts/build.sh +++ b/buildscripts/build.sh @@ -33,21 +33,21 @@ else fi # Set BUILDMETA based on travis tag -if [[ -n "$TRAVIS_TAG" ]] && [[ $TRAVIS_TAG != *"RC"* ]]; then +if [[ -n "$RELEASE_TAG" ]] && [[ $RELEASE_TAG != *"RC"* ]]; then echo "released" > BUILDMETA fi CURRENT_BRANCH="" -if [ -z ${TRAVIS_BRANCH} ]; +if [ -z ${BRANCH} ]; then CURRENT_BRANCH=$(git branch | grep \* | cut -d ' ' -f2) else - CURRENT_BRANCH=${TRAVIS_BRANCH} + CURRENT_BRANCH=${BRANCH} fi # Get the version details -if [ -n "$TRAVIS_TAG" ]; then - VERSION="$TRAVIS_TAG" +if [ -n "$RELEASE_TAG" ]; then + VERSION="$RELEASE_TAG" else BUILDDATE=`date +%m-%d-%Y` SHORT_COMMIT="$(git rev-parse --short HEAD)" @@ -72,15 +72,6 @@ elif [ "$UNAME" = "Linux" ] ; then XC_OS="linux" fi -if [ "${ARCH}" = "i686" ] ; then - XC_ARCH='386' -elif [ "${ARCH}" = "x86_64" ] ; then - XC_ARCH='amd64' -else - echo "Unusable architecture: ${ARCH}" - exit 1 -fi - if [ -z "${PNAME}" ]; then @@ -146,19 +137,6 @@ for F in $(find ${DEV_PLATFORM} -mindepth 1 -maxdepth 1 -type f); do cp ${F} ${MAIN_GOPATH}/bin/ done -if [[ "x${DEV}" == "x" ]]; then - # Zip and copy to the dist dir - echo "==> Packaging..." - for PLATFORM in $(find ./bin/${PNAME} -mindepth 1 -maxdepth 1 -type d); do - OSARCH=$(basename ${PLATFORM}) - echo "--> ${OSARCH}" - - pushd "$PLATFORM" >/dev/null 2>&1 - zip ../${PNAME}-${OSARCH}.zip ./* - popd >/dev/null 2>&1 - done -fi - # Done! echo echo "==> Results:" diff --git a/buildscripts/push b/buildscripts/push index b83b31d25..edbc958f9 100755 --- a/buildscripts/push +++ b/buildscripts/push @@ -22,7 +22,33 @@ then exit 1 fi +function pushBuildx() { + BUILD_TAG="latest" + TARGET_IMG=${DIMAGE} + +# TODO Currently ci builds with commit tag will not be generated, +# since buildx does not support multiple repo + # if not a release build set the tag and ci image + if [ -z "${RELEASE_TAG}" ]; then + return +# BUILD_ID=$(git describe --tags --always) +# BUILD_TAG="${BRANCH}-${BUILD_ID}" +# TARGET_IMG="${DIMAGE}-ci" + fi + + echo "Tagging and pushing ${DIMAGE}:${TAG} as ${TARGET_IMG}:${BUILD_TAG}" + docker buildx imagetools create "${DIMAGE}:${TAG}" -t "${TARGET_IMG}:${BUILD_TAG}" +} + +# if the push is for a buildx build +if [[ ${BUILDX} ]]; then + pushBuildx + exit 0 +fi + IMAGEID=$( sudo docker images -q ${DIMAGE}:ci ) +DIMAGE="${DIMAGE}-${XC_ARCH}" + echo "${DIMAGE}:ci -> $IMAGEID" if [ -z ${IMAGEID} ]; then diff --git a/buildscripts/zfs-driver/Dockerfile b/buildscripts/zfs-driver/Dockerfile index 40f05e5ba..00c3e0974 100644 --- a/buildscripts/zfs-driver/Dockerfile +++ b/buildscripts/zfs-driver/Dockerfile @@ -18,7 +18,6 @@ RUN apt-get update; exit 0 RUN apt-get -y install rsyslog libssl-dev xfsprogs ca-certificates RUN apt-get -y install btrfs-progs netcat -ARG ARCH ARG DBUILD_DATE ARG DBUILD_REPO_URL ARG DBUILD_SITE_URL diff --git a/buildscripts/zfs-driver/zfs-driver.Dockerfile b/buildscripts/zfs-driver/zfs-driver.Dockerfile new file mode 100644 index 000000000..99bee5a23 --- /dev/null +++ b/buildscripts/zfs-driver/zfs-driver.Dockerfile @@ -0,0 +1,61 @@ +# Copyright 2019-2020 The OpenEBS Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM golang:1.14.7 as build + +ARG TARGETOS +ARG TARGETARCH +ARG TARGETVARIANT="" + +ENV GO111MODULE=on \ + GOOS=${TARGETOS} \ + GOARCH=${TARGETARCH} \ + GOARM=${TARGETVARIANT} \ + DEBIAN_FRONTEND=noninteractive \ + PATH="/root/go/bin:${PATH}" + +WORKDIR /go/src/github.com/openebs/zfs-localpv/ + +RUN apt-get update && apt-get install -y make git + +COPY go.mod go.sum ./ +# Get dependancies - will also be cached if we won't change mod/sum +RUN go mod download + +COPY . . + +RUN make buildx.csi-driver + +FROM ubuntu:19.10 + +RUN apt-get clean && rm -rf /var/lib/apt/lists/* +RUN apt-get update; exit 0 +RUN apt-get -y install rsyslog libssl-dev xfsprogs ca-certificates +RUN apt-get -y install btrfs-progs netcat + +ARG DBUILD_DATE +ARG DBUILD_REPO_URL +ARG DBUILD_SITE_URL + +COPY --from=build /go/src/github.com/openebs/zfs-localpv/bin/zfs-driver/zfs-driver /usr/local/bin/zfs-driver + +LABEL org.label-schema.name="zfs-driver" +LABEL org.label-schema.description="OpenEBS ZFS LocalPV Driver" +LABEL org.label-schema.schema-version="1.0" +LABEL org.label-schema.build-date=$DBUILD_DATE +LABEL org.label-schema.vcs-url=$DBUILD_REPO_URL +LABEL org.label-schema.url=$DBUILD_SITE_URL + +ENTRYPOINT ["/usr/local/bin/zfs-driver"] +EXPOSE 7676 7777