GitLab CI/CD Pipeline作业before_script中拼接两个变量不生效问题
问题根因
- 你把
prefix_common的计算逻辑放在了for循环外部,是对find返回的所有文件路径整体做切割,而非针对当前循环的单个文件路径计算对应值,如果你本地测试时刚好只有一个文件,所以结果符合预期,但GitLab CI环境下的文件列表和你本地不一致,就会出现值异常 - 你当前的
for循环遍历find结果的写法,在GitLab CI默认的POSIX shell环境下会有分词异常问题,很容易导致common_file变量赋值为空,最终拼接结果就会出现前缀缺失,只有_filesuffix的情况 - 你写的
cp命令里的变量拼接引号规则混乱,也会增加变量解析异常的概率
修复方案
调整后的before_script如下,把前缀计算移到循环内部,优化变量引用规则,同时显式指定用bash执行避免shell兼容问题:
before_script: - rm -rf .terraform - terraform --version - mkdir ~/.aws - echo "[default]" > ~/.aws/credentials - echo "aws_access_key_id=$AWS_ACCESS_KEY_ID" >> ~/.aws/credentials - echo "aws_secret_access_key=$AWS_SECRET_ACCESS_KEY" >> ~/.aws/credentials - mkdir ./deployments - ls common # 改用while遍历find结果,避免文件名含特殊字符时分词错误 - find common -type f | while read -r f; do common_file="$(basename "$f")" # 针对当前单个文件计算前缀,不要在循环外全局计算 prefix_common="$(echo "$f" | cut -d"/" -f 1)" # 简化变量拼接的引号写法,整段用双引号包裹即可 cp "$f" "./deployments/${common_file}_${prefix_common}"; done
如果还是有变量解析问题,可以在脚本开头加set -x打印执行过程的变量值,方便快速定位异常。
内容的提问来源于stack exchange,提问作者user6866797
相关产品推荐
相关产品推荐

