GitLab CI/CD构建Jar包异常求助:多阶段执行时Jar丢失
问题排查与解决方案
核心问题分析
你的CI配置存在两个关键问题,导致跨阶段构建时Jar包无法被Docker访问:
工作目录与Artifacts路径不匹配
Package阶段生成的Jar包存放在项目根目录的target/下,且已通过artifacts声明传递。但Dockerise阶段执行了cd app切换到子目录,此时当前工作目录是app/,而下载的Artifacts仍在项目根目录,Docker构建上下文(app目录)中找不到target/文件夹,自然无法复制Jar包。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
相关产品推荐
相关产品推荐

