命令行构建会发生,
meta 文件全都有变化
手动正常构建是没问题的。
3.8.7的最新6月4日版本
之前感觉没问题啊,今天构建就这样。
meta 文件变化之后,生成的工程也是黑屏有报错。
升级到了7月的社区版,问题依旧。
看上去 meta 文件都自动改错了。
命令行构建会发生,
meta 文件全都有变化
手动正常构建是没问题的。
3.8.7的最新6月4日版本
之前感觉没问题啊,今天构建就这样。
meta 文件变化之后,生成的工程也是黑屏有报错。
升级到了7月的社区版,问题依旧。
看上去 meta 文件都自动改错了。
7月3日早上上班自动又好了,命令行构建也不会弄乱 meta 文件了。构建的结果也正常了。昨天晚上甚至电脑都没关也没重启。
有点怀疑是昨天编辑器登录不了自己的账号有关,我试了几次登录不了,用 skip 继续的。
保持一个3.8.7项目开启,jenkins构建其他的就正常,关闭掉就不行了
很奇葩
我开着也不行,但是,开着还得是同时进行着构建,同时 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 编译失败,流水线终止。"
}
}
}
}
我的分析就是cocos在没有ttys的情况下没有await importer的加载直接写meta,导致meta大面积污染;