Make variable visible across steps in Bitbucket pipelines?

喜夏-厌秋 提交于 2020-12-29 02:46:47

问题


I would like to share a variable across two steps.

I define it like:

- export MY_VAR="FOO-$BITBUCKET_BUILD_NUMBER"

but then when I try to print it in other step:

- echo $MY_VAR

it's empty.

How I can share such variable?


回答1:


I'm afraid, but it seems impossible to share environment variable from one step to another, BUT you can define global environment variables for all steps in the settings of the project under pipelines category.

Settings -> Pipelines -> Repository Variables



回答2:


For some reason, exported environment variables are not retained between steps. But you can copy all the environment variables to a file, then read them back again (because files are preserved between steps):

- 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

Note: Try to avoid using strings that have spaces or new line characters in them (for the keys or values). The export command will have trouble reading them, and can throw errors. One possible workaround is to use sed to automatically delete any line that has a space character in it:

# 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

More info:

  • https://www.cyberciti.biz/faq/linux-list-all-environment-variables-env-command/ -- for printenv command
  • Set environment variables from file of key/value pairs



回答3:


As Mr-IDE and Rik Tytgat 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. One way to do so is to write your variables to a shell script in a step, define it as an artifact and then source it in the next step.

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

NB: In my case, the step which publish set_env.sh as an artifact is not always part of my pipelines. In this case, be sure to check if the file exists in the next step before using it.

- 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


来源:https://stackoverflow.com/questions/52481242/make-variable-visible-across-steps-in-bitbucket-pipelines

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!