Files
plane/.github/workflows/build-branch.yml
Sriram Veeraghanta 1d9def5d0b chore(ci): build images natively per architecture and merge by digest
Every image in Branch Build CE now builds one platform per job on a runner
native to that architecture, pushes an untagged manifest addressed by digest,
and is stitched into the tagged multi-arch index by a paired merge job.

arm64 was previously produced either under QEMU emulation or on the shared
makeplane/plane-dev Docker Build Cloud builder. Both paths are gone: the
buildx driver is pinned to the local docker-container driver, since a leg
building its own architecture natively gains nothing from a remote builder.

Notable details:

- cache-scope-suffix is set per architecture. The registry cache manifest is
  not platform-indexed, so both legs writing :buildcache would overwrite each
  other and roughly half the legs would go cold every run.
- The merge asserts the platform set. A merge that produced a single-platform
  index still exits 0, so it is checked rather than assumed.
- AIO asset generation is split into its own job. Run inside a matrix, both
  legs would collide on the aio-assets-dist artifact name and could embed
  different generated content under a single manifest tag.
- Jobs that consume an image by tag (AIO, upload_build_assets,
  publish_release) now depend on the merge jobs. The tags do not exist until
  the merge runs.

Nothing externally visible changes: the images carry the same names and the
same tags.

Claude-Session: https://claude.ai/code/session_01U45dsLe5GFmTsfpifuNcGQ
2026-08-23 20:26:38 +05:30

653 lines
28 KiB
YAML

