CI/CD流水线:如何在artifacts路径中使用脚本变量及替代方案
关于CI/CD流水线artifacts路径使用动态变量的问题
首先直接给你答案:没办法直接在artifacts的paths里使用TEST_VAR这种在script阶段导出的运行时变量。
为什么不行?
你原来的流水线配置里,TEST_VAR是在inject阶段的script中通过export设置的,这属于运行时变量——只有当这个阶段的脚本实际执行时,这个变量才会被赋值。但CI/CD系统在流水线初始化阶段就会解析artifacts的配置(包括paths字段),这时候TEST_VAR还没有被定义,自然没法正确识别路径。
看你原来的配置:
inject: stage: inject script: - echo "testDownload.zip" > varName.txt - export TEST_VAR=$(cat varName.txt) - echo $TEST_VAR #This is working - wget http://some.url.com/download/testDownload.zip artifacts: name: paths: - $TEST_VAR expire_in: 1h
这里echo $TEST_VAR能正常输出是因为它在script运行时执行,但artifacts.paths里的$TEST_VAR在流水线启动时就被解析了,此时变量还不存在,所以会失效。
可行的替代方案
你找到的这个方案确实能解决问题,我再帮你理下逻辑:
通过将动态文件名的压缩包解压到一个固定路径的目录,然后把整个目录作为artifacts上传,这样后续所有阶段都能访问这个目录下的所有内容,完全不受动态文件名的影响。
完整配置如下:
variables: INJECTION_PATH: "./Test/" inject: stage: inject before_script: - sudo apt-get -qq install unzip script: - wget http://some.url.com/download/7d8e6751-2ca3-477c-9185-7097932c3043.zip - unzip ./7d8e6751-2ca3-477c-9185-7097932c3043.zip -d $INJECTION_PATH artifacts: paths: - $INJECTION_PATH expire_in: "600"
这个方案的核心是用固定目录替代动态文件名,绕过了artifacts无法识别运行时变量的限制,虽然需要额外的解压步骤,但确实能保证后续阶段获取到文件的原始内容。
内容的提问来源于stack exchange,提问作者pinas
相关产品推荐
相关产品推荐

