如何传递从 GitHub 操作收到的环境变量

Par*_*ram 9 docker dockerfile github-actions

在我的action.yml 中,我定义了一个输入:

name: 'test action'
author: Param Thakkar
description: 'test'

inputs: 
  test_var:
    description: 'A test variable'
    required: true

runs:
  using: 'docker'
  image: 'Dockerfile'
Run Code Online (Sandbox Code Playgroud)

在我的工作流程中,我通过了 test_var:

name: CI

on: [push]

jobs:
  build:

runs-on: ubuntu-latest

steps:
  - name: Test the GH action
    uses: paramt/github-actions-playground@master
    with:
      test_var: "this is just a test"
Run Code Online (Sandbox Code Playgroud)

所以应该有一个在工作流运行时创建的环境变量,对吗?但是当我运行这个简短的 python 脚本时:

import os

print(os.getenv('TEST_VAR'))
print("It works!")

exit(0)
Run Code Online (Sandbox Code Playgroud)

它打印:

None
It works!
Run Code Online (Sandbox Code Playgroud)

我认为我必须通过我的 Dockerfile 传递 ENV 变量......现在我的 Dockerfile 看起来像这样: 

FROM python:latest

# Add files to the image
ADD entrypoint.py /entrypoint.py
ADD requirements.txt /requirements.txt

# Save ENV var in a temp file
RUN $TEST_VAR > /temp_var

# Install dependencies and make script executable
RUN pip install -r requirements.txt
RUN chmod +x entrypoint.py

RUN echo "temp var: "
RUN cat /temp_var

# Run script with the ENV var
ENTRYPOINT export TEST_VAR="$TEST_VAR"; /entrypoint.py
Run Code Online (Sandbox Code Playgroud)

但是变量没有回显,也没有传递给pythons脚本..我错过了什么吗?当我尝试将 my 设置$TEMP_VAR为一段随机字符串时,它会发送到 Python 脚本。这是代表我的错误还是 GitHub 操作未按预期工作?

这是测试仓库的链接

Que*_*tin 9

有点晚了,但对于下一个,您还可以使用该env字段:

name: CI

on: [push]

jobs:
  build:

runs-on: ubuntu-latest

steps:
  - name: Test the GH action
    uses: paramt/github-actions-playground@master
    env:
      test_var: "this is just a test"
Run Code Online (Sandbox Code Playgroud)

它将在创建 docker 期间包含在内,并且不带前缀传递INPUT_

  • 这是否使其在容器内可用还是需要另一个步骤? (3认同)

pet*_*ans 6

我认为您正在尝试读取错误的环境变量名称。GitHub Actions 添加INPUT_到输入变量的名称。因此,请尝试以下操作:

print(os.getenv('INPUT_TEST_VAR'))
Run Code Online (Sandbox Code Playgroud)

从文档:

当您在工作流文件中指定操作的输入或使用默认输入值时,GitHub 会为输入创建一个名为 INPUT_ 的环境变量。创建的环境变量将输入名称转换为大写字母并用 _ 字符替换空格。

例如,如果工作流定义了 numOctocats 和 octocatEyeColor 输入,则操作代码可以使用 INPUT_NUMOCTOCATS 和 INPUT_OCTOCATEYECOLOR 环境变量读取输入的值。

https://help.github.com/en/articles/metadata-syntax-for-github-actions#inputs


Ric*_*loo 5

通过在存储库中指定环境变量Settings -> Secrets,然后在工作流程中调用它们来保持环境变量的秘密:

例如,考虑运行一个R脚本然后运行一个Python脚本的工作流。首先,.github/workflows/my_job.yml注意MY_VAR变量,它指向一个存储的秘密${{ secrets.MY_VAR}}。其余的是标准代码(在 cron 上运行,指定 Ubuntu 操作系统和 Docker 映像,定义工作流程步骤)。

on:
  schedule:
    - cron:  '0 17 * * *'
jobs:
  my_job:
    name: my job
    env:
      MY_VAR: ${{ secrets.MY_VAR }}
    runs-on: ubuntu-18.04
    container:
     image: docker.io/my_username/my_image:my_tag
    steps:
      - name: checkout_repo
        uses: actions/checkout@v2
      - name: run some code
        run: bash ./src/run.sh 
Run Code Online (Sandbox Code Playgroud)

接下来,在组成工作流程的脚本中,您可以像在本地一样访问上面工作流程文件中指定的环境变量。

例如,在存储库中,我们假设src/run.sh调用一个R脚本,然后调用一个Python脚本。

访问R环境变量并存储为对象:

my_var <- Sys.getenv("MY_VAR")

.
.
.
Run Code Online (Sandbox Code Playgroud)

访问Python环境变量并存储为对象:

import os

my_var = os.getenv("MY_VAR")
.
.
.
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档