问题描述
正在尝试将现有的构建基础设施迁移到Rancher和其CICD流水线。他的主要问题是:是否可以在不同阶段之间传递环境变量?
用户的应用程序是基于Java / Spring的(因此有一个包含版本等信息的pom.xml)。他想要提取像VERSION和CHANNEL(快照或发布)这样的信息,这些信息在下一步(’构建和部署镜像’)中需要,因为我们需要为’docker build’命令提供一些环境变量。
用户知道可以通过共享的工作目录传递数据,但不幸的是,只能通过’PLUGIN_BUILD_ARGS’变量将环境变量传递给’构建和部署镜像’阶段中的’docker build’命令(参考链接:https://rancher.com/docs/rancher/v2.x/en/k8s-in-rancher/pipelines/#build-and-publish-images)。用户还发现在’构建和部署镜像’容器中运行脚本来提供这些环境变量似乎是不可能的。
用户还了解到Rancher提供了一系列环境变量(参考链接:https://rancher.com/docs/rancher/v2.x/en/k8s-in-rancher/pipelines/#pipeline-variable-substitution-reference),但这些变量都无法满足他的需求。用户想知道是否有办法扩展这个环境变量列表。
用户已经尝试传递变量,但没有成功:
stages:
- name: export
steps:
- runScriptConfig:
image: maven
shellScript: |-
export FOO="bar"
- name: echo
steps:
- runScriptConfig:
image: maven
shellScript: |-
env
echo ${FOO}
timeout: 60
notification: {}
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在Rancher流水线中,可以使用export
命令将环境变量从一个阶段传递到另一个阶段。以下是如何在不同阶段之间传递环境变量的步骤:
1. 在源阶段中使用export
命令设置要传递的环境变量。例如,export FOO="bar"
。
2. 在目标阶段中使用${{FOO}}
语法引用传递的环境变量。例如,echo ${{FOO}}
。
下面是一个示例流水线配置:
stages:
- name: export
steps:
- runScriptConfig:
image: maven
shellScript: |-
export FOO="bar"
- name: echo
steps:
- runScriptConfig:
image: maven
shellScript: |-
echo ${{FOO}}
timeout: 60
notification: {}
在上面的示例中,我们在export
阶段中设置了环境变量FOO
为"bar"
。然后,在echo
阶段中,我们使用${{FOO}}
引用了传递的环境变量。这将在日志中打印出"bar"
。
方案2
如果在Rancher流水线中无法直接传递环境变量,可以考虑使用文件来传递数据。以下是一种可能的方法:
1. 在源阶段中,将要传递的环境变量写入一个文件。例如,echo "FOO=bar" > env.txt
。
2. 在目标阶段中,读取该文件并将环境变量导入。例如,source env.txt
。
下面是一个示例流水线配置:
stages:
- name: export
steps:
- runScriptConfig:
image: maven
shellScript: |-
echo "FOO=bar" > env.txt
- name: echo
steps:
- runScriptConfig:
image: maven
shellScript: |-
source env.txt
echo $FOO
timeout: 60
notification: {}
在上面的示例中,我们在export
阶段中将环境变量FOO
写入了一个名为env.txt
的文件。然后,在echo
阶段中,我们使用source env.txt
命令将环境变量导入,并在日志中打印出"bar"
。
请注意,这种方法需要在目标阶段中使用source
命令来导入环境变量。这可能会有一些限制,具体取决于Rancher流水线的配置和环境。
方案3
如果以上方法都无法满足需求,可以考虑使用第三方工具或脚本来传递环境变量。以下是一种可能的方法:
1. 在源阶段中,将要传递的环境变量写入一个文件。例如,echo "FOO=bar" > env.txt
。
2. 在目标阶段中,使用第三方工具或脚本来读取该文件并将环境变量导入。具体的工具或脚本取决于你的需求和环境。
请注意,这种方法可能需要额外的配置和设置,并且可能会增加复杂性。确保在使用第三方工具或脚本之前,仔细评估其适用性和安全性。
以上是几种在Rancher流水线中传递环境变量的方法。根据你的具体需求和环境,选择适合你的方法。