如何从 Github 工作流访问环境机密?

Posted

技术标签:

【中文标题】如何从 Github 工作流访问环境机密?【英文标题】:How to access environment secrets from a Github workflow? 【发布时间】:2021-06-05 20:53:14 【问题描述】:

我正在尝试从 Github 工作流程将Python package 发布到 PyPI,但“Test PyPI”的身份验证失败。我从命令行成功发布到 Test PyPI,所以我的 API 令牌必须是正确的。我还检查了秘密值中的前导和尾随空格(即在 GitHub 上)。

正如上次提交所显示的,我尝试了一些事情但没有成功。

我首先尝试将简单的 bash 命令内联到工作流中,如下所示,但我无法将我的秘密放入环境变量中。当我打印这些变量时,日志中没有任何显示。

- name: Publish on Test PyPI 
  env:
     TWINE_USERNAME: __token__
     TWINE_PASSWORD: $ secrets.PYPI_TEST_TOKEN 
     TWINE_REPOSITORY_URL: "https://test.pypi.org/legacy/"
  run: |
     echo "$TWINE_PASSWORD"
     pip install twine
     twine check dist/*
     twine upload dist/*

我也尝试使用如下专用的 GitHub Action,但它也不起作用。我想问题出在我的工作流程中不可用的秘密。令我困惑的是my workflow 使用另一个令牌/秘密就好了!但是,如果我将它放在环境变量中,则不会打印任何内容。我还以不同的名称(PYPI_TEST_TOKEN 和 TEST_PYPI_API_TOKEN)重新创建了我的秘密,但无济于事。

- name: Publish to Test PyPI
  uses: pypa/gh-action-pypi-publish@release/v1
  with:
    user: __token__
    password: $ secrets.TEST_PYPI_API_TOKEN 
    repository_url: https://test.pypi.org/legacy/

我想我错过了一些明显的东西(像往常一样)。非常感谢任何帮助。

【问题讨论】:

秘密变量是否显示在github.com/username/repo/settings/secrets/actions上? 至于 this run 使用专用操作:“发布到测试 PyPI”步骤不显示 password 作为输入,所以我也想问一下,你如何设置秘密? 是的,我确实看到了settings/secrets/actions 下的秘密。它们被列为我创建的“CI”环境的变量以及我添加变量的位置。如果我在存储库级别创建它可以工作的秘密,我可以将它们放在环境变量中,我会在日志中看到“***”。 【参考方案1】:

我终于明白了。我的错误是我在一个环境中定义了我的秘密,默认情况下,工作流不在任何特定环境中运行。为此,我必须在职位描述中明确命名环境,如下所示:

jobs:
  publish:
    environment: CI    # <--- /!\ Here is the link to the environment
    needs: build
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/v')
    steps:
    - uses: actions/checkout@v2
    # Some more steps here ...
    - name: Publish to Test PyPI
      env:
        TWINE_USERNAME: "__token__"
        TWINE_PASSWORD: $ secrets.TEST_PYPI_API_TOKEN 
        TWINE_REPOSITORY_URL: "https://test.pypi.org/legacy/"
      run: |
        echo KEY: '$TWINE_PASSWORD'
        twine check dist/*
        twine upload --verbose --skip-existing dist/*

documentation 确实提到了它。

感谢那些给我指出正确方向的评论。

【讨论】:

似乎我缺少这方面的一部分。如果您有一个存在于多个环境中的秘密FOO,该怎么办。您希望能够访问FOO,这将根据您所在的分支而有所不同。为此,您不会希望创建不同的工作只是为了能够参考该环境中的秘密......我想知道如何做到这一点。

以上是关于如何从 Github 工作流访问环境机密?的主要内容,如果未能解决你的问题,请参考以下文章

GitHub 不允许将机密传递给可重用的工作流程

有没有办法在使用或不使用 GitHub 工作流的情况下在 Netlify 上的 Flutter Web 部署中使用机密?

使用带有 github 操作的 Flutter Web 时如何访问机密

如何使用个人访问令牌在 github 操作工作流 (B) 中从不同的 repo(B) 提交和推送到私有 repo(A)

外部机密无法从私有集群访问 AWS STS

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