GitHub Actions-空的环境秘密

时间:2019-11-06 20:10:14

标签: javascript node.js github github-actions

我已经开始使用GitHub动作了,但是我正努力访问作为环境传递的存储库秘密。

我的工作流程文件:

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个env,则按预期存在值“字符串”的组织,但是SECRET_TOKEN和SUPER_SECRET为空。​​

enter image description here

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

enter image description here

我在做错什么吗?

3 个答案:

答案 0 :(得分:1)

您遇到此问题的原因是Invite工作流是由来自派生存储库的拉取请求触发的。

  

除了GITHUB_TOKEN之外,从派生的存储库触发工作流时,机密不会传递给运行程序。

发生这种情况时,工作流程的actor是打开请求请求的用户。如果该用户没有权限访问您的存储库,那么他们将不能使用机密(GITHUB_TOKEN以外的其他机密)。

  

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

ref: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}

Test secrets on pull requests from forks

在GitHub上下文中检查事件数据,您会发现actor是派生存储库并打开提取请求的用户。

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

This is a different but related issue的GitHub工作人员回答说,存在对分叉存储库的这些限制是为了“防止恶意行为者使用操作来毒害上游或下游存储库。”

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我已实现https://stackoverflow.com/a/61450807/177275中所述的解决方法来解决这些类型的问题。本质上,在PR上运行的操作会创建一些工件,然后执行每5分钟运行一次的cron作业会扫描这些工件并对其进行操作。我用它将构建结果作为注释发布到拉取请求页面,但是您可以将相同的方法用于其他用例。