GitHub Actions - 清空环境机密

新手上路,请多包涵

我已经开始玩 GitHub 操作,但我正在努力访问我作为 env 传递的存储库机密。

我的工作流程文件:

 name: Invite

on:
  pull_request:
    branches: [master]
    types: [closed]
jobs:
  invite:
    runs-on: ubuntu-latest
    steps:
      - name: Hello world action
        uses: lekterable/inclusive-organization-action@master
        env:
          SECRET_TOKEN: ${{ secrets.SECRET_TOKEN }}
          organization: string
          SUPER_SECRET: ${{ secrets.SUPER_SECRET }}

动作索引文件

const core = require('@actions/core')
const github = require('@actions/github')

const run = async () => {
  try {
    ...
    console.log('env', process.env)
    const token = process.env.SECRET_TOKEN
    const secret = process.env.SUPER_SECRET
    const organization = process.env.organization
    console.log('organization', organization)
    console.log('token?', !!token)
    console.log('secret?', !!secret)
    console.log('token length', token.length)
    ...
  } catch (error) {
    core.setFailed(error.message)
  }
}

run()

如您所见,我传递了 3 个环境,值为“string”的组织按预期存在,但 SECRET_TOKEN 和 SUPER_SECRET 为空。

在此处输入图像描述

是的,我确实在运行该操作的回购协议中设置了秘密:

在此处输入图像描述

我做错了什么吗?

原文由 lekterable 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 787
2 个回答

我找到了一个解决方案,我所做的是解决这个问题,而不是在关闭 PR 时运行操作,我在 master 上的新提交上运行它,这必须由具有“写入权限”的人触发回购,因此,它可以访问回购秘密。

检查提交是否为合并提交有点困难,我们必须显式获取有关 PR 的更多信息,但它有效。如果有人感兴趣,我试图构建的动作的源代码: https ://github.com/lekterable/inclusive-organization-action

原文由 lekterable 发布,翻译遵循 CC BY-SA 4.0 许可协议

更新

虽然下面的原始答案仍然适用于 公共 存储库,但有一些 新的更新 可能对某些用例有所帮助。

  • 如果您的存储库是私有的,您现在可以从复刻 启用工作流

  • 如果您的存储库是公开的,则有一个新的 pull_request_target 事件不受任何令牌限制。

原始答案

您遇到此行为的原因是因为 Invite 工作流是由来自分叉存储库的拉取请求触发的。

除了 GITHUB_TOKEN 之外,当从分叉存储库触发工作流时,秘密不会传递给运行器。

发生这种情况时,工作流的 actor 就是打开拉取请求的用户。如果该用户没有对您的存储库的写入权限,则他们不能使用机密( GITHUB_TOKEN 除外)。

任何对存储库具有写入权限的人都可以创建、读取和使用机密。

参考: https ://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#using-encrypted-secrets-in-a-workflow

如果您在工作流程中运行此步骤,您会发现它与您的操作无关。 TEST_SECRET 秘密在工作流中也不可用。

       - name: Test
        env:
          TEST_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TEST_SECRET: ${{ secrets.TEST_SECRET }}
        run: |
          echo ${#TEST_GITHUB_TOKEN}
          echo ${#TEST_SECRET}

测试来自分叉的拉取请求的秘密

检查 GitHub 上下文中的事件数据,您会看到 actor 是分叉存储库并打开拉取请求的用户。

       - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"

这是 GitHub 工作人员回答的一个不同但相关的问题,其中解释说,存在对分叉存储库的这些限制是为了“防止恶意行为者使用操作来毒害上游或下游存储库”。

原文由 peterevans 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题