使用 tox 和 Github Action 访问环境变量

问题描述

TL;DR:空环境变量,但我不知道为什么。

我有一个带有本地 .env 文件的存储库和一个 Github Action 工作流,用于在我将提交推送到远程时启动一些工作流。我还将 env 文件的秘密作为键值对放在 Settings / Environment secrets 中,我的 env 文件的每一行一个秘密 env。

问题是:当我在本地运行我的测试时,一切都很好,我的测试套件毫无问题地通过了。 但是,当我推送更改并启动工作流时,它们(覆盖和测试)失败,因为未找到秘密 - 这对于测试来说是必需的 - 即使应该找到。

如果这很重要,我会使用 tox 来运行我的测试,并在 env 步骤的 tox 块中传递变量。但是,当操作运行时,tox 输出(的片段)是:

     def __init__(self):
        token = os.getenv("TELEGRAM_TOKEN",None)
        if not token:
>           raise ValueError("Missing token!")
E           ValueError: Missing token!

我的 coverage.yml 看起来像这样(tests.yml 与 env 块类似):

name: Coverage

on: [push,pull_request]

jobs:
  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@master
      - name: Setup python
        uses: actions/setup-python@v2
        with:
          python-version: 3.9
      - run: pip install tox
      - run: tox -e coverage
        env:
          TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
          TELEGRAM_CHAT_IDS: ${{ secrets.TELEGRAM_CHAT_IDS }}

编辑: 我还发现认情况下,tox 会限制作为 env 传递的内容;然而,即使使用 passenv,我也总是犯同样的错误

编辑 2: 我的tox.ini的片段。

[testenv:coverage]
passenv = TELEGRAM_TOKEN TELEGRAM_CHAT_IDS

deps =
    -r requirements/base.txt
    -r requirements/test.txt

commands =
    coverage erase
    coverage run
    coverage html
    coverage xml
    coverage report -m

编辑 3: 尝试使用 act 和一些 echo 打印后,环境变量似乎是空的,即使它们已设置。有人能告诉我为什么吗?

解决方法

问题是没有为job设置环境(source),所以即使查询正确,变量始终为空;事实上,当我将秘密上传到存储库变量时,它被检测到了。

向作业添加 environment: <name> 解决了问题。