refactor(ci): restructure patch-build workflow script

- Extract inline bash script into structured functions
- Add proper error handling with set -euo pipefail
- Improve variable scoping with readonly and local declarations
- Add descriptive function names and comments
- Fix shell quoting and parameter expansion
- Consolidate build logic into reusable functions
- Add proper cleanup of temporary files
- Improve readability and maintainability of the CI script

The refactored script maintains the same functionality while being
more robust and easier to understand.

Signed-off-by: rjshrjndrn <rjshrjndrn@gmail.com>
This commit is contained in:
rjshrjndrn 2025-05-29 11:07:06 +02:00 committed by Rajesh Rajendran
parent 6c8b55019e
commit beec2283fd

View file

@ -74,78 +74,168 @@ jobs:
MSAAS_REPO_CLONE_TOKEN: ${{ secrets.MSAAS_REPO_CLONE_TOKEN }} MSAAS_REPO_CLONE_TOKEN: ${{ secrets.MSAAS_REPO_CLONE_TOKEN }}
MSAAS_REPO_URL: ${{ secrets.MSAAS_REPO_URL }} MSAAS_REPO_URL: ${{ secrets.MSAAS_REPO_URL }}
MSAAS_REPO_FOLDER: /tmp/msaas MSAAS_REPO_FOLDER: /tmp/msaas
SERVICES_INPUT: ${{ github.event.inputs.services }}
run: | run: |
set -exo pipefail #!/bin/bash
git config --local user.email "action@github.com" set -euo pipefail
git config --local user.name "GitHub Action"
git checkout -b $BRANCH_NAME # Configuration
working_dir=$(pwd) readonly WORKING_DIR=$(pwd)
function image_version(){ readonly BUILD_SCRIPT_NAME="build.sh"
local service=$1 readonly BACKEND_SERVICES_FILE="/tmp/backend.txt"
chart_path="$working_dir/scripts/helmcharts/openreplay/charts/$service/Chart.yaml"
current_version=$(yq eval '.AppVersion' $chart_path) # Initialize git configuration
new_version=$(echo $current_version | awk -F. '{$NF += 1 ; print $1"."$2"."$3}') setup_git() {
echo $new_version git config --local user.email "action@github.com"
# yq eval ".AppVersion = \"$new_version\"" -i $chart_path git config --local user.name "GitHub Action"
git checkout -b "$BRANCH_NAME"
} }
function clone_msaas() {
[ -d $MSAAS_REPO_FOLDER ] || { # Get and increment image version
git clone -b dev --recursive https://x-access-token:$MSAAS_REPO_CLONE_TOKEN@$MSAAS_REPO_URL $MSAAS_REPO_FOLDER image_version() {
cd $MSAAS_REPO_FOLDER local service=$1
cd openreplay && git fetch origin && git checkout main # This have to be changed to specific tag local chart_path="$WORKING_DIR/scripts/helmcharts/openreplay/charts/$service/Chart.yaml"
git log -1 local current_version new_version
cd $MSAAS_REPO_FOLDER
bash git-init.sh current_version=$(yq eval '.AppVersion' "$chart_path")
git checkout new_version=$(echo "$current_version" | awk -F. '{$NF += 1; print $1"."$2"."$3}')
} echo "$new_version"
} }
function build_managed() {
local service=$1 # Clone MSAAS repository if not exists
local version=$2 clone_msaas() {
echo building managed if [[ ! -d "$MSAAS_REPO_FOLDER" ]]; then
clone_msaas git clone -b dev --recursive "https://x-access-token:${MSAAS_REPO_CLONE_TOKEN}@${MSAAS_REPO_URL}" "$MSAAS_REPO_FOLDER"
if [[ $service == 'chalice' ]]; then cd "$MSAAS_REPO_FOLDER"
cd $MSAAS_REPO_FOLDER/openreplay/api cd openreplay && git fetch origin && git checkout main
else git log -1
cd $MSAAS_REPO_FOLDER/openreplay/$service cd "$MSAAS_REPO_FOLDER"
fi bash git-init.sh
IMAGE_TAG=$version DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=arm64 DOCKER_REPO=$DOCKER_REPO_ARM PUSH_IMAGE=0 bash build.sh >> /tmp/managed_${service}.txt 2>&1 || { echo "Build failed for $service"; cat /tmp/managed_${service}.txt; exit 1; } git checkout
fi
} }
# Checking for backend images
ls backend/cmd >> /tmp/backend.txt # Build managed services
echo Services: "${{ github.event.inputs.services }}" build_managed() {
IFS=',' read -ra SERVICES <<< "${{ github.event.inputs.services }}" local service=$1
BUILD_SCRIPT_NAME="build.sh" local version=$2
# Build FOSS local log_file="/tmp/managed_${service}.txt"
for SERVICE in "${SERVICES[@]}"; do
# Check if service is backend echo "Building managed service: $service"
if grep -q $SERVICE /tmp/backend.txt; then clone_msaas
cd backend
foss_build_args="nil $SERVICE" if [[ $service == 'chalice' ]]; then
ee_build_args="ee $SERVICE" cd "$MSAAS_REPO_FOLDER/openreplay/api"
else else
[[ $SERVICE == 'chalice' || $SERVICE == 'alerts' || $SERVICE == 'crons' ]] && cd $working_dir/api || cd $SERVICE cd "$MSAAS_REPO_FOLDER/openreplay/$service"
[[ $SERVICE == 'alerts' || $SERVICE == 'crons' ]] && BUILD_SCRIPT_NAME="build_${SERVICE}.sh" fi
ee_build_args="ee"
fi local build_cmd="IMAGE_TAG=$version DOCKER_RUNTIME=depot DOCKER_BUILD_ARGS=--push ARCH=arm64 DOCKER_REPO=$DOCKER_REPO_ARM PUSH_IMAGE=0 bash build.sh"
version=$(image_version $SERVICE)
echo IMAGE_TAG=$version DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=amd64 DOCKER_REPO=$DOCKER_REPO_OSS PUSH_IMAGE=0 bash ${BUILD_SCRIPT_NAME} $foss_build_args if ! eval "$build_cmd" >>"$log_file" 2>&1; then
IMAGE_TAG=$version DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=amd64 DOCKER_REPO=$DOCKER_REPO_OSS PUSH_IMAGE=0 bash ${BUILD_SCRIPT_NAME} $foss_build_args echo "Build failed for $service"
echo IMAGE_TAG=$version-ee DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=amd64 DOCKER_REPO=$DOCKER_REPO_OSS PUSH_IMAGE=0 bash ${BUILD_SCRIPT_NAME} $ee_build_args cat "$log_file"
IMAGE_TAG=$version-ee DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=amd64 DOCKER_REPO=$DOCKER_REPO_OSS PUSH_IMAGE=0 bash ${BUILD_SCRIPT_NAME} $ee_build_args exit 1
if [[ "$SERVICE" != "chalice" && "$SERVICE" != "frontend" ]]; then fi
IMAGE_TAG=$version DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=arm64 DOCKER_REPO=$DOCKER_REPO_ARM PUSH_IMAGE=0 bash ${BUILD_SCRIPT_NAME} $foss_build_args }
echo IMAGE_TAG=$version DOCKER_RUNTIME="depot" DOCKER_BUILD_ARGS="--push" ARCH=arm64 DOCKER_REPO=$DOCKER_REPO_ARM PUSH_IMAGE=0 bash ${BUILD_SCRIPT_NAME} $foss_build_args
else # Build service with given arguments
build_managed $SERVICE $version build_service() {
fi local service=$1
cd $working_dir local version=$2
chart_path="$working_dir/scripts/helmcharts/openreplay/charts/$SERVICE/Chart.yaml" local build_args=$3
yq eval ".AppVersion = \"$version\"" -i $chart_path local build_script=${4:-$BUILD_SCRIPT_NAME}
git add $chart_path
git commit -m "Increment $SERVICE chart version" local command="IMAGE_TAG=$version DOCKER_RUNTIME=depot DOCKER_BUILD_ARGS=--push ARCH=amd64 DOCKER_REPO=$DOCKER_REPO_OSS PUSH_IMAGE=0 bash $build_script $build_args"
git push --set-upstream origin $BRANCH_NAME echo "Executing: $command"
done eval "$command"
}
# Update chart version and commit changes
update_chart_version() {
local service=$1
local version=$2
local chart_path="$WORKING_DIR/scripts/helmcharts/openreplay/charts/$service/Chart.yaml"
cd "$WORKING_DIR"
yq eval ".AppVersion = \"$version\"" -i "$chart_path"
cd -
git add "$chart_path"
git commit -m "Increment $service chart version to $version"
git push --set-upstream origin "$BRANCH_NAME"
}
# Main execution
main() {
setup_git
# Get backend services list
ls backend/cmd >"$BACKEND_SERVICES_FILE"
# Parse services input (fix for GitHub Actions syntax)
echo "Services: ${SERVICES_INPUT:-$1}"
IFS=',' read -ra services <<<"${SERVICES_INPUT:-$1}"
# Process each service
for service in "${services[@]}"; do
echo "Processing service: $service"
cd "$WORKING_DIR"
local foss_build_args="" ee_build_args="" build_script="$BUILD_SCRIPT_NAME"
# Determine build configuration based on service type
if grep -q "$service" "$BACKEND_SERVICES_FILE"; then
# Backend service
cd backend
foss_build_args="nil $service"
ee_build_args="ee $service"
else
# Non-backend service
case "$service" in
chalice | alerts | crons)
cd "$WORKING_DIR/api"
;;
*)
cd "$service"
;;
esac
# Special build scripts for alerts/crons
if [[ $service == 'alerts' || $service == 'crons' ]]; then
build_script="build_${service}.sh"
fi
ee_build_args="ee"
fi
# Get version and build
local version
version=$(image_version "$service")
# Build FOSS and EE versions
build_service "$service" "$version" "$foss_build_args"
build_service "$service" "$version" "$ee_build_args"
# Build managed version for specific services
if [[ "$service" != "chalice" && "$service" != "frontend" ]]; then
echo "Nothing to build in managed for service $service"
else
build_managed "$service" "$version"
fi
# Update chart and commit
update_chart_version "$service" "$version"
done
cd "$WORKING_DIR"
# Cleanup
rm -f "$BACKEND_SERVICES_FILE"
}
echo "Working directory: $WORKING_DIR"
# Run main function with all arguments
main "$SERVICES_INPUT"
- name: Create Pull Request - name: Create Pull Request
uses: repo-sync/pull-request@v2 uses: repo-sync/pull-request@v2