今天执行 jenkins 构建,meta 文件会变化,导致生成的h5工程无法打开

命令行构建会发生,
meta 文件全都有变化

手动正常构建是没问题的。
3.8.7的最新6月4日版本

之前感觉没问题啊,今天构建就这样。
meta 文件变化之后,生成的工程也是黑屏有报错。
升级到了7月的社区版,问题依旧。
看上去 meta 文件都自动改错了。

7月3日早上上班自动又好了,命令行构建也不会弄乱 meta 文件了。构建的结果也正常了。昨天晚上甚至电脑都没关也没重启。
有点怀疑是昨天编辑器登录不了自己的账号有关,我试了几次登录不了,用 skip 继续的。

保持一个3.8.7项目开启,jenkins构建其他的就正常,关闭掉就不行了 :joy:很奇葩

我开着也不行,但是,开着还得是同时进行着构建,同时 jenkins 也开始构建就没问题。

楼主问题解决了吗?我们这边保持项目开启状态也还是有概率出现meta文件变化的问题

需要提供下复现demo, 以及复现步骤。 方便排查。谢谢

需要提供下复现demo, 以及复现步骤。 方便排查。谢谢

那个项目已经废弃了没有demo了。我总觉得是和偏好设置/实验室 的某些功能相关。

没有demo,没有办法进一步排查呢。

不用管我这个,先解决更重要的问题吧

现在我这边是小概率会出现,不太好确定是哪里的问题,也就没法精简出一个好复现的demo了。3.8.5的时候打包还正常,升级到3.8.7就出现了,命令行执行正常只有到jenkins打包才出现,meta版本被改到0.0.1导致出错。

我们这边 3.8.8、本机 Mac Jenkins(Homebrew jenkins-lts LaunchAgent)也遇到了。

同一条 --project ... --build ...:Terminal 里跑几乎不改 meta;Jenkins Execute shell 直接跑,经常把大量 .meta 改成 "importer": "*""ver": "0.0.1"。开着同版本空工程再让 Jenkins 构建,我们这边无效。

对比进程:Jenkins 拉起的 Cocos 是 TTY=??,Terminal 拉起的是 ttys00x

绕过(仅 macOS): Jenkins 不要直接 exec Cocos,用下面脚本让 Terminal.app 执行构建。我们连续多次不再脏 meta。

Jenkins 只包启动 Cocos 的那一行:

chmod +x run_in_terminal.sh
./run_in_terminal.sh /Applications/Cocos/Creator/3.8.8/CocosCreator.app/Contents/MacOS/CocosCreator \
  --project /path/to/project \
  --build "configPath=/path/to/buildConfig.json"

run_in_terminal.sh

