Make variable visible across steps in Bitbucket pipelines?

pixel picture pixel · Sep 24, 2018 · Viewed 12.6k times · Source

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?

Answer

Mr-IDE picture Mr-IDE · Mar 26, 2019

For some reason, exported environment variables are not retained between the child items of a "step:" or between the top-level "step:" items (more info about these definitions here). But you can copy all the environment variables to a file, then read them back again (because files are preserved between steps):

1. Share variables between the child items of a "step:"

How to share variables between "script:" and "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:
          # 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:

2. Share variables between the top-level "step:" items

pipelines:
  default:
    - step:
        script:
          - export MY_VAR1="FOO1-$BITBUCKET_BUILD_NUMBER"
    - step:
        script:
          - echo $MY_VAR1 # This will not work

In this scenario, Bitbucket Pipelines will treat the 2 "step:" items as completely independent builds, so the second "step:" will start from scratch with a blank folder and a new git clone.

So you should share files between steps by using declared artifacts, as shown in the answer by belgacea (19 Dec 2019).