Ultima attività 1735980077

build.sh Raw
1anduin@builder:~$ cat ./daily_build_v2.sh
2#!/bin/bash
3
4# daily_build_v2.sh (refactored without tmux)
5# Script Purpose:
6# 1) For each branch in the list:
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 the current session,
13# then copy build artifacts from ./src/dists/* to ~/built/<branch>/
14#
15# Additional requirements:
16# - Do NOT build branches in parallel. Must finish one before moving to the next.
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"
23BASE_BUILT_DIR="$HOME/built"
24
25# Branch list (example: 1.1 & 1.2)
26BRANCHES=("1.0" "1.1" "1.2")
27
28# Print an error message and exit
29error_exit() {
30 echo "[$(date)] ERROR: $1" >&2
31
32 # Infinite sleep to keep the container running for debugging
33 sleep 99999999
34}
35
36# Function to check and build a specific branch
37check_and_build_branch() {
38 local branch_name=$1
39
40 echo "[$(date)] INFO: Start checking branch: $branch_name"
41
42 local last_build_file="$HOME/.last_build_date_${branch_name}"
43
44 # Switch to the repository directory
45 echo "[$(date)] INFO: Changing directory to $REPO_DIR"
46 cd "$REPO_DIR" || error_exit "Cannot change directory to $REPO_DIR"
47
48 echo "[$(date)] INFO: Reset and fetch latest code from remote"
49 git reset --hard HEAD
50 git fetch
51
52 echo "[$(date)] INFO: Switching to branch $branch_name"
53 git switch "$branch_name" || error_exit "Failed to switch to branch $branch_name"
54
55 echo "[$(date)] INFO: Pulling latest code"
56 git pull || error_exit "Failed to pull latest code on branch $branch_name"
57
58 # Check if new commit exists in the past 24 hours
59 local BUILD_REQUIRED=false
60 if git log -1 --since="24 hours ago" "$branch_name" > /dev/null 2>&1; then
61 BUILD_REQUIRED=true
62 echo "[$(date)] INFO: Found new commits in the past 24 hours for branch $branch_name"
63 else
64 # Check last build time
65 if [ -f "$last_build_file" ]; then
66 local last_build_date
67 last_build_date=$(cat "$last_build_file")
68
69 local last_build_epoch
70 last_build_epoch=$(date -d "$last_build_date" +%s)
71 local current_epoch
72 current_epoch=$(date +%s)
73 local seven_days_ago=$(( current_epoch - 7*86400 ))
74
75 if [ "$last_build_epoch" -lt "$seven_days_ago" ]; then
76 BUILD_REQUIRED=true
77 echo "[$(date)] INFO: No recent commits, but last build on $last_build_date is older than 7 days; forcing a build."
78 else
79 echo "[$(date)] INFO: No new commits for branch $branch_name, and last build is within a week. Skipping build."
80 fi
81 else
82 BUILD_REQUIRED=true
83 echo "[$(date)] INFO: No last_build_date record found. Forcing a build."
84 fi
85 fi
86
87 # If build is required, proceed
88 if [ "$BUILD_REQUIRED" = true ]; then
89 echo "[$(date)] INFO: Build is required for branch $branch_name"
90 (cd "$SRC_DIR" && bash "$BUILD_SCRIPT" --langs fast)
91 if [ $? -eq 0 ]; then
92 echo "[$(date)] INFO: Build script completed successfully"
93
94 echo "[$(date)] INFO: Removing old artifacts under $BASE_BUILT_DIR/$branch_name"
95 rm -rf "$BASE_BUILT_DIR/$branch_name"
96 mkdir -p "$BASE_BUILT_DIR/$branch_name"
97
98 # Copy artifacts
99 echo "[$(date)] INFO: Moving build artifacts from $SRC_DIR/dists to $BASE_BUILT_DIR/$branch_name"
100 mv "$SRC_DIR/dist/"* "$BASE_BUILT_DIR/$branch_name"/
101
102 # Update last build date
103 date +"%Y-%m-%d" > "$last_build_file"
104 echo "[$(date)] INFO: Updated last build date record for branch $branch_name"
105 else
106 error_exit "Build script failed for branch $branch_name"
107 fi
108 else
109 echo "[$(date)] INFO: No build needed for branch $branch_name. Keeping existing artifacts."
110 fi
111}
112
113# MAIN FLOW
114# Process each branch in sequence to avoid parallel builds.
115for branch in "${BRANCHES[@]}"; do
116 check_and_build_branch "$branch"
117done
118
119echo "[$(date)] INFO: All branches processed. Script completed."
120