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

Posted

技术标签:

【中文标题】使用 tox 和 Github Action 访问环境变量【英文标题】:Access env variable with tox and Github Action 【发布时间】:2021-06-19 12:47:20 【问题描述】:

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

我有一个带有本地 .env 文件的 repo,还有一个 Github Action 工作流,用于在我将提交推送到远程时启动一些工作流。我还将 env 文件的秘密作为键值对放在设置/环境秘密中,我的 env 文件的每一行都有一个秘密 env。

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

如果它很重要,我会使用 tox 来运行我的测试,并在 tox 步骤的 env 块中传递变量。然而,当动作运行时,(sn-p of) 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 打印后,环境变量似乎是空的,即使它们已设置。谁能告诉我为什么?

【问题讨论】:

你能说明你是如何以及在哪里调用passenv 更新了我的帖子;这是在哪里。关于如何,应该是自动的 secrets 默认情况下不会暴露给拉取请求(除非 PR 来自存储库本身)——这些是外部拉取请求吗?推? @AnthonySottile 不,我读到过这个,但它们是在主分支中进行的常规推送;顺便说一句,我找到了解决方案并已经回答(还不能将其标记为已接受) 【参考方案1】:

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

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

【讨论】:

以上是关于使用 tox 和 Github Action 访问环境变量的主要内容,如果未能解决你的问题,请参考以下文章

tox python项目虚拟环境管理自动化测试&&构建工具

tox, cython 和 fasttext

OpenStack基础知识-tox的详解介绍

Python打包:在安装时生成python文件,使用tox

.coveragerc 无法找到我想省略的文件

在 tox+pytest 中使用自己的包