Jenkins+Github+NodeJS+Docker脚本构建偶发文件不存在错误求助
先帮你拆解下核心问题:直接推送到master分支部署一切正常,但合并Pull Request后就会触发找不到/home/application/api/jenkins-data/logs/sse-events/job文件的错误,而且这个问题是偶发的——再次直接推送master又能恢复。结合你的脚本和场景,我梳理了几个最可能的原因和对应的解决思路:
1. PR合并引入了文件结构或忽略规则的变化
直接推master时,服务器上的jenkins-data/logs/sse-events/job文件可能是之前运行遗留下来的,但你合并的PR里可能做了这些操作:
- 修改了
.gitignore,把jenkins-data/logs/这类目录加入了忽略列表,导致git pull后服务器上的这个文件被删除; - 修改了
docker-compose.production.yaml的构建配置,让Docker尝试打包jenkins-data/logs/目录下的文件; - 甚至直接删除了
jenkins-data/logs/sse-events相关的目录结构。
解决思路:
- 仔细查看合并的PR提交记录,重点检查
.gitignore、docker-compose.production.yaml、.dockerignore这几个文件的修改; - 如果确实是PR修改了忽略规则,要么调整规则保留必要文件,要么在构建前确保目标文件被生成。
2. 服务器部署目录存在未提交的文件,合并时被冲突覆盖
当你合并PR时,服务器上的/home/application/api目录可能存在未被Git追踪的文件(比如jenkins-data/logs/sse-events/job是运行时生成的日志文件),执行git pull时如果PR的修改和这些本地文件产生冲突,Git可能会自动回滚或删除这些未追踪文件,导致后续Docker构建找不到文件。
解决思路:
修改你的deploy.sh,在git pull前先清理本地未提交的文件,确保目录是干净的:
echo '**** Cleaning up uncommitted changes...' # 临时暂存未提交文件,避免pull时冲突 git stash push -m "temp stash before deploy" echo '**** Getting latest changes from git repo...' git pull # 如果不需要恢复暂存的日志文件,可以跳过下面这行 # git stash pop
如果确定不需要保留任何本地修改,也可以用更激进的方式(谨慎使用,会删除所有未提交文件):
git reset --hard HEAD && git pull
3. Docker构建上下文包含了动态生成的日志目录
你的production-build.sh只是执行docker-compose build,而Docker默认会把当前目录作为构建上下文打包。如果docker-compose.production.yaml里的服务没有排除jenkins-data/logs/目录,或者.dockerignore没配置忽略这个目录,Docker就会尝试打包该目录下的所有文件——但job文件是Jenkins运行时动态生成的,PR合并后还没生成就触发了构建,自然会报错。
解决思路:
在项目根目录的.dockerignore文件中添加以下内容,让Docker构建时跳过这些动态日志目录:
jenkins-data/ logs/
这样不管目录下有没有文件,Docker都不会尝试打包它们,从根源避免文件找不到的问题。
4. 检查Docker-Compose的构建指令
打开docker-compose.production.yaml,查看每个服务的build配置,确认是否有ADD或COPY指令明确要复制jenkins-data/logs/sse-events/job文件。如果有,要么调整指令复制必要的文件,要么确保在构建前这个文件能被生成。
验证方法
你可以手动在服务器上模拟PR合并的场景:
- 切换到一个测试分支,合并目标PR的内容;
- 手动执行
deploy.sh里的每一步命令,看是否能复现错误; - 逐步排查每一步的文件变化,定位具体是哪个操作导致了
job文件丢失。
内容的提问来源于stack exchange,提问作者Florin Mateescu

