Skip to content

Reusable Build Service #2

Reusable Build Service

Reusable Build Service #2

name: Reusable Build Service
on:
workflow_call:
inputs:
service_name:
description: "Name of the service"
required: true
type: string
docker_image_name:
description: "Docker image name from setup outputs"
required: true
type: string
build_context:
description: "Build context path"
required: true
type: string
dockerfile_path:
description: "Path to Dockerfile"
required: true
type: string
build_release:
description: "Build release flag"
required: true
type: string
build_prerelease:
description: "Build prerelease flag"
required: true
type: string
release_version:
description: "Release version"
required: true
type: string
buildx_driver:
description: "Buildx driver"
required: true
type: string
buildx_version:
description: "Buildx version"
required: true
type: string
buildx_platforms:
description: "Buildx platforms"
required: true
type: string
buildx_endpoint:
description: "Buildx endpoint"
required: false
type: string
default: ""
private_registry_push:
description: "Push to private registry"
required: false
type: string
default: "false"
private_registry_username:
description: "Private registry username"
required: false
type: string
private_registry_token:
description: "Private registry token"
required: false
type: string
private_registry_addr:
description: "Private registry address"
required: false
type: string
private_registry_project:
description: "Private registry project"
required: false
type: string
build_args:
description: "Additional build args (multiline)"
required: false
type: string
generate_keypair:
description: "Generate keypair for monitor service"
required: false
type: boolean
default: false
target_branch:
description: "Target branch name"
required: false
type: string
default_private_key:
description: "Default private key for non-master branches"
required: false
type: string
secrets:
DOCKERHUB_USERNAME:
required: true
DOCKERHUB_TOKEN:
required: true
workflow_dispatch:
inputs:
service_name:
description: "Name of the service"
required: true
type: choice
options:
- Admin
- Web
- Space
- Live Collaboration
- Silo
- API Server
- Proxy
- Monitor
- Email
- Plane PI
docker_image_name:
description: "Docker image name (e.g., web-commercial)"
required: true
type: string
build_context:
description: "Build context path (e.g., . or ./apps/api)"
required: true
type: string
dockerfile_path:
description: "Path to Dockerfile (e.g., ./apps/web/Dockerfile.web)"
required: true
type: string
build_release:
description: "Build release flag"
required: true
type: boolean
default: false
build_prerelease:
description: "Build prerelease flag"
required: true
type: boolean
default: false
release_version:
description: "Release version (e.g., v1.0.0 or latest)"
required: true
type: string
default: "latest"
buildx_driver:
description: "Buildx driver (docker-container or cloud)"
required: true
type: choice
default: "docker-container"
options:
- docker-container
- cloud
buildx_version:
description: "Buildx version"
required: true
type: string
default: "latest"
buildx_platforms:
description: "Buildx platforms (e.g., linux/amd64 or linux/amd64,linux/arm64)"
required: true
type: string
default: "linux/amd64"
buildx_endpoint:
description: "Buildx endpoint (leave empty for docker-container)"
required: false
type: string
default: ""
private_registry_push:
description: "Push to private registry"
required: false
type: boolean
default: false
private_registry_username:
description: "Private registry username"
required: false
type: string
private_registry_token:
description: "Private registry token"
required: false
type: string
private_registry_addr:
description: "Private registry address"
required: false
type: string
private_registry_project:
description: "Private registry project"
required: false
type: string
build_args:
description: "Additional build args (multiline, optional)"
required: false
type: string
generate_keypair:
description: "Generate keypair for monitor service"
required: false
type: boolean
default: false
target_branch:
description: "Target branch name (for keypair generation)"
required: false
type: string
default: "master"
default_private_key:
description: "Default private key for non-master branches"
required: false
type: string
jobs:
build_push_service:
name: Build-Push ${{ inputs.service_name }} Docker Image
runs-on: ubuntu-22.04
steps:
- name: Checkout Files
uses: actions/checkout@v4
- name: Generate Keypair
if: inputs.service_name == 'Monitor' || inputs.generate_keypair == true || inputs.generate_keypair == 'true'
id: generate_keypair
run: |
# Determine target branch - use input if provided, otherwise use GitHub ref
TARGET_BRANCH="${{ inputs.target_branch }}"
if [ -z "$TARGET_BRANCH" ]; then
TARGET_BRANCH="${GITHUB_REF#refs/heads/}"
fi
BUILD_RELEASE="${{ inputs.build_release }}"
if [ "$TARGET_BRANCH" == "master" ] || [ "$BUILD_RELEASE" == "true" ] || [ "$BUILD_RELEASE" == true ]; then
openssl genrsa -out private_key.pem 2048
else
if [ -n "${{ inputs.default_private_key }}" ]; then
echo "${{ inputs.default_private_key }}" > private_key.pem
else
echo "Warning: No default private key provided, generating new keypair"
openssl genrsa -out private_key.pem 2048
fi
fi
openssl rsa -in private_key.pem -pubout -out public_key.pem
cat public_key.pem
# Generating the private key env for the generated keys
PRIVATE_KEY=$(cat private_key.pem | base64 -w 0)
echo "PRIVATE_KEY=${PRIVATE_KEY}" >> $GITHUB_ENV
echo "PRIVATE_KEY=${PRIVATE_KEY}" >> $GITHUB_OUTPUT
- name: Prepare Build Args
id: prepare_build_args
run: |
BUILD_ARGS_FILE=$(mktemp)
if [ -n "${{ inputs.build_args }}" ]; then
echo "${{ inputs.build_args }}" >> "$BUILD_ARGS_FILE"
fi
if ([ "${{ inputs.service_name }}" == "Monitor" ] || [ "${{ inputs.generate_keypair }}" == "true" ] || [ "${{ inputs.generate_keypair }}" == true ]) && [ -n "${{ env.PRIVATE_KEY }}" ]; then
echo "PRIVATE_KEY=${{ env.PRIVATE_KEY }}" >> "$BUILD_ARGS_FILE"
fi
if [ -s "$BUILD_ARGS_FILE" ]; then
cat "$BUILD_ARGS_FILE"
echo "build_args<<EOF" >> $GITHUB_OUTPUT
cat "$BUILD_ARGS_FILE" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
fi
rm -f "$BUILD_ARGS_FILE"
- name: Prepare Build Flags
id: prepare_flags
run: |
# Convert boolean/string to proper string format
if [ "${{ inputs.build_release }}" == "true" ] || [ "${{ inputs.build_release }}" == true ]; then
echo "build_release=true" >> $GITHUB_OUTPUT
else
echo "build_release=false" >> $GITHUB_OUTPUT
fi
if [ "${{ inputs.build_prerelease }}" == "true" ] || [ "${{ inputs.build_prerelease }}" == true ]; then
echo "build_prerelease=true" >> $GITHUB_OUTPUT
else
echo "build_prerelease=false" >> $GITHUB_OUTPUT
fi
if [ "${{ inputs.private_registry_push }}" == "true" ] || [ "${{ inputs.private_registry_push }}" == true ]; then
echo "private_registry_push=true" >> $GITHUB_OUTPUT
else
echo "private_registry_push=${{ inputs.private_registry_push }}" >> $GITHUB_OUTPUT
fi
- name: ${{ inputs.service_name }} Build and Push
uses: makeplane/actions/build-push@v1.1.0
with:
build-release: ${{ steps.prepare_flags.outputs.build_release }}
build-prerelease: ${{ steps.prepare_flags.outputs.build_prerelease }}
release-version: ${{ inputs.release_version }}
dockerhub-username: ${{ secrets.DOCKERHUB_USERNAME }}
dockerhub-token: ${{ secrets.DOCKERHUB_TOKEN }}
private-registry-push: ${{ steps.prepare_flags.outputs.private_registry_push }}
private-registry-username: ${{ inputs.private_registry_username }}
private-registry-token: ${{ inputs.private_registry_token }}
private-registry-addr: ${{ inputs.private_registry_addr }}
private-registry-project: ${{ inputs.private_registry_project }}
docker-image-owner: makeplane
docker-image-name: ${{ inputs.docker_image_name }}
build-context: ${{ inputs.build_context }}
dockerfile-path: ${{ inputs.dockerfile_path }}
buildx-driver: ${{ inputs.buildx_driver }}
buildx-version: ${{ inputs.buildx_version }}
buildx-platforms: ${{ inputs.buildx_platforms }}
buildx-endpoint: ${{ inputs.buildx_endpoint }}
build-args: ${{ steps.prepare_build_args.outputs.build_args }}