You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:37:21