19

I want to execute a python script to set some environment variables in GitHub actions. I want to use those environment variables later in my GitHub actions steps. My python script looks like:

new_ver = get_version_from_commit(commit_msg)
if new_ver:
    if new_ver == "false":
        os.environ["SHOULD_PUSH"] = "0"
        print("Not pushing the image to k8s")
        exit(0)
    else:
        new_tag = app_name + ":" + str(new_ver)
        os.environ["DOCKER_IMAGE_TAG"] = new_tag
        os.environ["SHOULD_PUSH"] = "1"
        print("New tag: " + new_tag)
        exit(0)

Part of my GitHub actions file, after the execution of the above python script looks like:

- name: Print env var
  run: echo ${{ env.DOCKER_IMAGE_TAG }}
- name: Build and push
  id: docker_build
  uses: docker/build-push-action@v2
  with:
     push: true
     tags: ${{ secrets.DOCKER_REGISTRY }}/${{ env.DOCKER_IMAGE_TAG }}

But using os.environ won't expose the environment variable outside of the python process. How can I fix this ?

4 Answers 4

32

You cannot set environment variables directly. Instead, you need to write your environment variables into a file, whose name you can get via $GITHUB_ENV.

In a simple workflow step, you can append it to the file like so (from the docs):

echo "{name}={value}" >> $GITHUB_ENV

In python, you can do it like so:

import os

env_file = os.getenv('GITHUB_ENV')

with open(env_file, "a") as myfile:
    myfile.write("MY_VAR=MY_VALUE")

Given this python script, you can set and use your new environment variable like the following:

- run: python write-env.py
- run: echo ${{ env.MY_VAR }}
Sign up to request clarification or add additional context in comments.

8 Comments

why do you need write into a file "a"? how does it write for file "a"?
"a" is not the filename, but the mode. It means open the file in append mode.
ah, yeah! That is true, I see the code now, thank you
Does this work today?
Note: myfile.write(...) does not append a newline, whereas print(..., file=myfile) does. So print is the correct equivalent to echo "..." >> $GITHUB_ENV.
|
4

I asked me how to set two or more environment variables. You have te seperate these variables with a linebreak. Here is an example:

import os

env_file = os.getenv('GITHUB_ENV')

with open(env_file, "a") as myfile:
    myfile.write("MY_VAR1=MY_VALUE1\n")
    myfile.write("MY_VAR2=MY_VALUE2")

Comments

0

Another, maybe more straightforward, way is to print a value in your Python code and "catch" it on the bash level, after which you can append it to GITHUB_OUTPUT variable -

script.py

def main():
    print("SOME VALUE")

if __name__ == "__main__":
    main()

workflow.yml

- id: set-variable
  run: |
    YOUR_VARIABLE=$(python script.py)
    echo "YOUR_VARIABLE=${YOUR_VARIABLE}" >> $GITHUB_OUTPUT
- name: Use your variable
  run: |
    echo "Your variable value is ${{ steps.set-variable.outputs.YOUR_VARIABLE }}"

Comments

0

For some reason, accepted answer did not work for me. The following did work. Basically I am running an "echo ...." command from the python script.

var_name='DUMMY__ARG'
var_value="New_dummy_arg_value"
echo_statement="echo "+"\""+var_name+"="+var_value+"\""+" >> $GITHUB_ENV"
print("sending the following to os.system")
print(echo_statement)
os.system(echo_statement)

In the workflow, both of the following worked to access the variable in my case: ${{ env.DUMMY__ARG}} or $DUMMY__ARG

Note that "the step that creates or updates the environment variable does not have access to the new value, but all subsequent steps in a job will have access." from the documentation: GitHub Action Set $GITHUB_ENV Not Saving

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.