GitLab CI/CD:如何在命令中使用脚本执行时生成的变量?
GitLab CI/CD脚本变量无法解析传递的问题
问题场景
编写的GitLab CI/CD流水线配置如下:
image: maven:3-openjdk-11 variables: TARGET_LOCATION: "/tmp/uploads/" stages: - deploy deploy-job: stage: deploy before_script: - export MAVEN_ARTIFACT_VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*'| tail -1) - export MAVEN_ARTIFACT=app-${MAVEN_ARTIFACT_VERSION:+$MAVEN_ARTIFACT_VERSION.jar} script: - eval $(ssh-agent -s) # (SSH相关配置) - scp -o HostKeyAlgorithms=ssh-rsa -p /builds/xxxxx/app/target/$MAVEN_ARTIFACT user@host:${TARGET_LOCATION}
期望scp命令中的$MAVEN_ARTIFACT解析为类似app-BETA-0.1.jar的文件名,TARGET_LOCATION也能正常取值,但实际执行时变量名未被替换,直接显示为原变量名。流水线执行日志片段如下:
$ scp -o HostKeyAlgorithms=ssh-rsa -p /builds/xxxxx/app/target/$MAVEN_ARTIFACT user@host:${TARGET_LOCATION}
解决方案
1. 调试变量赋值情况
在script阶段开头添加echo命令,确认变量是否被正确赋值:
script: - echo "MAVEN_ARTIFACT_VERSION: $MAVEN_ARTIFACT_VERSION" - echo "MAVEN_ARTIFACT: $MAVEN_ARTIFACT" - echo "TARGET_LOCATION: $TARGET_LOCATION" - eval $(ssh-agent -s) # (SSH相关配置) - scp -o HostKeyAlgorithms=ssh-rsa -p /builds/xxxxx/app/target/$MAVEN_ARTIFACT user@host:${TARGET_LOCATION}
通过日志输出可快速定位是变量未赋值,还是后续命令解析问题。
2. 修正变量赋值语法
原MAVEN_ARTIFACT的赋值使用了冗余的bash空值扩展语法,且可能在sh环境下不兼容,直接改为简单拼接即可:
before_script: - export MAVEN_ARTIFACT_VERSION=$(mvn --non-recursive help:evaluate -Dexpression=project.version | grep -v '\[.*'| tail -1) - export MAVEN_ARTIFACT="app-${MAVEN_ARTIFACT_VERSION}.jar"
若需处理版本号为空的边界情况,可添加默认值扩展:
- export MAVEN_ARTIFACT="app-${MAVEN_ARTIFACT_VERSION:-unknown}.jar"
3. 强制使用bash执行脚本
GitLab CI默认使用sh执行脚本,部分bash变量扩展语法在sh中不支持,可在job中指定使用bash:
deploy-job: stage: deploy variables: SHELL: /bin/bash before_script: # 原before_script内容 script: # 原script内容
4. 避免SSH操作干扰环境变量
SSH相关操作若涉及切换shell或强制分配终端(如ssh -t),可能会重启当前shell导致环境变量丢失,确保SSH配置部分无此类操作。
内容的提问来源于stack exchange,提问作者J W
相关产品推荐
相关产品推荐

