如何将GitLab CI脚本步骤的变量传递到制品配置?
解决GitLab CI中动态版本制品的上传问题
问题原因
GitLab CI的job配置(包括artifacts.paths)是在job启动前就完成解析的,而你在script步骤中定义的MAVEN_VERSION变量是job运行时才生成的。所以解析制品路径时,这个变量还没有值,导致路径变成/target/application-.jar,自然找不到文件。
解决方案(无需通配符)
方案1:重命名制品为固定路径
在script步骤中,获取版本号后将生成的jar文件重命名为固定名称,然后artifacts直接指定这个固定路径即可:
build️: script: - MAVEN_VERSION="$(mvn help:evaluate -q -DforceStdout -D"expression=project.version")" - echo $MAVEN_VERSION - mvn clean install # 将动态版本的jar重命名为固定名称 - cp ./target/application-${MAVEN_VERSION}.jar ./target/application.jar image: maven:3.9.9-amazoncorretto-17 stage: build artifacts: paths: [./target/application.jar]
方案2:通过dotenv传递变量到后续job(如果需要跨job使用版本号)
如果需要在后续job中基于这个动态版本号处理制品,可以在当前job中将版本号写入.env文件,通过reports:dotenv让GitLab识别这个变量,后续job就能直接引用:
当前job配置:
build️: script: - MAVEN_VERSION="$(mvn help:evaluate -q -DforceStdout -D"expression=project.version")" - echo $MAVEN_VERSION - mvn clean install # 将版本号写入.env文件 - echo "MAVEN_VERSION=${MAVEN_VERSION}" > ./maven_version.env image: maven:3.9.9-amazoncorretto-17 stage: build artifacts: paths: [./target/application-${MAVEN_VERSION}.jar] reports: dotenv: ./maven_version.env
后续job可以直接使用$MAVEN_VERSION变量:
deploy: script: - echo "Deploying version $MAVEN_VERSION" # 使用制品中的application-${MAVEN_VERSION}.jar stage: deploy needs: [build]
注意:方案2中当前job的
artifacts.paths依然无法直接使用$MAVEN_VERSION,因为配置解析时机的问题,所以如果只是当前job上传制品,方案1更直接。
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

