GitHub Actions执行Docker构建时无法找到前序步骤生成的文件
你遇到的文件找不到问题是几个基础配置疏漏叠加导致的,对应你尝试的三种方案逐一说明:
1. 同Job构建找不到文件的核心原因
- 路径执行错误:你在仓库根目录直接运行
build/workflow.sh时,脚本内所有命令的工作目录是仓库根目录,而非脚本所在的build文件夹。如果你的ant构建配置(build.xml)存放在build目录下,直接在根目录执行ant要么会因为找不到构建文件静默失败,要么会把autodeploy.xar输出到根目录,根本不会放到build文件夹里。 - 校验逻辑未生效:你贴的workflow.sh中用来验证文件存在的
echo $(ls build)是被注释的状态,CI流程中并没有真的执行这行校验,你本地测试的路径环境和CI运行环境不一致,误以为文件已经生成到了正确位置。 - 缺少脚本执行权限:你没有给
build/workflow.sh加可执行权限,部分环境下这步会直接静默失败,后续构建步骤自然拿不到生成的文件。
修复这步直接修改对应Action步骤即可:
- name: Run script to replace template file run: | chmod +x build/workflow.sh cd build ./workflow.sh cd .. ls -la build/ # 强制打印build目录内容,CI日志里可以直接确认xar是否存在
同时把workflow.sh里注释的文件校验逻辑打开,ant执行失败时直接中断流程,不要继续往下跑构建。
2. 拆分双Job构建找不到文件的原因
GitHub Actions的不同Job默认运行在完全隔离的虚拟环境中,文件系统不共享,前一个Job生成的文件不会自动同步到后续依赖的Job。如果要用双Job方案,必须在生成文件的Job末尾用actions/upload-artifact上传生成的build目录,在Docker构建的Job开头用actions/download-artifact把文件拉到当前工作目录,否则永远找不到目标文件。单Job方案不存在这个隔离问题,优先用单Job方案更简单。
3. 脚本内执行docker build报参数错误的原因
这个报错是shell命令拼接问题导致的:要么是脚本里的命令存在多余的换行转义、要么是传入的密码等变量带特殊字符/空格没加引号、要么是脚本从Windows复制过去带了不可见的CR换行符,导致命令实际执行时被截断,才会提示缺少参数。你打印出来的命令看起来完整,但实际传给shell的内容是不完整的。优先用前面的单Job修复路径的方案,直接用官方的build-push-action构建即可,不需要在脚本里手动拼docker build命令,稳定性更高。
补充说明
你当前使用的docker/build-push-action@v3默认以仓库根目录作为构建上下文,只要autodeploy.xar确实存在于根目录下的build文件夹中,Dockerfile里写的COPY build/autodeploy.xar /exist/autodeploy/路径是完全正确的,不需要额外修改Dockerfile或者构建上下文配置。
内容的提问来源于stack exchange,提问作者Prasanna

