在Bitbucket管道的各个步骤中使变量可见吗?

pix*_*xel 9 environment-variables bitbucket-pipelines

我想在两个步骤中共享一个变量。

我将其定义为:

- export MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER"
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在其他步骤中打印它时:

- echo $MY_VAR
Run Code Online (Sandbox Code Playgroud)

它是空的。

我如何共享这样的变量?

bel*_*cea 16

正如Mr-IDERik Tytgat解释的那样,您可以通过将环境变量写入文件来导出环境变量,然后通过以下步骤将该文件作为工件共享。一种方法是在一个步骤中将变量写入 shell 脚本,将其定义为 an 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
Run Code Online (Sandbox Code Playgroud)

注意:就我而言,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
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人想知道示例中的 &lt;&lt; 语法...“YAML 中的 &lt;&lt;: 运算符可用于将一个映射的内容导入到另一个映射中,类似于 Python 或 . .. JavaScript 中的对象解构运算符” - /sf/answers/2874565571/ (3认同)
  • 不幸的是,没有“环境:”或“变量:”选项,因此您可以为共享步骤定义选项,然后使用不同的值并行运行相同的步骤。额外的代码量几乎不需要复制该步骤几次。另一种选择是仅使用 BB 管道作为 shell 脚本的运行程序,以便将变量作为参数传递给脚本。yaml 文件中的内容要简单得多,但有其自身的问题,可能会也可能不会使问题变得更好/更糟。 (3认同)
  • 这将在可下载文件中公开环境变量,对吗?这可能是一个安全问题 (2认同)

akm*_*ith 10

我知道这个问题相当老了,但我找到了一种更干净的方法,无需跨步骤上传和下载工件。

您可以使用定义中的命令锚定脚本,EXPORT并将其显式重用为步骤的一部分,而不是定义锚定步骤。请注意,脚本锚中定义的脚本是单行脚本,需要&&多个命令。

definitions:
  commonItems:
    &setEnv export MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER" && 
      export MY_VAR_2="Hey" &&
      export MY_VAR_3="What you're building"
Run Code Online (Sandbox Code Playgroud)

以下是您在步骤中的调用方式。

steps:
  step:
    - name: First step
      script:
        - *setEnv
        - echo $MY_VAR # FOO-1
        - echo $MY_VAR_2 # Hey
        - echo $MY_VAR_3 # What you're building

    - name: Second step
      script:
        - *setEnv
        - echo $MY_VAR # FOO-1
        - echo $MY_VAR_2 # Hey
        - echo $MY_VAR_3 # What you're building
Run Code Online (Sandbox Code Playgroud)


Mr-*_*IDE 9

您可以将所有环境变量复制到文件中,然后重新读取它们:

- step1:
  # 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

- step2:
  # Read all the previous environment variables from the file, and export them again
  - export $(cat ENVIRONMENT_VARIABLES.txt | xargs)
  - echo $MY_VAR1
  - echo $MY_VAR2

Run Code Online (Sandbox Code Playgroud)

注意:尽量避免使用其中包含空格或换行符的字符串(用于键或值)。该export命令将无法读取它们,并且可能引发错误。一种可能的解决方法是使用sed来自动删除其中包含空格字符的任何行

# 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
Run Code Online (Sandbox Code Playgroud)

更多信息:

  • 这是行不通的,因为存储库没有更新,下一步将从分支/提交的 `git clone` 开始,你的 `ENVIRONMENT_VARIABLES.txt` 将消失。不过,这**是**可能使用工件的。在您的“bitbucket-pipelines.yml”文件中添加“ENVIRONMENT_VARIABLES.txt”作为工件,它将在下一步中可用(如果下一步在 7 天内运行,则工件将在一周后删除)。 (4认同)
  • @vladimirror 不,“ENVIRONMENT_VARIABLES.txt-e”是正确的。然而,可能不需要整个“find”命令。我添加它只是因为 MacOS 上的 `sed -i -e` 会导致创建一个新的临时文件(文件名后附加“-e”)。但 Linux/Ubuntu 上的 sed 没有这个 bug。Bitbucket Pipelines 通常在 Linux/Ubuntu 计算机上运行。 (2认同)

Jac*_*mov 8

恐怕,但是似乎不可能从一个步骤到另一个步骤共享环境变量,但是您可以在pipelines类别下的项目设置中为所有步骤定义全局环境变量。

Settings -> Pipelines -> Repository Variables
Run Code Online (Sandbox Code Playgroud)