使变量在 Bitbucket 管道的各个步骤中可见?
Make variable visible across steps in Bitbucket pipelines?
我想在两个步骤中共享一个变量。
我这样定义:
- export MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER"
但是当我尝试在其他步骤中打印它时:
- echo $MY_VAR
它是空的。
如何共享这样的变量?
恐怕,但是似乎不可能从一个步骤到另一个步骤共享环境变量,但是您可以在 pipelines
类别下的项目设置中为所有步骤定义全局环境变量。
Settings -> Pipelines -> Repository Variables
出于某种原因,导出的环境变量未保留 在 "step:"
的子项之间或 在顶级 [=13] 的子项之间=] items(关于这些定义的更多信息 here)。但是您可以将所有环境变量复制到一个文件中,然后再次读取它们,因为文件在步骤之间保留:
1。在“步骤:”的子项之间共享变量:
如何在“script:
”和“after-script:
”之间共享变量
pipelines:
default:
- step:
script:
# Export some variables
- export MY_VAR1="FOO1-$BITBUCKET_BUILD_NUMBER"
- export MY_VAR2="FOO2-$BITBUCKET_BUILD_NUMBER"
- echo $MY_VAR1
- echo $MY_VAR2
# Copy all the environment variables to a file, as KEY=VALUE, to share to other steps
- printenv > ENVIRONMENT_VARIABLES.txt
after-script:
# If the file exists, read all the previous environment variables
# from the file, and export them again
- |
if [ -f ENVIRONMENT_VARIABLES.txt ]; then
export $(cat ENVIRONMENT_VARIABLES.txt | xargs)
fi
- echo $MY_VAR1
- echo $MY_VAR2
注意: 尽量避免使用其中包含 space 或换行符的字符串(用于键和值)。 export
命令将无法读取它们,并且可能会抛出错误。一种可能的解决方法是 use sed
to automatically delete any line 其中有一个 space 字符:
# Copy all the environment variables to a file, as KEY=VALUE, to share to other steps
- printenv > ENVIRONMENT_VARIABLES.txt
# Remove lines that contain spaces, to avoid errors on re-import (then delete the temporary file)
- sed -i -e '/ /d' ENVIRONMENT_VARIABLES.txt ; find . -name "ENVIRONMENT_VARIABLES.txt-e" -type f -print0 | xargs -0 rm -f
更多信息:
- https://www.cyberciti.biz/faq/linux-list-all-environment-variables-env-command/ -- 对于
printenv
命令
- Set environment variables from file of key/value pairs
2。在顶级“步骤:”项目之间共享变量
pipelines:
default:
- step:
script:
- export MY_VAR1="FOO1-$BITBUCKET_BUILD_NUMBER"
- step:
script:
- echo $MY_VAR1 # This will not work
在这种情况下,Bitbucket Pipelines 会将 2 个 "step:"
项目视为完全独立的构建,因此第二个 "step:"
将从头开始,其中包含一个空白文件夹和一个新的 git clone
.
因此,您应该使用已声明的 artifacts 在步骤之间共享文件,如 belgacea(2019 年 12 月 19 日)的回答所示。
作为 and explained, you can export your environment variables by writing them to a file and then share this file with a following step as an artifact。一种方法是在一个步骤中将变量写入 shell 脚本,将其定义为 artifact
,然后在下一步中获取它。
definitions:
steps:
- step: &build
name: Build
script:
- MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER"
- echo $MY_VAR
- echo "export MY_VAR=$MY_VAR" >> set_env.sh
artifacts: # define the artifacts to be passed to each future step
- set_env.sh
- step: &deploy
name: Deploy
script:
# use the artifact from the previous step
- cat set_env.sh
- source set_env.sh
- echo $MY_VAR
pipelines:
branches:
master:
- step: *build
- step:
<<: *deploy
deployment: test
注意:就我而言,将 set_env.sh
作为工件发布的步骤并不总是我管道的一部分。遇到这种情况,使用前一定要在下一步检查文件是否存在。
- step: &deploy
name: Deploy
image: alpine
script:
# check if env file exists
- if [ -e set_env.sh ]; then
- cat set_env.sh
- source set_env.sh
- fi
我想在两个步骤中共享一个变量。
我这样定义:
- export MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER"
但是当我尝试在其他步骤中打印它时:
- echo $MY_VAR
它是空的。
如何共享这样的变量?
恐怕,但是似乎不可能从一个步骤到另一个步骤共享环境变量,但是您可以在 pipelines
类别下的项目设置中为所有步骤定义全局环境变量。
Settings -> Pipelines -> Repository Variables
出于某种原因,导出的环境变量未保留 在 "step:"
的子项之间或 在顶级 [=13] 的子项之间=] items(关于这些定义的更多信息 here)。但是您可以将所有环境变量复制到一个文件中,然后再次读取它们,因为文件在步骤之间保留:
1。在“步骤:”的子项之间共享变量:
如何在“script:
”和“after-script:
”之间共享变量
pipelines:
default:
- step:
script:
# Export some variables
- export MY_VAR1="FOO1-$BITBUCKET_BUILD_NUMBER"
- export MY_VAR2="FOO2-$BITBUCKET_BUILD_NUMBER"
- echo $MY_VAR1
- echo $MY_VAR2
# Copy all the environment variables to a file, as KEY=VALUE, to share to other steps
- printenv > ENVIRONMENT_VARIABLES.txt
after-script:
# If the file exists, read all the previous environment variables
# from the file, and export them again
- |
if [ -f ENVIRONMENT_VARIABLES.txt ]; then
export $(cat ENVIRONMENT_VARIABLES.txt | xargs)
fi
- echo $MY_VAR1
- echo $MY_VAR2
注意: 尽量避免使用其中包含 space 或换行符的字符串(用于键和值)。 export
命令将无法读取它们,并且可能会抛出错误。一种可能的解决方法是 use sed
to automatically delete any line 其中有一个 space 字符:
# Copy all the environment variables to a file, as KEY=VALUE, to share to other steps
- printenv > ENVIRONMENT_VARIABLES.txt
# Remove lines that contain spaces, to avoid errors on re-import (then delete the temporary file)
- sed -i -e '/ /d' ENVIRONMENT_VARIABLES.txt ; find . -name "ENVIRONMENT_VARIABLES.txt-e" -type f -print0 | xargs -0 rm -f
更多信息:
- https://www.cyberciti.biz/faq/linux-list-all-environment-variables-env-command/ -- 对于
printenv
命令 - Set environment variables from file of key/value pairs
2。在顶级“步骤:”项目之间共享变量
pipelines:
default:
- step:
script:
- export MY_VAR1="FOO1-$BITBUCKET_BUILD_NUMBER"
- step:
script:
- echo $MY_VAR1 # This will not work
在这种情况下,Bitbucket Pipelines 会将 2 个 "step:"
项目视为完全独立的构建,因此第二个 "step:"
将从头开始,其中包含一个空白文件夹和一个新的 git clone
.
因此,您应该使用已声明的 artifacts 在步骤之间共享文件,如 belgacea(2019 年 12 月 19 日)的回答所示。
作为artifact
,然后在下一步中获取它。
definitions:
steps:
- step: &build
name: Build
script:
- MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER"
- echo $MY_VAR
- echo "export MY_VAR=$MY_VAR" >> set_env.sh
artifacts: # define the artifacts to be passed to each future step
- set_env.sh
- step: &deploy
name: Deploy
script:
# use the artifact from the previous step
- cat set_env.sh
- source set_env.sh
- echo $MY_VAR
pipelines:
branches:
master:
- step: *build
- step:
<<: *deploy
deployment: test
注意:就我而言,将 set_env.sh
作为工件发布的步骤并不总是我管道的一部分。遇到这种情况,使用前一定要在下一步检查文件是否存在。
- step: &deploy
name: Deploy
image: alpine
script:
# check if env file exists
- if [ -e set_env.sh ]; then
- cat set_env.sh
- source set_env.sh
- fi