GitLab中SSH Runner作业调用前置构建产物失败求助
GitLab CI/CD 构建产物跨执行器传递失败问题解决思路
问题描述
使用GitLab自建版14.6,配置了两个CI/CD作业:
build react job:通过Docker执行器运行,执行npm run build生成build/构建产物,已配置artifacts保存该目录deploy on production:通过SSH执行器连接远程Nginx服务器,执行cp命令时报错:cp: cannot stat ‘build’: No such file or directory,无法找到构建产物
当前.gitlab-ci.yaml配置:
build react job: stage: build script: - npm install - npm run build --scripts-prepend-node-path=auto artifacts: paths: - build/ untracked: true deploy on production: stage: deploy tags: - my-srv # SSH执行器Runner的标签 rules: - if: ($CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH == "develope") script: - cp -r build /path/on/my/server/web/content - docker-compose up -d needs: - job: build react job artifacts: true
SSH执行器Runner的/etc/gitlab-runner/config.toml配置:
[[runners]] name = "my-srv" url = "http://gitlab.example.com/" token = "s8XljhkxJd-qj7WxCcew" executor = "ssh" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs] [runners.cache.azure] [runners.ssh] user = "user" password = "pass" host = "172.20.ip.addr" port = "22" identity_file = "/home/gitlab-runner/.ssh/id_rsa"
已尝试dependencies和needs关联两个作业,但问题未解决。
解决思路
确认Artifacts上传状态:在GitLab流水线页面进入
build react job的详情,查看Artifacts选项卡,确认build/目录是否成功上传。若未上传:- 检查
build作业的工作目录,确保npm run build确实在项目根目录生成了build/ - 删除
artifacts中的untracked: true,该配置会混入无关文件,可能干扰指定路径的上传,仅保留paths: - build/
- 检查
排查SSH执行器的文件路径:在
deploy作业的script中添加目录检查命令,确认构建产物的实际位置:- pwd - ls -la如果
build/不在当前目录,说明Artifacts被下载到了临时路径,需调整cp命令的源路径,或先进入对应目录。检查Runner权限与日志:
- 确认SSH执行器的Runner token有效,且项目未限制Artifacts访问权限
- 查看Runner日志(执行
gitlab-runner logs),检查deploy作业执行时是否有Artifacts下载失败的报错信息
绕过Artifacts直接传输:若跨执行器的Artifacts传递仍有问题,可在
build作业中直接将产物传到远程服务器:# 在build作业的script末尾添加 - rsync -avz build/ user@172.20.ip.addr:/path/on/my/server/web/content前提是Docker执行器所在服务器能通过SSH访问远程Nginx服务器,需在Docker容器中配置对应SSH密钥。
验证needs配置正确性:确保
needs中的作业名称与build作业完全一致(当前配置为build react job无拼写错误),且deploy阶段在build阶段之后(已满足)。
内容的提问来源于stack exchange,提问作者foad322
相关产品推荐
相关产品推荐