name: Branch Build CE
on:
workflow_dispatch:
inputs:
build_type:
description: "Type of build to run"
required: true
type: choice
default: "Build"
options:
- "Build"
- "Release"
releaseVersion:
description: "Release Version"
type: string
default: v0.0.0
isPrerelease:
description: "Is Pre-release"
type: boolean
default: false
required: true
arm64:
description: "Build for ARM64 architecture"
required: false
default: false
type: boolean
aio_build:
description: "Build for AIO docker image"
required: false
default: false
type: boolean
push:
branches:
- preview
- canary
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
TARGET_BRANCH: ${{ github.ref_name }}
ARM64_BUILD: ${{ github.event.inputs.arm64 }}
BUILD_TYPE: ${{ github.event.inputs.build_type }}
RELEASE_VERSION: ${{ github.event.inputs.releaseVersion }}
IS_PRERELEASE: ${{ github.event.inputs.isPrerelease }}
AIO_BUILD: ${{ github.event.inputs.aio_build }}
jobs:
branch_build_setup:
name: Build Setup
runs-on: ubuntu-24.04
outputs:
gh_branch_name: ${{ steps.set_env_variables.outputs.TARGET_BRANCH }}
# Per-architecture native build matrix. Every image builds one platform per
# job on a runner native to it, so there is no single buildx driver/platform
# pair for the run and no Docker Build Cloud endpoint.
gh_build_matrix: ${{ steps.set_env_variables.outputs.BUILD_MATRIX }}
gh_expected_platforms: ${{ steps.set_env_variables.outputs.EXPECTED_PLATFORMS }}
dh_img_web: ${{ steps.set_env_variables.outputs.DH_IMG_WEB }}
dh_img_space: ${{ steps.set_env_variables.outputs.DH_IMG_SPACE }}
dh_img_admin: ${{ steps.set_env_variables.outputs.DH_IMG_ADMIN }}
dh_img_live: ${{ steps.set_env_variables.outputs.DH_IMG_LIVE }}
dh_img_backend: ${{ steps.set_env_variables.outputs.DH_IMG_BACKEND }}
dh_img_proxy: ${{ steps.set_env_variables.outputs.DH_IMG_PROXY }}
dh_img_aio: ${{ steps.set_env_variables.outputs.DH_IMG_AIO }}
build_type: ${{steps.set_env_variables.outputs.BUILD_TYPE}}
build_release: ${{ steps.set_env_variables.outputs.BUILD_RELEASE }}
build_prerelease: ${{ steps.set_env_variables.outputs.BUILD_PRERELEASE }}
release_version: ${{ steps.set_env_variables.outputs.RELEASE_VERSION }}
aio_build: ${{ steps.set_env_variables.outputs.AIO_BUILD }}
steps:
- id: set_env_variables
name: Set Environment Variables
run: |
# One runner per architecture. arm64 is built natively rather than under
# emulation, so there is no cloud builder and no QEMU leg. Both labels are
# GitHub-hosted 4 vCPU / 16 GB instances, so a single matrix covers the
# JS monorepo images as well as the light ones.
AMD64='{"arch":"amd64","platform":"linux/amd64","runner":"ubuntu-24.04"}'
ARM64='{"arch":"arm64","platform":"linux/arm64","runner":"ubuntu-24.04-arm"}'
if [ "${{ env.ARM64_BUILD }}" == "true" ] || ([ "${{ env.BUILD_TYPE }}" == "Release" ] && [ "${{ env.IS_PRERELEASE }}" != "true" ]); then
echo "BUILD_MATRIX=[${AMD64},${ARM64}]" >> $GITHUB_OUTPUT
echo "EXPECTED_PLATFORMS=linux/amd64,linux/arm64" >> $GITHUB_OUTPUT
else
echo "BUILD_MATRIX=[${AMD64}]" >> $GITHUB_OUTPUT
echo "EXPECTED_PLATFORMS=linux/amd64" >> $GITHUB_OUTPUT
fi
BR_NAME=$( echo "${{ env.TARGET_BRANCH }}" |sed 's/[^a-zA-Z0-9.-]//g')
echo "TARGET_BRANCH=$BR_NAME" >> $GITHUB_OUTPUT
echo "DH_IMG_WEB=plane-frontend" >> $GITHUB_OUTPUT
echo "DH_IMG_SPACE=plane-space" >> $GITHUB_OUTPUT
echo "DH_IMG_ADMIN=plane-admin" >> $GITHUB_OUTPUT
echo "DH_IMG_LIVE=plane-live" >> $GITHUB_OUTPUT
echo "DH_IMG_BACKEND=plane-backend" >> $GITHUB_OUTPUT
echo "DH_IMG_PROXY=plane-proxy" >> $GITHUB_OUTPUT
echo "DH_IMG_AIO=plane-aio-community" >> $GITHUB_OUTPUT
echo "BUILD_TYPE=${{env.BUILD_TYPE}}" >> $GITHUB_OUTPUT
BUILD_RELEASE=false
BUILD_PRERELEASE=false
RELVERSION="latest"
BUILD_AIO=${{ env.AIO_BUILD }}
if [ "${{ env.BUILD_TYPE }}" == "Release" ]; then
FLAT_RELEASE_VERSION=$(echo "${{ env.RELEASE_VERSION }}" | sed 's/[^a-zA-Z0-9.-]//g')
echo "FLAT_RELEASE_VERSION=${FLAT_RELEASE_VERSION}" >> $GITHUB_OUTPUT
semver_regex="^v([0-9]+)\.([0-9]+)\.([0-9]+)(-[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)?$"
if [[ ! $FLAT_RELEASE_VERSION =~ $semver_regex ]]; then
echo "Invalid Release Version Format : $FLAT_RELEASE_VERSION"
echo "Please provide a valid SemVer version"
echo "e.g. v1.2.3 or v1.2.3-alpha-1"
echo "Exiting the build process"
exit 1 # Exit with status 1 to fail the step
fi
BUILD_RELEASE=true
RELVERSION=$FLAT_RELEASE_VERSION
if [ "${{ env.IS_PRERELEASE }}" == "true" ]; then
BUILD_PRERELEASE=true
fi
BUILD_AIO=true
fi
echo "BUILD_RELEASE=${BUILD_RELEASE}" >> $GITHUB_OUTPUT
echo "BUILD_PRERELEASE=${BUILD_PRERELEASE}" >> $GITHUB_OUTPUT
echo "RELEASE_VERSION=${RELVERSION}" >> $GITHUB_OUTPUT
echo "AIO_BUILD=${BUILD_AIO}" >> $GITHUB_OUTPUT
- id: checkout_files
name: Checkout Files
uses: actions/checkout@v6
# Native per-architecture image builds.
#
# Each branch_build_push_<image> job below builds ONE platform on a runner
# native to it and pushes an untagged manifest addressed only by its digest.
# The paired branch_merge_<image> job stitches those digests into the
# multi-arch manifest and applies the tags -- so any job consuming an image BY
# TAG must depend on the merge job, never the build job. GitHub does not warn
# when a needs: entry is missing; the dependent job simply runs early.
#
# buildx-driver is pinned to the local docker-container driver: each leg builds
# its own architecture natively, so a remote builder buys nothing. The Docker
# Build Cloud path (makeplane/plane-dev) is gone from this workflow rather than
# left as a no-op switch.
branch_build_push_admin:
name: Build-Push Admin Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
needs: [branch_build_setup]
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
steps:
- name: Admin Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_admin }}
build-context: .
dockerfile-path: ./apps/admin/Dockerfile.admin
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
# Without a per-arch cache ref the two legs overwrite each other's
# buildcache tag, since it is not platform-indexed.
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-admin-${{ matrix.arch }}
branch_merge_admin:
name: Merge Admin Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_admin]
steps:
- name: Merge Admin Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_admin }}
digest-artifact-pattern: digest-admin-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
branch_build_push_web:
name: Build-Push Web Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
needs: [branch_build_setup]
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
steps:
- name: Web Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_web }}
build-context: .
dockerfile-path: ./apps/web/Dockerfile.web
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
# Without a per-arch cache ref the two legs overwrite each other's
# buildcache tag, since it is not platform-indexed.
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-web-${{ matrix.arch }}
branch_merge_web:
name: Merge Web Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_web]
steps:
- name: Merge Web Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_web }}
digest-artifact-pattern: digest-web-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
branch_build_push_space:
name: Build-Push Space Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
needs: [branch_build_setup]
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
steps:
- name: Space Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_space }}
build-context: .
dockerfile-path: ./apps/space/Dockerfile.space
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
# Without a per-arch cache ref the two legs overwrite each other's
# buildcache tag, since it is not platform-indexed.
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-space-${{ matrix.arch }}
branch_merge_space:
name: Merge Space Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_space]
steps:
- name: Merge Space Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_space }}
digest-artifact-pattern: digest-space-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
branch_build_push_live:
name: Build-Push Live Collaboration Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
needs: [branch_build_setup]
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
steps:
- name: Live Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_live }}
build-context: .
dockerfile-path: ./apps/live/Dockerfile.live
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
# Without a per-arch cache ref the two legs overwrite each other's
# buildcache tag, since it is not platform-indexed.
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-live-${{ matrix.arch }}
branch_merge_live:
name: Merge Live Collaboration Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_live]
steps:
- name: Merge Live Collaboration Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_live }}
digest-artifact-pattern: digest-live-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
branch_build_push_api:
name: Build-Push API Server Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 60
needs: [branch_build_setup]
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
steps:
- name: Backend Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_backend }}
build-context: ./apps/api
dockerfile-path: ./apps/api/Dockerfile.api
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
# Without a per-arch cache ref the two legs overwrite each other's
# buildcache tag, since it is not platform-indexed.
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-api-${{ matrix.arch }}
branch_merge_api:
name: Merge API Server Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_api]
steps:
- name: Merge API Server Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_backend }}
digest-artifact-pattern: digest-api-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
branch_build_push_proxy:
name: Build-Push Proxy Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 60
needs: [branch_build_setup]
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
steps:
- name: Proxy Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_proxy }}
build-context: ./apps/proxy
dockerfile-path: ./apps/proxy/Dockerfile.ce
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
# Without a per-arch cache ref the two legs overwrite each other's
# buildcache tag, since it is not platform-indexed.
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-proxy-${{ matrix.arch }}
branch_merge_proxy:
name: Merge Proxy Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_proxy]
steps:
- name: Merge Proxy Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_proxy }}
digest-artifact-pattern: digest-proxy-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
# Split out of branch_build_push_aio: build.sh generates the dist/ assets and
# uploads them as one artifact. Run inside a matrix, both legs would collide on
# that artifact name and could embed different generated content under a single
# manifest tag. Generate once, consume twice.
prepare_aio_assets:
if: ${{ needs.branch_build_setup.outputs.aio_build == 'true' }}
name: Prepare AIO Assets
runs-on: ubuntu-24.04
timeout-minutes: 30
needs: [branch_build_setup]
outputs:
aio_build_version: ${{ steps.prepare_aio_assets.outputs.AIO_BUILD_VERSION }}
steps:
- name: Checkout Files
uses: actions/checkout@v6
- name: Prepare AIO Assets
id: prepare_aio_assets
run: |
cd deployments/aio/community
if [ "${{ needs.branch_build_setup.outputs.build_type }}" == "Release" ]; then
aio_version=${{ needs.branch_build_setup.outputs.release_version }}
else
aio_version=${{ needs.branch_build_setup.outputs.gh_branch_name }}
fi
bash ./build.sh --release $aio_version
echo "AIO_BUILD_VERSION=${aio_version}" >> $GITHUB_OUTPUT
- name: Upload AIO Assets
uses: actions/upload-artifact@v7
with:
path: ./deployments/aio/community/dist
name: aio-assets-dist
# AIO pulls the other images in by tag, so it needs the merge jobs -- the tags
# do not exist until the merges run.
branch_build_push_aio:
if: ${{ needs.branch_build_setup.outputs.aio_build == 'true' }}
name: Build-Push AIO Docker Image (${{ matrix.arch }})
runs-on: ${{ matrix.runner }}
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.branch_build_setup.outputs.gh_build_matrix) }}
needs:
- branch_build_setup
- prepare_aio_assets
- branch_merge_admin
- branch_merge_web
- branch_merge_space
- branch_merge_live
- branch_merge_api
- branch_merge_proxy
steps:
- name: AIO Build and Push
uses: makeplane/actions/build-push@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_aio }}
build-context: ./deployments/aio/community
dockerfile-path: ./deployments/aio/community/Dockerfile
buildx-driver: docker-container
buildx-version: latest
buildx-platforms: ${{ matrix.platform }}
buildx-endpoint: ""
push-by-digest: "true"
cache-scope-suffix: -${{ matrix.arch }}
digest-artifact-name: digest-aio-${{ matrix.arch }}
additional-assets: aio-assets-dist
additional-assets-dir: ./deployments/aio/community/dist
build-args: |
PLANE_VERSION=${{ needs.prepare_aio_assets.outputs.aio_build_version }}
branch_merge_aio:
name: Merge AIO Manifest
runs-on: ubuntu-24.04
timeout-minutes: 15
needs: [branch_build_setup, branch_build_push_aio]
steps:
- name: Merge AIO Manifest
uses: makeplane/actions/merge-manifest@v1.6.0
with:
build-release: ${{ needs.branch_build_setup.outputs.build_release }}
build-prerelease: ${{ needs.branch_build_setup.outputs.build_prerelease }}
release-version: ${{ needs.branch_build_setup.outputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
docker-image-owner: makeplane
docker-image-name: ${{ needs.branch_build_setup.outputs.dh_img_aio }}
digest-artifact-pattern: digest-aio-*
expected-platforms: ${{ needs.branch_build_setup.outputs.gh_expected_platforms }}
upload_build_assets:
name: Upload Build Assets
runs-on: ubuntu-24.04
needs:
- branch_build_setup
- branch_merge_admin
- branch_merge_web
- branch_merge_space
- branch_merge_live
- branch_merge_api
- branch_merge_proxy
steps:
- name: Checkout Files
uses: actions/checkout@v6
- name: Update Assets
run: |
if [ "${{ needs.branch_build_setup.outputs.build_type }}" == "Release" ]; then
REL_VERSION=${{ needs.branch_build_setup.outputs.release_version }}
else
REL_VERSION=${{ needs.branch_build_setup.outputs.gh_branch_name }}
fi
cp ./deployments/cli/community/install.sh deployments/cli/community/setup.sh
sed -i 's/${APP_RELEASE:-stable}/${APP_RELEASE:-'${REL_VERSION}'}/g' deployments/cli/community/docker-compose.yml
# sed -i 's/APP_RELEASE=stable/APP_RELEASE='${REL_VERSION}'/g' deployments/cli/community/variables.env
- name: Upload Assets
uses: actions/upload-artifact@v7
with:
name: community-assets
path: |
./deployments/cli/community/setup.sh
./deployments/cli/community/restore.sh
./deployments/cli/community/restore-airgapped.sh
./deployments/cli/community/docker-compose.yml
./deployments/cli/community/variables.env
./deployments/swarm/community/swarm.sh
publish_release:
# Deliberately NO status function here. The default success() gate is what
# stops a release when any image fails: a failed build leg skips its
# branch_merge_* job, and success() rejects a skipped need.
#
# That is also why branch_merge_aio is NOT in needs below. AIO runs last (it
# needs every other merge), the GitHub release ships no AIO artifact, and
# gating on it would let one flaky AIO leg silently discard a finished release.
if: ${{ needs.branch_build_setup.outputs.build_type == 'Release' }}
name: Build Release
runs-on: ubuntu-24.04
needs:
[
branch_build_setup,
branch_merge_admin,
branch_merge_web,
branch_merge_space,
branch_merge_live,
branch_merge_api,
branch_merge_proxy,
]
env:
REL_VERSION: ${{ needs.branch_build_setup.outputs.release_version }}
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Update Assets
run: |
cp ./deployments/cli/community/install.sh deployments/cli/community/setup.sh
sed -i 's/${APP_RELEASE:-stable}/${APP_RELEASE:-'${REL_VERSION}'}/g' deployments/cli/community/docker-compose.yml
# sed -i 's/APP_RELEASE=stable/APP_RELEASE='${REL_VERSION}'/g' deployments/cli/community/variables.env
- name: Create Release
id: create_release
uses: softprops/action-gh-release@v2.6.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
with:
tag_name: ${{ env.REL_VERSION }}
name: ${{ env.REL_VERSION }}
target_commitish: ${{ github.sha }}
draft: false
prerelease: ${{ env.IS_PRERELEASE }}
generate_release_notes: true
files: |
${{ github.workspace }}/deployments/cli/community/setup.sh
${{ github.workspace }}/deployments/cli/community/restore.sh
${{ github.workspace }}/deployments/cli/community/restore-airgapped.sh
${{ github.workspace }}/deployments/cli/community/docker-compose.yml
${{ github.workspace }}/deployments/cli/community/variables.env
${{ github.workspace }}/deployments/swarm/community/swarm.sh