@ -27,11 +27,16 @@ jobs:
if : ${{ github.ref_type == 'branch' }}
docker-build:
permissions:
packages : write
contents : read
attestations : write
id-token : write
runs-on : ubuntu-24.04
timeout-minutes : 120
needs : skip_check
if : ${{ needs.skip_check.outputs.should_skip != 'true' && github.repository == 'dani-garcia/vaultwarden' }}
# Start a local docker registry to extract the final Alpine static build binaries
# Start a local docker registry to extract the compiled binaries to upload as artifacts and attest them
services:
registry:
image : registry:2
@ -63,7 +68,7 @@ jobs:
fetch-depth : 0
- name : Initialize QEMU binfmt support
uses : docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2 .0
uses : docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3 .0
with:
platforms : "arm64,arm"
@ -159,13 +164,13 @@ jobs:
#
- name : Add localhost registry
if : ${{ matrix.base_image == 'alpine' }}
shell : bash
run : |
echo "CONTAINER_REGISTRIES=${CONTAINER_REGISTRIES:+${CONTAINER_REGISTRIES},}localhost:5000/vaultwarden/server" | tee -a "${GITHUB_ENV}"
- name : Bake ${{ matrix.base_image }} containers
uses : docker/bake-action@3fc70e1131fee40a422dd8dd0ff22014ae20a1f3 # v5.11.0
id : bake_vw
uses : docker/bake-action@5ca506d06f70338a4968df87fd8bfee5cbfb84c7 # v6.0.0
env:
BASE_TAGS : "${{ env.BASE_TAGS }}"
SOURCE_COMMIT : "${{ env.SOURCE_COMMIT }}"
@ -181,10 +186,59 @@ jobs:
*.cache-from=${{ env.BAKE_CACHE_FROM }}
*.cache-to=${{ env.BAKE_CACHE_TO }}
# Attest Debian
- name : Attest - docker.io - Debian
if : ${{ env.HAVE_DOCKERHUB_LOGIN == 'true' && matrix.base_image == 'debian' && steps.bake_vw.outputs.metadata != ''}}
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-name : ${{ vars.DOCKERHUB_REPO }}
subject-digest : ${{ fromJSON(steps.bake_vw.outputs.metadata).debian-multi['containerimage.digest'] }}
push-to-registry : true
- name : Attest - ghcr.io - Debian
if : ${{ env.HAVE_GHCR_LOGIN == 'true' && matrix.base_image == 'debian' && steps.bake_vw.outputs.metadata != ''}}
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-name : ${{ vars.GHCR_REPO }}
subject-digest : ${{ fromJSON(steps.bake_vw.outputs.metadata).debian-multi['containerimage.digest'] }}
push-to-registry : true
- name : Attest - quay.io - Debian
if : ${{ env.HAVE_QUAY_LOGIN == 'true' && matrix.base_image == 'debian' && steps.bake_vw.outputs.metadata != ''}}
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-name : ${{ vars.QUAY_REPO }}
subject-digest : ${{ fromJSON(steps.bake_vw.outputs.metadata).debian-multi['containerimage.digest'] }}
push-to-registry : true
# Attest Alpine
- name : Attest - docker.io - Alpine
if : ${{ env.HAVE_DOCKERHUB_LOGIN == 'true' && matrix.base_image == 'alpine' && steps.bake_vw.outputs.metadata != ''}}
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-name : ${{ vars.DOCKERHUB_REPO }}
subject-digest : ${{ fromJSON(steps.bake_vw.outputs.metadata).alpine-multi['containerimage.digest'] }}
push-to-registry : true
- name : Attest - ghcr.io - Alpine
if : ${{ env.HAVE_GHCR_LOGIN == 'true' && matrix.base_image == 'alpine' && steps.bake_vw.outputs.metadata != ''}}
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-name : ${{ vars.GHCR_REPO }}
subject-digest : ${{ fromJSON(steps.bake_vw.outputs.metadata).alpine-multi['containerimage.digest'] }}
push-to-registry : true
- name : Attest - quay.io - Alpine
if : ${{ env.HAVE_QUAY_LOGIN == 'true' && matrix.base_image == 'alpine' && steps.bake_vw.outputs.metadata != ''}}
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-name : ${{ vars.QUAY_REPO }}
subject-digest : ${{ fromJSON(steps.bake_vw.outputs.metadata).alpine-multi['containerimage.digest'] }}
push-to-registry : true
# Extract the Alpine binaries from the containers
- name : Extract binaries
if : ${{ matrix.base_image == 'alpine' }}
shell : bash
run : |
# Check which main tag we are going to build determined by github.ref_type
@ -194,59 +248,65 @@ jobs:
EXTRACT_TAG="testing"
fi
# Check which base_image was used and append -alpine if needed
if [[ "${{ matrix.base_image }}" == "alpine" ]]; then
EXTRACT_TAG="${EXTRACT_TAG}-alpine"
fi
# After each extraction the image is removed.
# This is needed because using different platforms doesn't trigger a new pull/download
# Extract amd64 binary
docker create --name amd64 --platform=linux/amd64 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine"
docker cp amd64:/vaultwarden vaultwarden-amd64
docker create --name amd64 --platform=linux/amd64 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
docker cp amd64:/vaultwarden vaultwarden-amd64-${{ matrix.base_image }}
docker rm --force amd64
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
# Extract arm64 binary
docker create --name arm64 --platform=linux/arm64 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker cp arm64:/vaultwarden vaultwarden-arm64
docker create --name arm64 --platform=linux/arm64 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
docker cp arm64:/vaultwarden vaultwarden-arm64-${{ matrix.base_image }}
docker rm --force arm64
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
# Extract armv7 binary
docker create --name armv7 --platform=linux/arm/v7 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker cp armv7:/vaultwarden vaultwarden-armv7
docker create --name armv7 --platform=linux/arm/v7 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
docker cp armv7:/vaultwarden vaultwarden-armv7-${{ matrix.base_image }}
docker rm --force armv7
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
# Extract armv6 binary
docker create --name armv6 --platform=linux/arm/v6 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker cp armv6:/vaultwarden vaultwarden-armv6
docker create --name armv6 --platform=linux/arm/v6 "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
docker cp armv6:/vaultwarden vaultwarden-armv6-${{ matrix.base_image }}
docker rm --force armv6
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}-alpine "
docker rmi --force "localhost:5000/vaultwarden/server:${EXTRACT_TAG}"
# Upload artifacts to Github Actions
- name : "Upload amd64 artifact"
# Upload artifacts to Github Actions and Attest the binaries
- name : "Upload amd64 artifact ${{ matrix.base_image }} "
uses : actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b #v4.5.0
if : ${{ matrix.base_image == 'alpine' }}
with:
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-amd64
path : vaultwarden-amd64
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-amd64-${{ matrix.base_image }}
path : vaultwarden-amd64-${{ matrix.base_image }}
- name : "Upload arm64 artifact"
- name : "Upload arm64 artifact ${{ matrix.base_image }} "
uses : actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b #v4.5.0
if : ${{ matrix.base_image == 'alpine' }}
with:
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-arm64
path : vaultwarden-arm64
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-arm64-${{ matrix.base_image }}
path : vaultwarden-arm64-${{ matrix.base_image }}
- name : "Upload armv7 artifact"
- name : "Upload armv7 artifact ${{ matrix.base_image }} "
uses : actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b #v4.5.0
if : ${{ matrix.base_image == 'alpine' }}
with:
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-armv7
path : vaultwarden-armv7
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-armv7-${{ matrix.base_image }}
path : vaultwarden-armv7-${{ matrix.base_image }}
- name : "Upload armv6 artifact"
- name : "Upload armv6 artifact ${{ matrix.base_image }} "
uses : actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b #v4.5.0
if : ${{ matrix.base_image == 'alpine' }}
with:
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-armv6
path : vaultwarden-armv6
name : vaultwarden-${{ env.SOURCE_VERSION }}-linux-armv6-${{ matrix.base_image }}
path : vaultwarden-armv6-${{ matrix.base_image }}
- name : "Attest artifacts ${{ matrix.base_image }}"
uses : actions/attest-build-provenance@7668571508540a607bdfd90a87a560489fe372eb # v2.1.0
with:
subject-path : vaultwarden-*
# End Upload artifacts to Github Actions