Reusable Build Service #2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |
| - 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 }} |