#!/bin/bash
# 在 macOS Terminal.app 里执行命令,把退出码带回 Jenkins。
# 用于规避 Cocos Creator 3.8.7/3.8.8 在 Jenkins 无 TTY 下 CLI 写脏 .meta。
# 用法: ./run_in_terminal.sh /Applications/Cocos/Creator/3.8.8/CocosCreator.app/Contents/MacOS/CocosCreator --project ... --build "..."
set +x
set -euo pipefail
if [ $# -lt 1 ]; then
    echo "用法: $0 <命令> [参数...]" >&2
    exit 2
fi
run_dir="${RUN_IN_TERMINAL_LOG_DIR:-${TMPDIR:-/tmp}/run_in_terminal}"
mkdir -p "$run_dir"
stamp=$(date +%Y%m%d_%H%M%S)
job_tag=$(printf '%s' "${JOB_NAME:-manual}" | tr -c 'A-Za-z0-9._-' '_')
cmd_file="${run_dir}/${job_tag}_${stamp}.cmd.sh"
log_file="${run_dir}/${job_tag}_${stamp}.log"
exit_file="${run_dir}/${job_tag}_${stamp}.exit"
rm -f "$exit_file"
: > "$log_file"
python3 - "$PWD" "$exit_file" "$@" <<'PY' > "$cmd_file"
import os, shlex, sys
pwd, exit_file = sys.argv[1], sys.argv[2]
cmd = sys.argv[3:]
skip = {
    "PATH", "PWD", "OLDPWD", "SHLVL", "_", "PS1", "PS2", "PS3", "PS4",
    "TERM", "TERM_SESSION_ID", "SHELL", "XPC_SERVICE_NAME", "XPC_FLAGS",
    "LaunchInstanceID", "SECURITYSESSIONID", "COMMAND_MODE",
}
print("#!/bin/zsh")
print("export LC_ALL=${LC_ALL:-en_US.UTF-8}")
print("export LANG=${LANG:-en_US.UTF-8}")
for key, value in os.environ.items():
    if key in skip or key.startswith("BASH_FUNC_"):
        continue
    print(f"export {key}={shlex.quote(value)}")
print(f"cd {shlex.quote(pwd)}")
print('echo "Terminal TTY=$(tty)"')
print("set +e")
print(" ".join(shlex.quote(part) for part in cmd))
print("rc=$?")
print(f"echo $rc > {shlex.quote(exit_file)}")
print("exit $rc")
PY
chmod 700 "$cmd_file"
echo "[run_in_terminal] log=$log_file"
tail -n +1 -F "$log_file" &
tail_pid=$!
trap 'kill "$tail_pid" 2>/dev/null || true; wait "$tail_pid" 2>/dev/null || true' EXIT
osascript - "$cmd_file" "$log_file" <<'APPLESCRIPT'
on run argv
    set cmdPath to item 1 of argv
    set logPath to item 2 of argv
    tell application "Terminal"
        activate
        set theTab to do script "exec /bin/zsh -lc " & quoted form of (cmdPath & " > " & logPath & " 2>&1")
        delay 3
        repeat
            delay 2
            if (busy of theTab) is false then exit repeat
        end repeat
        try
            repeat with w in windows
                if selected tab of w is theTab then
                    close w saving no
                    exit repeat
                end if
            end repeat
        end try
    end tell
end run
APPLESCRIPT
if [ ! -f "$exit_file" ]; then
    echo "[run_in_terminal] 没有退出码,请允许控制 Terminal" >&2
    exit 1
fi
rc=$(cat "$exit_file")
echo "[run_in_terminal] 退出码=$rc"
exit "$rc"

3.8.8 没有遇到过这个问题

stage('Build') {
    steps {
        script {
            echo "【清除缓存】清理 Cocos 构建与中间产物缓存..."
            
            // 1. 在编译前清理指定的 3 个缓存目录
            bat """
                @echo off
                setlocal enabledelayedexpansion
                
                set "DIRS_TO_DELETE[0]=${PROJECT_DIR}\\build\\web-mobile-debug"
                set "DIRS_TO_DELETE[1]=${PROJECT_DIR}\\library"
                set "DIRS_TO_DELETE[2]=${PROJECT_DIR}\\temp"

                for /L %%i in (0,1,2) do (
                    set "TARGET_DIR=!DIRS_TO_DELETE[%%i]!"
                    if exist "!TARGET_DIR!" (
                        echo 正在彻底清理缓存目录: !TARGET_DIR!
                        rd /s /q "!TARGET_DIR!" 2>nul
                        :: 增加重试逻辑,防止文件暂时被系统锁死
                        if exist "!TARGET_DIR!" (
                            timeout /t 1 /nobreak >nul
                            rd /s /q "!TARGET_DIR!" 2>nul
                        )
                        if exist "!TARGET_DIR!" (
                            echo ⚠️ 警告: 目录 !TARGET_DIR! 清理可能不彻底,部分锁死文件未能完全删除。
                        ) else (
                            echo ✅ 成功清除目录: !TARGET_DIR!
                        )
                    ) else (
                        echo ℹ️ 目录不存在,无需清理: !TARGET_DIR!
                    )
                )
            """

            echo "正在执行 Cocos 构建(此时 version.json 已是最新时间,图片已压缩,缓存已擦除)..."
            
            // 2. 执行 Cocos 命令行构建
            try {
                def result = bat(
                    script: "\"${COCOS_EXE}\" --project \"${PROJECT_DIR}\" --build \"stage=build;configPath=${PROJECT_DIR}\\settings\\debug\\build-web-mobile-debug.json\"",
                    returnStatus: true
                )
                echo "Cocos Creator 退出码: ${result}"
                
                if (result != 0 && result != 36) {
                    throw new Exception("Cocos Creator 编译返回了错误码: ${result}")
                } else if (result == 36) {
                    echo "构建成功 (Cocos Creator 退出码 36)"
                }
            } catch (Exception e) {
                echo "❌ 编译失败原因: ${e.message}"
                error "Cocos Creator 编译失败,流水线终止。"
            }
        }
    }
}

3.8.8最新的,我让Jenkins开启了一个Terminal.app跑构建脚本,也没有解决,应该不是这个问题。
这边放几个分析的截图,但是没有完全解决

我的分析就是cocos在没有ttys的情况下没有await importer的加载直接写meta,导致meta大面积污染;