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

GitLab CI/CD构建Jar包异常求助:多阶段执行时Jar丢失

问题排查与解决方案

核心问题分析

你的CI配置存在两个关键问题,导致跨阶段构建时Jar包无法被Docker访问:

  1. 工作目录与Artifacts路径不匹配
    Package阶段生成的Jar包存放在项目根目录的target/下,且已通过artifacts声明传递。但Dockerise阶段执行了cd app切换到子目录,此时当前工作目录是app/,而下载的Artifacts仍在项目根目录,Docker构建上下文(app目录)中找不到target/文件夹,自然无法复制Jar包。

  2. Docker镜像缺少OC客户端
    Dockerise阶段使用的docker:latest镜像默认不包含OpenShift的oc命令,执行oc whoami -t会直接报错——你之前将所有命令放同一阶段正常,是因为当时用的是Maven/OpenJDK镜像(已预装OC)。

针对性修复方案

方案1:调整Docker构建上下文与路径

修改Dockerise阶段的脚本,以项目根目录为构建上下文,同时指定app目录下的Dockerfile:

Dockerise:
  stage: dockerise
  image: docker:latest
  tags: [dev]
  only:
    - release
  needs: ["Package artifacts"] # 显式依赖确保Artifacts被下载
  services:
    - docker:dind
  script:
    # 直接在根目录执行build,指定Dockerfile路径
    - docker build -t $CI_OPENSHIFT_REGISTRY/dev/$APP_NAME:latest -f app/Dockerfile .
    # 安装OC客户端(解决docker镜像无oc的问题)
    - apk add --no-cache curl
    - curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/oc/latest/linux/oc.tar.gz
    - tar xzf oc.tar.gz
    - chmod +x oc && mv oc /usr/local/bin/
    - docker login "$CI_OPENSHIFT_REGISTRY" -p $(oc whoami -t) -u "$OPENSHIFT_USER"
    - docker push $CI_OPENSHIFT_REGISTRY/dev/$APP_NAME:latest

同时确保你的app/Dockerfile中COPY指令正确指向根目录的Jar包:

COPY target/*.jar ./app.jar

方案2:复制Jar包到Docker构建目录

如果必须在app目录下执行构建,可先将根目录的Jar包复制到app目录:

Dockerise:
  stage: dockerise
  image: docker:latest
  tags: [dev]
  only:
    - release
  needs: ["Package artifacts"]
  services:
    - docker:dind
  script:
    - cd app
    # 从根目录复制Jar包到当前app目录
    - cp ../target/*.jar .
    - docker build -t $CI_OPENSHIFT_REGISTRY/dev/$APP_NAME:latest .
    # 安装OC客户端
    - apk add --no-cache curl
    - curl -LO https://mirror.openshift.com/pub/openshift-v4/clients/oc/latest/linux/oc.tar.gz
    - tar xzf oc.tar.gz
    - chmod +x oc && mv oc /usr/local/bin/
    - docker login "$CI_OPENSHIFT_REGISTRY" -p $(oc whoami -t) -u "$OPENSHIFT_USER"
    - docker push $CI_OPENSHIFT_REGISTRY/dev/$APP_NAME:latest

对应的Dockerfile调整为:

COPY *.jar ./app.jar

额外优化建议

  • 显式添加needs字段:确保Dockerise阶段必须等待Package阶段完成并下载Artifacts,避免GitLab CI可能的并行执行或缓存异常。
  • 缓存OC客户端:可以将OC客户端加入cache,避免每次构建重复下载,提升效率。

内容的提问来源于stack exchange,提问作者user3904465

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:06:26