diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..213e3f06 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,92 @@ +name: build +on: + push: + branches: + - master + - v* + tags: + - v* + pull_request: +jobs: + build: + name: Build binaries + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + # Build binaries + - name: Run ci + run: make ci + + - uses: codecov/codecov-action@v4 + with: + files: ./coverage.out + flags: unittests + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Upload binaries + uses: actions/upload-artifact@v4 + with: + name: binaries_artifact + path: ./bin/* + + build_push_image: + name: Build and push image + runs-on: ubuntu-latest + needs: build + if: ${{ startsWith(github.ref, 'refs/heads/') || startsWith(github.ref, 'refs/tags/') }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download binaries + uses: actions/download-artifact@v4 + with: + name: binaries_artifact + path: ./bin/ + + - name: Add executable permission + run: | + chmod +x ./bin/* + + - name: Copy bin folder to package + run: | + cp -r ./bin ./package/ + + # For multi-platform support + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Declare branch + run: | + echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> "$GITHUB_ENV" + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + # longhornio/backing-image-manager image + - name: docker-publish + if: ${{ startsWith(github.ref, 'refs/heads/') }} + uses: docker/build-push-action@v5 + with: + context: ./ + push: true + platforms: linux/amd64,linux/arm64 + tags: longhornio/backing-image-manager:${{ env.branch }}-head + file: package/Dockerfile + + - name: docker-publish-with-tag + if: ${{ startsWith(github.ref, 'refs/tags/') }} + uses: docker/build-push-action@v5 + with: + context: ./ + push: true + platforms: linux/amd64,linux/arm64 + tags: longhornio/backing-image-manager:${{ github.ref_name }} + file: package/Dockerfile diff --git a/Dockerfile.dapper b/Dockerfile.dapper index 9f407c06..6d600027 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -36,6 +36,11 @@ ENV GOLANG_ARCH_amd64=amd64 GOLANG_ARCH_arm64=arm64 GOLANG_ARCH_s390x=s390x GOLA RUN wget -O - https://storage.googleapis.com/golang/go1.21.3.linux-${!GOLANG_ARCH}.tar.gz | tar -xzf - -C /usr/local RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2 +# The docker version in dapper is too old to have buildx. Install it manually. +RUN wget https://github.com/docker/buildx/releases/download/v0.13.1/buildx-v0.13.1.linux-${ARCH} && \ + chmod +x buildx-v0.13.1.linux-${ARCH} && \ + mv buildx-v0.13.1.linux-${ARCH} /usr/local/bin/buildx + VOLUME /tmp ENV TMPDIR /tmp ENTRYPOINT ["./scripts/entry"] diff --git a/package/Dockerfile b/package/Dockerfile index 898ff497..11c811bf 100644 --- a/package/Dockerfile +++ b/package/Dockerfile @@ -1,16 +1,24 @@ -FROM registry.suse.com/bci/bci-base:15.5 +# syntax=docker/dockerfile:1.7.1 -ARG ARCH=amd64 +FROM registry.suse.com/bci/bci-base:15.6 + +ARG TARGETPLATFORM +RUN if [ "$TARGETPLATFORM" != "linux/amd64" ] && [ "$TARGETPLATFORM" != "linux/arm64" ]; then \ + echo "Error: Unsupported TARGETPLATFORM: $TARGETPLATFORM" && \ + exit 1; \ + fi + +ENV ARCH ${TARGETPLATFORM#linux/} RUN zypper -n addrepo --refresh https://download.opensuse.org/repositories/system:/snappy/SLE_15/system:snappy.repo && \ zypper -n addrepo --refresh https://download.opensuse.org/repositories/network:/utilities/SLE_15_SP5/network:utilities.repo && \ zypper --gpg-auto-import-keys ref RUN zypper -n install kmod curl wget nfs-client nfs4-acl-tools fuse \ - librdmacm1 librdmacm-utils libibverbs perl-Config-General libaio-devel sg3_utils \ - iputils telnet iperf qemu-tools iproute2 e2fsprogs e2fsprogs-devel xfsprogs xfsprogs-devel + librdmacm1 librdmacm-utils libibverbs perl-Config-General libaio-devel sg3_utils \ + iputils telnet iperf qemu-tools iproute2 e2fsprogs e2fsprogs-devel xfsprogs xfsprogs-devel -COPY bin/backing-image-manager /usr/local/bin/ +COPY package/bin/backing-image-manager-${ARCH} /usr/local/bin/backing-image-manager VOLUME /usr/local/bin diff --git a/scripts/build b/scripts/build index e97b2b5b..e11392eb 100755 --- a/scripts/build +++ b/scripts/build @@ -1,14 +1,18 @@ #!/bin/bash -set -e +set -ex source $(dirname $0)/version +LINKFLAGS="-X main.Version=$VERSION + -X main.GitCommit=$GITCOMMIT + -X main.BuildDate=$BUILDDATE" +[ "$(uname)" != "Darwin" ] && OTHER_LINKFLAGS="-extldflags -static" + cd $(dirname $0)/.. mkdir -p bin -go build -ldflags \ - "-X main.Version=$VERSION \ - -X main.GitCommit=$GITCOMMIT \ - -X main.BuildDate=$BUILDDATE \ - -linkmode external -extldflags -static" \ - -o bin/backing-image-manager + +archs=("amd64" "arm64") +for arch in "${archs[@]}"; do + CGO_ENABLED=0 GOARCH="$arch" go build -o "bin/backing-image-manager-$arch" -ldflags "$LINKFLAGS $OTHER_LINKFLAGS" +done diff --git a/scripts/package b/scripts/package index 1297c986..bc8d9e7e 100755 --- a/scripts/package +++ b/scripts/package @@ -7,31 +7,18 @@ cd $(dirname $0)/.. PROJECT=`basename "$PWD"` -case $(uname -m) in - aarch64 | arm64) - ARCH=arm64 - ;; - x86_64) - ARCH=amd64 - ;; - s390x) - ARCH=s390x - ;; - *) - echo "$(uname -a): unsupported architecture" - exit 1 -esac - if [ ! -x ./bin/longhorn ]; then ./scripts/build fi +cp -r bin package/ + APIVERSION=`./bin/backing-image-manager version --client-only|jq ".clientVersion.backingImageManagerAPIVersion"` TAG="v${APIVERSION}_`date -u +%Y%m%d`" REPO=${REPO:-longhornio} IMAGE=${REPO}/${PROJECT}:${TAG} -docker build --build-arg ARCH=${ARCH} --no-cache -t ${IMAGE} -f package/Dockerfile . +buildx build --load --no-cache -t ${IMAGE} -f package/Dockerfile . echo Built ${IMAGE}