Last active 1737707914

Revision d651bf0cadc4ac869dcc0e582ce9caf2cbf19172

build.sh Raw
1#!/bin/bash
2
3# daily_build_v2.sh
4# Script Purpose:
5# This script is scheduled to run daily at 21:00 UTC to:
6# 1) For each branch (e.g. 1.1, 1.2):
7# a) Switch to the branch, ensure local code is up-to-date (clean -fdx, reset --hard, pull)
8# b) Check if there are new commits in the past 24 hours
9# - If yes, a build is required
10# - If no but the last build was more than a week ago, a forced build is required
11# - Otherwise, skip
12# c) If a build is required, run build_all_langs.sh in a specific tmux session,
13# then copy build artifacts from ./src/dists/* to ~/built/<branch>/
14#
15# Additional requirements for this version:
16# - Do NOT build 1.1 and 1.2 at the same time. Must wait for 1.1 to finish before building 1.2.
17# - If no build is needed, do NOT remove any existing build artifacts.
18# - Provide more logs rather than comments.
19
20REPO_DIR="$HOME/anduinos"
21SRC_DIR="$REPO_DIR/src"
22BUILD_SCRIPT="$SRC_DIR/build_all_langs.sh"
23SESSION_NAME_PREFIX="build_session"
24BASE_BUILT_DIR="$HOME/built"
25
26# Branch list (example: 1.1 & 1.2)
27BRANCHES=("1.1" "1.2")
28
29# Print an error message and exit
30error_exit() {
31 echo "[$(date)] ERROR: $1" >&2
32 exit 1
33}
34
35# Function to check and build a specific branch
36check_and_build_branch() {
37 local branch_name=$1
38
39 local sanitized_branch_name="${branch_name//./_}"
40 local session_name="${SESSION_NAME_PREFIX}_${sanitized_branch_name}"
41
42 echo "[$(date)] INFO: Start checking branch: $branch_name"
43 echo "[$(date)] INFO: The tmux session name will be: $session_name"
44
45 local last_build_file="$HOME/.last_build_date_${branch_name}"
46
47 # Switch to the repository directory
48 echo "[$(date)] INFO: Changing directory to $REPO_DIR"
49 cd "$REPO_DIR" || error_exit "Cannot change directory to $REPO_DIR"
50
51 echo "[$(date)] INFO: Reset and fetch latest code from remote"
52 git reset --hard HEAD
53 git fetch
54
55 echo "[$(date)] INFO: Switching to branch $branch_name"
56 git switch "$branch_name" || error_exit "Failed to switch to branch $branch_name"
57
58 echo "[$(date)] INFO: Pulling latest code"
59 git pull || error_exit "Failed to pull latest code on branch $branch_name"
60
61 # Check if new commit exists in the past 24 hours
62 local BUILD_REQUIRED=false
63 if git log -1 --since="24 hours ago" "$branch_name" > /dev/null 2>&1; then
64 BUILD_REQUIRED=true
65 echo "[$(date)] INFO: Found new commits in the past 24 hours for branch $branch_name"
66 else
67 # Check last build time
68 if [ -f "$last_build_file" ]; then
69 local last_build_date
70 last_build_date=$(cat "$last_build_file")
71 local last_build_epoch
72 last_build_epoch=$(date -d "$last_build_date" +%s)
73 local current_epoch
74 current_epoch=$(date +%s)
75 local seven_days_ago=$(( current_epoch - 7*86400 ))
76
77 if [ "$last_build_epoch" -lt "$seven_days_ago" ]; then
78 BUILD_REQUIRED=true
79 echo "[$(date)] INFO: No recent commits, but last build on $last_build_date is older than 7 days; forcing a build."
80 else
81 echo "[$(date)] INFO: No new commits for branch $branch_name, and last build is within a week. Skipping build."
82 fi
83 else
84 # If there's no record file, we consider it as needing a build
85 BUILD_REQUIRED=true
86 echo "[$(date)] INFO: No last_build_date record found. Forcing a build."
87 fi
88 fi
89
90 # If build is required, proceed
91 if [ "$BUILD_REQUIRED" = true ]; then
92 echo "[$(date)] INFO: Build is required for branch $branch_name"
93
94 # Optional: Clean up the old artifacts only when we are about to build
95 echo "[$(date)] INFO: Removing old artifacts under $BASE_BUILT_DIR/$branch_name"
96 rm -rf "$BASE_BUILT_DIR/$branch_name"
97
98 # Ensure the build output directory exists
99 mkdir -p "$BASE_BUILT_DIR/$branch_name"
100
101 # Kill any old tmux session for this branch
102 local session_name="${SESSION_NAME_PREFIX}_${branch_name}"
103 echo "[$(date)] INFO: Checking and killing any existing tmux session named $session_name"
104 if tmux has-session -t "$session_name" 2>/dev/null; then
105 tmux kill-session -t "$session_name"
106 echo "[$(date)] INFO: Killed existing tmux session: $session_name"
107 fi
108
109 # Start a new tmux session for build
110 echo "[$(date)] INFO: Creating a new tmux session for building branch $branch_name"
111 tmux new-session -d -s "$session_name" "cd '$SRC_DIR' && bash '$BUILD_SCRIPT'"
112
113 if [ $? -eq 0 ]; then
114 echo "[$(date)] INFO: Build script launched in tmux session: $session_name"
115
116 # Wait until the build script finishes inside tmux
117 # Option 1: Polling approach until session not found
118 echo "[$(date)] INFO: Waiting for the tmux session ($session_name) to finish..."
119 while tmux has-session -t "$session_name" 2>/dev/null; do
120 sleep 5
121 done
122
123 echo "[$(date)] INFO: Tmux session ($session_name) finished building"
124
125 # After build completes, copy artifacts
126 echo "[$(date)] INFO: Copying build artifacts from $SRC_DIR/dists to $BASE_BUILT_DIR/$branch_name"
127 cp -rf "$SRC_DIR/dists/"* "$BASE_BUILT_DIR/$branch_name"/
128
129 # Update last build date
130 date +"%Y-%m-%d" > "$last_build_file"
131 echo "[$(date)] INFO: Updated last build date record for branch $branch_name"
132 else
133 error_exit "[$(date)] ERROR: Failed to start build script in tmux session for branch $branch_name"
134 fi
135 else
136 echo "[$(date)] INFO: No build needed for branch $branch_name. Keeping existing artifacts."
137 fi
138}
139
140# MAIN FLOW
141# Process each branch in sequence. We do NOT parallel-build branches.
142for branch in "${BRANCHES[@]}"; do
143 check_and_build_branch "$branch"
144done
145
146echo "[$(date)] INFO: All branches processed. Script completed."
147