From e769bfb011a543158867cd6d8419d5d2259d44f7 Mon Sep 17 00:00:00 2001 From: Denis Lugowski Date: Sun, 23 Nov 2025 09:11:39 +0100 Subject: [PATCH] fix(pipeline): Exit full pipeline on a single error --- pipeline.sh | 150 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 93 insertions(+), 57 deletions(-) diff --git a/pipeline.sh b/pipeline.sh index ff4d4ac..32b041c 100755 --- a/pipeline.sh +++ b/pipeline.sh @@ -111,28 +111,41 @@ validate_environment() { } frontend_job() { - local exit_code=0 local log_file="$TEMP_DIR/frontend.log" local use_prefix=$1 - - { + + ( + set +e + echo "==================== FRONTEND JOB ====================" log_info "Starting frontend build..." - - cd "$SCRIPT_DIR/legalconsenthub" - + + cd "$SCRIPT_DIR/legalconsenthub" || exit 1 + log_info "Installing dependencies..." pnpm install --frozen-lockfile + if [ $? -ne 0 ]; then + log_error "Dependencies installation failed" + exit 1 + fi log_success "Dependencies installed" - + log_info "Running linting..." pnpm lint + if [ $? -ne 0 ]; then + log_error "Linting failed" + exit 1 + fi log_success "Linting passed" - + log_info "Running type checking..." pnpm type-check + if [ $? -ne 0 ]; then + log_error "Type checking failed" + exit 1 + fi log_success "Type checking passed" - + log_info "Building Docker image..." docker buildx build \ --platform linux/amd64 \ @@ -141,42 +154,57 @@ frontend_job() { --file ./Dockerfile \ --push \ .. - + if [ $? -ne 0 ]; then + log_error "Docker build failed" + exit 1 + fi + log_success "Docker image built and pushed successfully" log_info "Image: gitea.lugnas.de/denis/legalconsenthub:latest" log_info "Image: gitea.lugnas.de/denis/legalconsenthub:$GIT_SHA" - - echo "0" > "$TEMP_DIR/frontend_exit_code" - } 2>&1 | if [ "$use_prefix" = true ]; then prefix_output "FRONTEND" "$BLUE"; else cat; fi | tee "$log_file" || { - exit_code=$? - log_error "Frontend job failed with exit code $exit_code" - echo "$exit_code" > "$TEMP_DIR/frontend_exit_code" - } + + exit 0 + ) 2>&1 | if [ "$use_prefix" = true ]; then prefix_output "FRONTEND" "$BLUE"; else cat; fi | tee "$log_file" + + return ${PIPESTATUS[0]} } backend_job() { - local exit_code=0 local log_file="$TEMP_DIR/backend.log" local use_prefix=$1 - - { + + ( + set +e + echo "==================== BACKEND JOB ====================" log_info "Starting backend build..." - - cd "$SCRIPT_DIR/legalconsenthub-backend" - + + cd "$SCRIPT_DIR/legalconsenthub-backend" || exit 1 + log_info "Building application..." ./gradlew build -x test + if [ $? -ne 0 ]; then + log_error "Build failed" + exit 1 + fi log_success "Build completed" - + log_info "Running ktlint check..." ./gradlew ktlintCheck + if [ $? -ne 0 ]; then + log_error "ktlint check failed" + exit 1 + fi log_success "ktlint check passed" - + log_info "Running tests..." ./gradlew test + if [ $? -ne 0 ]; then + log_error "Tests failed" + exit 1 + fi log_success "Tests passed" - + log_info "Building Docker image..." docker buildx build \ --platform linux/amd64 \ @@ -185,22 +213,24 @@ backend_job() { --file ./Dockerfile \ --push \ .. - + if [ $? -ne 0 ]; then + log_error "Docker build failed" + exit 1 + fi + log_success "Docker image built and pushed successfully" log_info "Image: gitea.lugnas.de/denis/legalconsenthub-backend:latest" log_info "Image: gitea.lugnas.de/denis/legalconsenthub-backend:$GIT_SHA" - - echo "0" > "$TEMP_DIR/backend_exit_code" - } 2>&1 | if [ "$use_prefix" = true ]; then prefix_output "BACKEND" "$GREEN"; else cat; fi | tee "$log_file" || { - exit_code=$? - log_error "Backend job failed with exit code $exit_code" - echo "$exit_code" > "$TEMP_DIR/backend_exit_code" - } + + exit 0 + ) 2>&1 | if [ "$use_prefix" = true ]; then prefix_output "BACKEND" "$GREEN"; else cat; fi | tee "$log_file" + + return ${PIPESTATUS[0]} } run_jobs() { local run_parallel=false - + if [ "$RUN_FRONTEND" = true ] && [ "$RUN_BACKEND" = true ]; then run_parallel=true log_info "Starting parallel jobs..." @@ -208,66 +238,72 @@ run_jobs() { log_info "Starting job..." fi echo "" - + + local frontend_exit=0 + local backend_exit=0 + if [ "$run_parallel" = true ]; then frontend_job true & local frontend_pid=$! - + backend_job true & local backend_pid=$! - + log_info "Frontend PID: $frontend_pid" log_info "Backend PID: $backend_pid" log_info "Waiting for jobs to complete..." echo "" - + + set +e wait $frontend_pid + frontend_exit=$? wait $backend_pid + backend_exit=$? + set -e else if [ "$RUN_FRONTEND" = true ]; then + set +e frontend_job false + frontend_exit=$? + set -e fi - + if [ "$RUN_BACKEND" = true ]; then + set +e backend_job false + backend_exit=$? + set -e fi fi - local frontend_exit=0 - local backend_exit=0 - - if [ "$RUN_FRONTEND" = true ]; then - frontend_exit=$(cat "$TEMP_DIR/frontend_exit_code" 2>/dev/null || echo "1") - fi - - if [ "$RUN_BACKEND" = true ]; then - backend_exit=$(cat "$TEMP_DIR/backend_exit_code" 2>/dev/null || echo "1") - fi - echo "" echo "==================== JOB SUMMARY ====================" - + + local has_failure=false + if [ "$RUN_FRONTEND" = true ]; then if [ "$frontend_exit" -eq 0 ]; then log_success "Frontend job completed successfully" else log_error "Frontend job failed with exit code $frontend_exit" + has_failure=true fi fi - + if [ "$RUN_BACKEND" = true ]; then if [ "$backend_exit" -eq 0 ]; then log_success "Backend job completed successfully" else log_error "Backend job failed with exit code $backend_exit" + has_failure=true fi fi - - if [ "$frontend_exit" -ne 0 ] || [ "$backend_exit" -ne 0 ]; then + + if [ "$has_failure" = true ]; then log_error "One or more jobs failed. Aborting pipeline." exit 1 fi - + log_success "All jobs completed successfully" } @@ -281,7 +317,7 @@ deploy() { echo "==================== DEPLOYMENT ====================" log_info "Starting deployment to server..." - ssh -F ~/.ssh/config -i ~/.ssh/gitea_deploy -p 32766 -o StrictHostKeyChecking=accept-new deploy@ds218 "sudo /usr/local/bin/deployLegalconsenthub.sh" + ssh -i ~/.ssh/gitea_deploy -p 32766 -o StrictHostKeyChecking=accept-new deploy@ds218 "sudo /usr/local/bin/deployLegalconsenthub.sh" log_success "Deployment triggered successfully" log_success "Application is being deployed to production"