我已经开始使用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为空。
是的,我确实在运行操作的回购中设置了秘密:
我在做错什么吗?
答案 0 :(得分:1)
您遇到此问题的原因是Invite
工作流是由来自派生存储库的拉取请求触发的。
除了GITHUB_TOKEN之外,从派生的存储库触发工作流时,机密不会传递给运行程序。
发生这种情况时,工作流程的actor
是打开请求请求的用户。如果该用户没有权限访问您的存储库,那么他们将不能使用机密(GITHUB_TOKEN
以外的其他机密)。
具有存储库写权限的任何人都可以创建,读取和使用机密。
如果在工作流程中运行此步骤,您将发现它与您的操作无关。 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"
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作业会扫描这些工件并对其进行操作。我用它将构建结果作为注释发布到拉取请求页面,但是您可以将相同的方法用于其他用例。