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

fch*_*vel 5 python environment-variables token pypi github-actions

我正在尝试从 Github 工作流中将Python 包发布到 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/*
Run Code Online (Sandbox Code Playgroud)

我还尝试使用专用的 GitHub Action 如下,但它也不起作用。我想问题出在我的工作流程中不可用的秘密。让我感到困惑的是,我的工作流程使用另一个令牌/秘密就好了!但是,如果我将它放在环境变量中,则不会打印任何内容。我还以不同的名称(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/
Run Code Online (Sandbox Code Playgroud)

我想我错过了一些明显的东西(像往常一样)。任何帮助都受到高度赞赏。

fch*_*vel 8

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

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/*
Run Code Online (Sandbox Code Playgroud)

文件提到它实际上。

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

  • 看来我在这方面遗漏了一部分。如果您有一个存在于多个环境中的秘密“FOO”怎么办?您希望能够访问“FOO”,这将根据您所在的分支而有所不同。为此,您不会希望创建不同的作业只是为了能够引用该环境中的秘密...我想知道如何做到这一点。 (3认同)

小智 6

这是我遇到的问题,因为我正在使用多个环境,并且它们都共享具有不同值的相同命名秘密,因此以下解决方案对我有用。到处都有描述孤立的部分,但如何将它们拼凑在一起并不明显。

workflow_dispatch首先,我定义在事件期间选择环境:

on:
  workflow_dispatch:
    inputs:
      environment:
        type: choice
        description: Select the environment
        required: true
        options:
          - TEST
          - UAT
Run Code Online (Sandbox Code Playgroud)

然后我在工作上下文中引用它:

jobs:
  run-portal-tests:
    runs-on: ubuntu-latest
    environment: ${{ github.event.inputs.environment }}
Run Code Online (Sandbox Code Playgroud)

最后在我需要它们的步骤中使用:

- name: Run tests
    env:
      ENDPOINT: ${{ secrets.ENDPOINT }}
      TEST_USER: ${{ secrets.TEST_USER }}
      TEST_USER_PASSWORD: ${{ secrets.TEST_USER_PASSWORD }}
      CLIENT_ID: ${{ secrets.CLIENT_ID }}
      CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }}
    run: python3 main.py
Run Code Online (Sandbox Code Playgroud)