name: Release on: release: types: [published] workflow_dispatch: inputs: build_browser_extensions: description: 'Build browser extensions' required: false default: true type: boolean build_mobile_apps: description: 'Build mobile apps' required: false default: true type: boolean build_multi_container: description: 'Build and push multi-container images' required: false default: true type: boolean build_all_in_one: description: 'Build and push all-in-one image' required: false default: true type: boolean jobs: upload-install-script: runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Upload install.sh to release if: github.event_name == 'release' uses: softprops/action-gh-release@v2 with: files: install.sh token: ${{ secrets.GITHUB_TOKEN }} build-chrome-extension: if: github.event_name == 'release' || inputs.build_browser_extensions runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Build Chrome Extension uses: ./.github/actions/build-browser-extension with: browser: chrome upload_to_release: ${{ github.event_name == 'release' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build-firefox-extension: if: github.event_name == 'release' || inputs.build_browser_extensions runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Build Firefox Extension uses: ./.github/actions/build-browser-extension with: browser: firefox upload_to_release: ${{ github.event_name == 'release' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build-edge-extension: if: github.event_name == 'release' || inputs.build_browser_extensions runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Build Edge Extension uses: ./.github/actions/build-browser-extension with: browser: edge upload_to_release: ${{ github.event_name == 'release' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} build-android-release: if: github.event_name == 'release' || inputs.build_mobile_apps runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Build Android App uses: ./.github/actions/build-android-app with: signed: true upload_to_release: ${{ github.event_name == 'release' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} build-and-push-docker-multi-container: if: github.event_name == 'release' || inputs.build_multi_container runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository 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: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata for Postgres image id: postgres-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/postgres tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault PostgreSQL org.opencontainers.image.description=PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for API image id: api-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/api tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault API org.opencontainers.image.description=REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for Client image id: client-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/client tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault Client org.opencontainers.image.description=Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for Admin image id: admin-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/admin tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault Admin org.opencontainers.image.description=Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for Reverse Proxy image id: reverse-proxy-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/reverse-proxy tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault Reverse Proxy org.opencontainers.image.description=Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for SMTP image id: smtp-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/smtp tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault SMTP Service org.opencontainers.image.description=SMTP service for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=SMTP service for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for TaskRunner image id: task-runner-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/task-runner tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault TaskRunner org.opencontainers.image.description=Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) annotations: | org.opencontainers.image.description=Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) - name: Extract metadata for InstallCLI image id: installcli-meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: ghcr.io/aliasvault/installcli tags: | type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault Install CLI org.opencontainers.image.description=Installation and configuration CLI for AliasVault. Used by install.sh for setup and configuration, not deployed as part of the application stack annotations: | org.opencontainers.image.description=Installation and configuration CLI for AliasVault. Used by install.sh for setup and configuration, not deployed as part of the application stack - name: Build and push Postgres image uses: docker/build-push-action@v6 with: context: . file: apps/server/Databases/AliasServerDb/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.postgres-meta.outputs.tags }} labels: ${{ steps.postgres-meta.outputs.labels }} annotations: ${{ steps.postgres-meta.outputs.annotations }} - name: Build and push API image uses: docker/build-push-action@v6 with: context: . file: apps/server/AliasVault.Api/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.api-meta.outputs.tags }} labels: ${{ steps.api-meta.outputs.labels }} annotations: ${{ steps.api-meta.outputs.annotations }} - name: Build and push Client image uses: docker/build-push-action@v6 with: context: . file: apps/server/AliasVault.Client/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.client-meta.outputs.tags }} labels: ${{ steps.client-meta.outputs.labels }} annotations: ${{ steps.client-meta.outputs.annotations }} - name: Build and push Admin image uses: docker/build-push-action@v6 with: context: . file: apps/server/AliasVault.Admin/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.admin-meta.outputs.tags }} labels: ${{ steps.admin-meta.outputs.labels }} annotations: ${{ steps.admin-meta.outputs.annotations }} - name: Build and push Reverse Proxy image uses: docker/build-push-action@v6 with: context: . file: apps/server/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.reverse-proxy-meta.outputs.tags }} labels: ${{ steps.reverse-proxy-meta.outputs.labels }} annotations: ${{ steps.reverse-proxy-meta.outputs.annotations }} - name: Build and push SMTP image uses: docker/build-push-action@v6 with: context: . file: apps/server/Services/AliasVault.SmtpService/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.smtp-meta.outputs.tags }} labels: ${{ steps.smtp-meta.outputs.labels }} annotations: ${{ steps.smtp-meta.outputs.annotations }} - name: Build and push TaskRunner image uses: docker/build-push-action@v6 with: context: . file: apps/server/Services/AliasVault.TaskRunner/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.task-runner-meta.outputs.tags }} labels: ${{ steps.task-runner-meta.outputs.labels }} annotations: ${{ steps.task-runner-meta.outputs.annotations }} - name: Build and push InstallCli image uses: docker/build-push-action@v6 with: context: . file: apps/server/Utilities/AliasVault.InstallCli/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.installcli-meta.outputs.tags }} labels: ${{ steps.installcli-meta.outputs.labels }} annotations: ${{ steps.installcli-meta.outputs.annotations }} build-and-push-docker-all-in-one: if: github.event_name == 'release' || inputs.build_all_in_one runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout repository 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: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Extract metadata for all-in-one image id: meta uses: docker/metadata-action@v5 env: DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index with: images: | ghcr.io/aliasvault/aliasvault aliasvault/aliasvault tags: | # For release events with latest tag (only for non-prerelease) type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }} # semver tags for releases (works for prerelease and normal release) type=semver,pattern={{version}},enable=${{ github.event_name == 'release' || github.ref_type == 'tag' }} # For tags, use tag name type=ref,event=tag,enable=${{ github.ref_type == 'tag' }} # For branches, use branch name and branch name + short SHA for uniqueness type=ref,event=branch,enable=${{ github.ref_type == 'branch' }} type=raw,value={{branch}}-{{sha}},enable=${{ github.ref_type == 'branch' }} labels: | org.opencontainers.image.title=AliasVault All-in-One org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net). annotations: | org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net). - name: Build and push all-in-one image uses: docker/build-push-action@v6 with: context: . file: dockerfiles/all-in-one/Dockerfile platforms: linux/amd64,linux/arm64/v8 push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} annotations: ${{ steps.meta.outputs.annotations }}