From 0bfb1e67e0512217b9fa23cb56b6a1d86ff01a11 Mon Sep 17 00:00:00 2001 From: YuanXuan Date: Tue, 24 Mar 2026 10:17:26 +0800 Subject: [PATCH 1/4] fix(ci): escape EXTRA_ARGS in Jenkinsfile GString Groovy interpolated $EXTRA_ARGS as a pipeline binding property, which raised MissingPropertyException and skipped flutter build apk. Prefix dollar signs with backslash so the shell receives literal $EXTRA_ARGS. Made-with: Cursor --- Jenkinsfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 57d473c..bbdcc3b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -142,20 +142,20 @@ pipeline { fvm flutter pub get - # 拼接附加构建参数 + # 拼接附加构建参数 (Groovy 中 \$ 转义 $,避免被当作 Jenkins 变量插值) EXTRA_ARGS="" if [ ! -z "${params.VERSION_NAME}" ]; then - EXTRA_ARGS="\\$EXTRA_ARGS --build-name=${params.VERSION_NAME}" + EXTRA_ARGS="\$EXTRA_ARGS --build-name=${params.VERSION_NAME}" fi if [ ! -z "${params.BUILD_NUMBER}" ]; then - EXTRA_ARGS="\\$EXTRA_ARGS --build-number=${params.BUILD_NUMBER}" + EXTRA_ARGS="\$EXTRA_ARGS --build-number=${params.BUILD_NUMBER}" fi # 注入环境变量参数用于代码判断 (如需要) - EXTRA_ARGS="\\$EXTRA_ARGS --dart-define=APP_ENV=${params.BUILD_ENVIRONMENT}" + EXTRA_ARGS="\$EXTRA_ARGS --dart-define=APP_ENV=${params.BUILD_ENVIRONMENT}" - echo " - 开始构建 APK 参数: \\$EXTRA_ARGS" - fvm flutter build apk --release \\$EXTRA_ARGS + echo " - 开始构建 APK 参数: \$EXTRA_ARGS" + fvm flutter build apk --release \$EXTRA_ARGS """ echo " ✅ ${currentApp} Android APK 构建完成" } From f072df7b766ae63ac256594dece4bef6852a436b Mon Sep 17 00:00:00 2001 From: YuanXuan Date: Tue, 24 Mar 2026 10:24:42 +0800 Subject: [PATCH 2/4] fix(ci): avoid Groovy GString parse errors in Jenkins shell block Jenkins CPS Groovy rejects patterns like if [ "${params.X}" = "true" ]. Assign params to shell variables first, then use $VAR in tests and EXTRA_ARGS. Made-with: Cursor --- Jenkinsfile | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bbdcc3b..968f22f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -135,24 +135,27 @@ pipeline { [ -f "\\$HOME/.zshrc" ] && source "\\$HOME/.zshrc" > /dev/null 2>&1 cd apps/${currentApp} - if [ "${params.CLEAN_BUILD}" = "true" ]; then + # 先写入 shell 变量,避免 GString 里出现 "\${params.xxx}" 触发 Groovy 解析错误 + CLEAN_BUILD='${params.CLEAN_BUILD}' + VERSION_NAME='${params.VERSION_NAME}' + BUILD_NUMBER='${params.BUILD_NUMBER}' + BUILD_ENV='${params.BUILD_ENVIRONMENT}' + + if [ "\$CLEAN_BUILD" = "true" ]; then echo " - 执行 flutter clean..." fvm flutter clean fi fvm flutter pub get - # 拼接附加构建参数 (Groovy 中 \$ 转义 $,避免被当作 Jenkins 变量插值) EXTRA_ARGS="" - if [ ! -z "${params.VERSION_NAME}" ]; then - EXTRA_ARGS="\$EXTRA_ARGS --build-name=${params.VERSION_NAME}" + if [ -n "\$VERSION_NAME" ]; then + EXTRA_ARGS="\$EXTRA_ARGS --build-name=\$VERSION_NAME" fi - if [ ! -z "${params.BUILD_NUMBER}" ]; then - EXTRA_ARGS="\$EXTRA_ARGS --build-number=${params.BUILD_NUMBER}" + if [ -n "\$BUILD_NUMBER" ]; then + EXTRA_ARGS="\$EXTRA_ARGS --build-number=\$BUILD_NUMBER" fi - - # 注入环境变量参数用于代码判断 (如需要) - EXTRA_ARGS="\$EXTRA_ARGS --dart-define=APP_ENV=${params.BUILD_ENVIRONMENT}" + EXTRA_ARGS="\$EXTRA_ARGS --dart-define=APP_ENV=\$BUILD_ENV" echo " - 开始构建 APK 参数: \$EXTRA_ARGS" fvm flutter build apk --release \$EXTRA_ARGS From 9fbefc4438346dd04bd9302e34549315ec6fac6f Mon Sep 17 00:00:00 2001 From: YuanXuan Date: Tue, 24 Mar 2026 10:49:25 +0800 Subject: [PATCH 3/4] chore(ci): add heartbeat logs during flutter apk build Print a timestamp every 30 seconds while flutter build runs so long Gradle/download phases are visible in Jenkins instead of appearing hung. Made-with: Cursor --- Jenkinsfile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 968f22f..cef1f55 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -158,7 +158,14 @@ pipeline { EXTRA_ARGS="\$EXTRA_ARGS --dart-define=APP_ENV=\$BUILD_ENV" echo " - 开始构建 APK 参数: \$EXTRA_ARGS" - fvm flutter build apk --release \$EXTRA_ARGS + echo " - 开始执行 flutter build apk(构建期间每30秒输出一次心跳)..." + (fvm flutter build apk --release \$EXTRA_ARGS) & + BUILD_PID=\$! + while kill -0 \$BUILD_PID 2>/dev/null; do + echo " - 构建仍在进行中... \$(date '+%H:%M:%S')" + sleep 30 + done + wait \$BUILD_PID """ echo " ✅ ${currentApp} Android APK 构建完成" } From 55d035cb9cf1cf59535c6974fd0cbcb38f3ca75a Mon Sep 17 00:00:00 2001 From: YuanXuan Date: Tue, 24 Mar 2026 11:14:13 +0800 Subject: [PATCH 4/4] fix(ci): retry apk build after clearing corrupted Gradle cache Handle sporadic Gradle wrapper zip corruption on Jenkins by retrying build once after removing ~/.gradle/wrapper/dists. Made-with: Cursor --- Jenkinsfile | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index cef1f55..f2b979a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -159,13 +159,23 @@ pipeline { echo " - 开始构建 APK 参数: \$EXTRA_ARGS" echo " - 开始执行 flutter build apk(构建期间每30秒输出一次心跳)..." - (fvm flutter build apk --release \$EXTRA_ARGS) & - BUILD_PID=\$! - while kill -0 \$BUILD_PID 2>/dev/null; do - echo " - 构建仍在进行中... \$(date '+%H:%M:%S')" - sleep 30 - done - wait \$BUILD_PID + + run_build_with_heartbeat() { + (fvm flutter build apk --release \$EXTRA_ARGS) & + BUILD_PID=\$! + while kill -0 \$BUILD_PID 2>/dev/null; do + echo " - 构建仍在进行中... \$(date '+%H:%M:%S')" + sleep 30 + done + wait \$BUILD_PID + return \$? + } + + if ! run_build_with_heartbeat; then + echo " ⚠️ 首次构建失败,尝试清理 Gradle wrapper 缓存后重试一次..." + rm -rf "\$HOME/.gradle/wrapper/dists" + run_build_with_heartbeat + fi """ echo " ✅ ${currentApp} Android APK 构建完成" }