diff --git a/.github/workflows/build-and-release.yml.yml b/.github/workflows/build-and-release.yml.yml index a972e8c34..e1dac98e2 100644 --- a/.github/workflows/build-and-release.yml.yml +++ b/.github/workflows/build-and-release.yml.yml @@ -21,6 +21,8 @@ jobs: # This job builds and pushes a multi-arch Docker image to GitHub Container Registry. build-docker: runs-on: ${{ matrix.runner }} + env: + VARIANT: default strategy: fail-fast: true matrix: @@ -30,8 +32,10 @@ jobs: include: - platform: linux/amd64 runner: ubuntu-latest + platform_pair: linux-amd64 - platform: linux/arm64 runner: ubuntu-24.04-arm + platform_pair: linux-arm64 name: Build and Push Docker Image steps: - name: Checkout code @@ -39,8 +43,7 @@ jobs: - name: Prepare run: | - platform=${{ matrix.platform }} - echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + echo "PLATFORM_PAIR=${{ matrix.platform_pair }}" >> $GITHUB_ENV - name: Docker meta id: meta @@ -69,8 +72,9 @@ jobs: file: ./Dockerfile platforms: ${{ matrix.platform }} labels: ${{ steps.meta.outputs.labels }} - tags: ${{ env.REGISTRY_IMAGE }} - outputs: type=image,push-by-digest=true,name-canonical=true,push=true + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + build-args: | + ENABLE_EXPERIMENTAL=false cache-from: type=gha cache-to: type=gha,mode=max @@ -83,7 +87,87 @@ jobs: - name: Upload digest uses: actions/upload-artifact@v5 with: - name: digests-${{ env.PLATFORM_PAIR }} + name: digests-${{ env.VARIANT }}-${{ matrix.platform_pair }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + build-docker-experimental: + runs-on: ${{ matrix.runner }} + env: + VARIANT: experimental + strategy: + fail-fast: true + matrix: + platform: + - linux/amd64 + - linux/arm64 + include: + - platform: linux/amd64 + runner: ubuntu-latest + platform_pair: linux-amd64 + - platform: linux/arm64 + runner: ubuntu-24.04-arm + platform_pair: linux-arm64 + name: Build and Push Experimental Docker Image + steps: + - name: Checkout code + uses: actions/checkout@v5 + + - name: Prepare + run: | + echo "PLATFORM_PAIR=${{ matrix.platform_pair }}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=ref,event=branch,suffix=-experimental + type=ref,event=pr,suffix=-experimental + type=semver,pattern={{version}},suffix=-experimental + type=semver,pattern={{major}}.{{minor}},suffix=-experimental + type=raw,value=experimental + type=raw,value=latest-experimental,enable={{is_default_branch}} + + - name: Set up QEMU for multi-arch builds + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: docker.io + username: ${{ vars.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build and push experimental Docker image + uses: docker/build-push-action@v6 + id: build + with: + context: . + file: ./Dockerfile + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + ENABLE_EXPERIMENTAL=true + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v5 + with: + name: digests-${{ env.VARIANT }}-${{ matrix.platform_pair }} path: ${{ runner.temp }}/digests/* if-no-files-found: error retention-days: 1 @@ -97,7 +181,7 @@ jobs: uses: actions/download-artifact@v6 with: path: ${{ runner.temp }}/digests - pattern: digests-* + pattern: digests-default-* merge-multiple: true - name: Login to Docker Hub @@ -129,4 +213,48 @@ jobs: - name: Inspect image run: | - docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} \ No newline at end of file + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} + + merge-experimental: + runs-on: ubuntu-latest + needs: + - build-docker-experimental + steps: + - name: Download digests + uses: actions/download-artifact@v6 + with: + path: ${{ runner.temp }}/digests + pattern: digests-experimental-* + merge-multiple: true + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ vars.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=ref,event=branch,suffix=-experimental + type=ref,event=pr,suffix=-experimental + type=semver,pattern={{version}},suffix=-experimental + type=semver,pattern={{major}}.{{minor}},suffix=-experimental + type=raw,value=experimental + type=raw,value=latest-experimental,enable={{is_default_branch}} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:experimental diff --git a/Dockerfile b/Dockerfile index a98c37f51..1b3a3eb71 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,15 @@ RUN apt-get update && apt-get install -y \ # Copy source code COPY . . -# Build the application without experimental features -RUN cargo build --release --bin embucketd --no-default-features +# Build the application, optionally enabling experimental features +ARG ENABLE_EXPERIMENTAL=false +RUN if [ "$ENABLE_EXPERIMENTAL" = "true" ]; then \ + echo "Building embucketd with experimental features enabled"; \ + cargo build --release --bin embucketd --features experimental; \ + else \ + echo "Building embucketd without experimental features"; \ + cargo build --release --bin embucketd --no-default-features; \ + fi # Stage 4: Final runtime image FROM gcr.io/distroless/cc-debian12 AS runtime