Skip to content

Extract and Release Vaultwarden Binaries #505

Extract and Release Vaultwarden Binaries

Extract and Release Vaultwarden Binaries #505

name: Extract and Release Vaultwarden Binaries
on:
workflow_dispatch:
schedule:
- cron: '0 */8 * * *'
permissions:
contents: write
packages: write
jobs:
check-and-prepare:
runs-on: ubuntu-latest
outputs:
release_version: ${{ steps.get_version.outputs.RELEASE_VERSION }}
release_exists: ${{ steps.check_release.outputs.exists }}
release_id: ${{ steps.get_release_id.outputs.RELEASE_ID }}
steps:
- name: Get latest release version
id: get_version
run: |
LATEST_RELEASE=$(curl -s https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest | jq -r .tag_name)
echo "RELEASE_VERSION=${LATEST_RELEASE}" >> $GITHUB_OUTPUT
- name: Check if release exists
id: check_release
run: |
RELEASE_TAG="${{ steps.get_version.outputs.RELEASE_VERSION }}-extracted"
RELEASE_EXISTS=$(curl -s -o /dev/null -w "%{http_code}" https://api.github.com/repos/${{ github.repository }}/releases/tags/${RELEASE_TAG})
if [ "$RELEASE_EXISTS" = "200" ]; then
echo "Release already exists, skipping creation"
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "Release does not exist, will create"
echo "exists=false" >> $GITHUB_OUTPUT
fi
- name: Get Release ID
id: get_release_id
if: steps.check_release.outputs.exists == 'true'
run: |
RELEASE_TAG="${{ steps.get_version.outputs.RELEASE_VERSION }}-extracted"
RELEASE_ID=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/tags/${RELEASE_TAG} | jq -r .id)
echo "RELEASE_ID=${RELEASE_ID}" >> $GITHUB_OUTPUT
extract-and-release:
needs: check-and-prepare
if: needs.check-and-prepare.outputs.release_exists == 'false'
runs-on: ubuntu-latest
strategy:
matrix:
include:
- arch: amd64
platform: linux/amd64
- arch: arm64
platform: linux/arm64
- arch: armv7
platform: linux/arm/v7
- arch: armv6
platform: linux/arm/v6
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Extract Docker image
run: |
CONTAINER_ID=$(docker create --platform ${{ matrix.platform }} vaultwarden/server:latest-alpine)
mkdir -p extracted-${{ matrix.arch }}
docker cp $CONTAINER_ID:/vaultwarden extracted-${{ matrix.arch }}/
docker cp $CONTAINER_ID:/web-vault extracted-${{ matrix.arch }}/
docker rm $CONTAINER_ID
- name: Zip extracted files
run: |
cd extracted-${{ matrix.arch }}
zip -r ../vaultwarden-linux-${{ matrix.arch }}-extracted.zip vaultwarden web-vault
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: vaultwarden-linux-${{ matrix.arch }}-extracted
path: vaultwarden-linux-${{ matrix.arch }}-extracted.zip
create-release:
needs: [check-and-prepare, extract-and-release]
if: needs.check-and-prepare.outputs.release_exists == 'false'
runs-on: ubuntu-latest
steps:
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ needs.check-and-prepare.outputs.release_version }}-extracted
name: Extracted Binaries ${{ needs.check-and-prepare.outputs.release_version }}
body: |
This release contains extracted binaries from the Vaultwarden Docker images for multiple Linux architectures.
Original release: https://github.com/dani-garcia/vaultwarden/releases/tag/${{ needs.check-and-prepare.outputs.release_version }}
draft: false
prerelease: false
- name: Download all artifacts
uses: actions/download-artifact@v4
- name: Upload Release Assets
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
for arch in amd64 arm64 armv7 armv6; do
asset_path="vaultwarden-linux-${arch}-extracted/vaultwarden-linux-${arch}-extracted.zip"
asset_name="vaultwarden-linux-${arch}-extracted.zip"
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/zip" \
-T "${asset_path}" \
"https://uploads.github.com/repos/${{ github.repository }}/releases/${{ steps.create_release.outputs.id }}/assets?name=${asset_name}"
done
update-existing-release:
needs: check-and-prepare
if: needs.check-and-prepare.outputs.release_exists == 'true'
runs-on: ubuntu-latest
strategy:
matrix:
include:
- arch: amd64
platform: linux/amd64
- arch: arm64
platform: linux/arm64
- arch: armv7
platform: linux/arm/v7
- arch: armv6
platform: linux/arm/v6
steps:
- name: Check if asset exists
id: check_asset
run: |
ASSET_NAME="vaultwarden-linux-${{ matrix.arch }}-extracted.zip"
ASSET_EXISTS=$(curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/${{ github.repository }}/releases/${{ needs.check-and-prepare.outputs.release_id }}/assets?name=${ASSET_NAME})
if [ "$ASSET_EXISTS" = "200" ]; then
echo "Asset already exists, skipping extraction and upload"
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "Asset does not exist, will extract and upload"
echo "exists=false" >> $GITHUB_OUTPUT
fi
- name: Checkout code
if: steps.check_asset.outputs.exists == 'false'
uses: actions/checkout@v4
- name: Set up QEMU
if: steps.check_asset.outputs.exists == 'false'
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
if: steps.check_asset.outputs.exists == 'false'
uses: docker/setup-buildx-action@v3
- name: Extract Docker image
if: steps.check_asset.outputs.exists == 'false'
run: |
CONTAINER_ID=$(docker create --platform ${{ matrix.platform }} vaultwarden/server:latest-alpine)
mkdir -p extracted-${{ matrix.arch }}
docker cp $CONTAINER_ID:/vaultwarden extracted-${{ matrix.arch }}/
docker cp $CONTAINER_ID:/web-vault extracted-${{ matrix.arch }}/
docker rm $CONTAINER_ID
- name: Zip extracted files
if: steps.check_asset.outputs.exists == 'false'
run: |
cd extracted-${{ matrix.arch }}
zip -r ../vaultwarden-linux-${{ matrix.arch }}-extracted.zip vaultwarden web-vault
- name: Upload Release Asset
if: steps.check_asset.outputs.exists == 'false'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/zip" \
-T "vaultwarden-linux-${{ matrix.arch }}-extracted.zip" \
"https://uploads.github.com/repos/${{ github.repository }}/releases/${{ needs.check-and-prepare.outputs.release_id }}/assets?name=vaultwarden-linux-${{ matrix.arch }}-extracted.zip"