【问题标题】:How to pass environment variable received from GitHub actions如何传递从 GitHub 操作收到的环境变量
【发布时间】:2020-02-03 03:27:09
【问题描述】:

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

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

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

runs:
  using: 'docker'
  image: 'Dockerfile'

在我的工作流程中,我通过了 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"

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

import os

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

exit(0)

打印出来:

None
It works!

我认为我必须通过我的 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

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

这里是the link to the test repo

【问题讨论】:

  • 您是如何访问 Dockerfile 中 action.yml 中定义的输入参数的?我正在尝试做同样的事情,但我遇到了一些麻烦。

标签: docker dockerfile github-actions


【解决方案1】:

我认为您正在尝试读取错误的环境变量名称。 GitHub Actions 将 INPUT_ 添加到输入变量的名称中。所以尝试以下方法:

print(os.getenv('INPUT_TEST_VAR'))

来自文档:

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

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

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

【讨论】:

    【解决方案2】:

    有点晚了,但是下一个,你也可以使用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"
    

    这将在创建 docker 时包含,并且不带前缀 INPUT_ 传递

    【讨论】:

      【解决方案3】:

      通过在 repo 中的 Settings -> Secrets 中指定它们,然后在工作流中调用它们来保持 env vars 的秘密:

      例如,考虑一个运行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 
      

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

      例如,在 repo 中,假设 src/run.sh 调用 R 脚本,后跟 Python 脚本。

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

      my_var <- Sys.getenv("MY_VAR")
      
      .
      .
      .
      

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

      import os
      
      my_var = os.getenv("MY_VAR")
      .
      .
      .
      

      请参阅docs here

      【讨论】:

        猜你喜欢
        • 2022-06-16
        • 2021-02-16
        • 2021-03-01
        • 2021-06-10
        • 2022-11-10
        • 2023-01-27
        • 2021-11-06
        • 2021-01-07
        • 2021-10-10
        相关资源
        最近更新 更多