diff --git a/.drone.yml b/.drone.yml deleted file mode 100644 index 5918664d..00000000 --- a/.drone.yml +++ /dev/null @@ -1,266 +0,0 @@ ---- -kind: pipeline -name: default-amd64 - -platform: - os: linux - arch: amd64 - -trigger: - branch: - - master - - main - - v* - -steps: -- name: fetch - image: ubuntu:22.04 - commands: - - apt-get update - - apt-get install -y git - - git fetch --tags - -- name: build - pull: default - image: rancher/dapper:v0.5.3 - commands: - - dapper ci - volumes: - - name: socket - path: /var/run/docker.sock - -- name: codecov - image: robertstettner/drone-codecov - settings: - token: - from_secret: CODECOV_TOKEN - debug: true - -- name: fossa - image: registry.suse.com/bci/bci-base:15.6 - failure: ignore - environment: - FOSSA_API_KEY: - from_secret: FOSSA_API_KEY - commands: - - zypper -n install curl unzip - - "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/spectrometer/master/install.sh | sh" - - fossa analyze - - fossa test - when: - instance: - - drone-publish.longhorn.io - ref: - include: - - "refs/heads/master" - event: - - push - - tag - -- name: publish-image - image: plugins/docker - settings: - build_args: - - ARCH=amd64 - custom_dns: 1.1.1.1 - dockerfile: package/Dockerfile - password: - from_secret: docker_password - repo: longhornio/backing-image-manager - tag: "${DRONE_BRANCH}-head-amd64" - username: - from_secret: docker_username - when: - event: - - push - instance: - - drone-publish.longhorn.io - -- name: publish-tagged-image - image: plugins/docker - settings: - build_args: - - ARCH=amd64 - custom_dns: 1.1.1.1 - dockerfile: package/Dockerfile - password: - from_secret: docker_password - repo: longhornio/backing-image-manager - tag: "${DRONE_TAG}-amd64" - username: - from_secret: docker_username - when: - event: - - tag - instance: - - drone-publish.longhorn.io - -- name: slack_notify - image: plugins/slack - settings: - template: "Build {{build.link}} failed.\n" - username: Drone_Publish - webhook: - from_secret: slack_webhook - when: - event: - exclude: - - pull_request - instance: - include: - - drone-publish.longhorn.io - status: - - failure - -volumes: -- name: socket - host: - path: /var/run/docker.sock ---- - -kind: pipeline -name: default-arm64 - -platform: - os: linux - arch: arm64 - -trigger: - branch: - - master - - main - - v* - -steps: -- name: fetch - image: ubuntu:22.04 - commands: - - apt-get update - - apt-get install -y git - - git fetch --tags - -- name: build - pull: default - image: rancher/dapper:v0.5.3 - commands: - - dapper ci - volumes: - - name: socket - path: /var/run/docker.sock - -- name: publish-image - image: plugins/docker - settings: - build_args: - - ARCH=arm64 - custom_dns: 1.1.1.1 - dockerfile: package/Dockerfile - password: - from_secret: docker_password - repo: longhornio/backing-image-manager - tag: "${DRONE_BRANCH}-head-arm64" - username: - from_secret: docker_username - when: - event: - - push - instance: - - drone-publish.longhorn.io - -- name: publish-tagged-image - image: plugins/docker - settings: - build_args: - - ARCH=arm64 - custom_dns: 1.1.1.1 - dockerfile: package/Dockerfile - password: - from_secret: docker_password - repo: longhornio/backing-image-manager - tag: "${DRONE_TAG}-arm64" - username: - from_secret: docker_username - when: - event: - - tag - instance: - - drone-publish.longhorn.io - -- name: slack_notify - image: plugins/slack - settings: - template: "Build {{build.link}} failed.\n" - username: Drone_Publish - webhook: - from_secret: slack_webhook - when: - event: - exclude: - - pull_request - instance: - include: - - drone-publish.longhorn.io - status: - - failure - -volumes: -- name: socket - host: - path: /var/run/docker.sock ---- -kind: pipeline -name: manifest - -platform: - os: linux - arch: amd64 - -trigger: - event: - exclude: - - pull_request - branch: - - master - - main - - v* - -steps: -- name: manifest - image: plugins/manifest:1 - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - platforms: - - linux/amd64 - - linux/arm64 - target: "longhornio/backing-image-manager:${DRONE_BRANCH}-head" - template: "longhornio/backing-image-manager:${DRONE_BRANCH}-head-ARCH" - when: - instance: - - drone-publish.longhorn.io - event: - - push - -- name: manifest-tag - image: plugins/manifest:1 - settings: - username: - from_secret: docker_username - password: - from_secret: docker_password - platforms: - - linux/amd64 - - linux/arm64 - target: "longhornio/backing-image-manager:${DRONE_TAG}" - template: "longhornio/backing-image-manager:${DRONE_TAG}-ARCH" - when: - instance: - - drone-publish.longhorn.io - event: - - tag - -depends_on: -- default-amd64 -- default-arm64 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 ccc19407..2ca396fc 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 b0ac0a1d..11c811bf 100644 --- a/package/Dockerfile +++ b/package/Dockerfile @@ -1,16 +1,24 @@ +# syntax=docker/dockerfile:1.7.1 + FROM registry.suse.com/bci/bci-base:15.6 -ARG ARCH=amd64 +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 df231045..4a58819d 100755 --- a/scripts/build +++ b/scripts/build @@ -1,12 +1,12 @@ #!/bin/bash -set -e +set -ex source $(dirname $0)/version LINKFLAGS="-X main.Version=$VERSION -X main.GitCommit=$GITCOMMIT - -X main.BuildDate=$BUILDDATE - -linkmode external -extldflags -static" + -X main.BuildDate=$BUILDDATE" +[ "$(uname)" != "Darwin" ] && OTHER_LINKFLAGS="-extldflags -static" # add coverage flags if there is no tag and it's on master or a version branch like v1.6.x COMMIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) @@ -19,4 +19,8 @@ fi cd $(dirname $0)/.. mkdir -p bin -go build -o bin/backing-image-manager -ldflags "$LINKFLAGS" $COVER $COVERPKG + +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" $COVER $COVERPKG +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}