在GitHub的/post/{owner}/{repo}/actions/runners/registration-token API中,出现“资源无法被集成访问”的问题。

83

我正在从我的 Github 工作流程 (Action) 发送一条 cURL POST 请求来获取自托管 Runner 的注册令牌,但我收到了以下回复:

{
  "message": "Resource not accessible by integration",
  "documentation_url": "https://docs.github.com/rest/reference/actions#create-a-registration-token-for-a-repository"
}

以下是我 Github 工作流程的简化版本:


name: get-token

"on":
  push: { branches: ["token"] }

jobs:
  
  print-token:
    name: print-token
    environment: dev
    # needs: pre-pkr
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Get registration token
        id: getRegToken
        run: |
          curl -X POST -H \"Accept: application/vnd.github.v3+json\"  -H 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' https://api.github.com/repos/myprofile/myrepo/actions/runners/registration-token

最终,我想将此令牌传递给使用packer build命令创建的ami(下一步)。 我还尝试了使用packer的shell provisioner进行上述curl请求,但是出现了相同的响应。 不知道是否需要从github ui允许某些权限?或者还有其他方法可以实现吗? 提前致谢。


1
你好,你尝试过在curl中使用个人访问令牌(PAT)而不是GITHUB_TOKEN吗? - GuiFalourd
你好。很抱歉回复晚了。是的,我已经试过并且对我有效。我倾向于使用GITHUB_TOKEN,因为它是一个临时令牌。此外,这样可以少一步操作(无需创建具有相关权限的PAT并将其存储在secrets中)。只是想知道为什么GITHUB_TOKEN不起作用。 谢谢。 - nu_popli
大多数情况下,当操作使用PAT而不是GITHUB_TOKEN时出现问题,这是一个范围问题。 GHA令牌只有特定的范围,而Github API需要更广泛的范围才能执行某些操作。在这里,创建注册令牌可能需要管理员权限,而它们不包含在GHA令牌中。我将添加一个官方答案,其中包含更多细节。 - GuiFalourd
你在这方面有没有找到使用PAT之外的其他解决方法?我也遇到了同样的问题,想要摆脱workflow_dispatch输入中的额外输入。 - andre
据我所记,使用 GH Token 无法实现这一点,最终我选择了 PAT。 - nu_popli
5个回答

93
尝试在你的作业中添加permissions
name: get-token

"on":
  push: { branches: ["token"] }

jobs:
  
  print-token:
    permissions: write-all
    name: print-token
    environment: dev
    # needs: pre-pkr
    runs-on: ubuntu-latest

    steps:
      - name: Check out code
        uses: actions/checkout@v2

      - name: Get registration token
        id: getRegToken
        run: |
          curl -X POST -H \"Accept: application/vnd.github.v3+json\"  -H 'Authorization: token ${{ secrets.GITHUB_TOKEN }}' https://api.github.com/repos/myprofile/myrepo/actions/runners/registration-token

这应该会告诉您是否存在该问题,然后您可以找出缺少的权限,并在更多详细信息中正确配置它们。

正如评论和其他答案所提到的,您可以有多种方法来配置权限:

  • 使用PAT(个人访问令牌
  • 覆盖工作流文件本身中的权限,如上面的代码片段所示
  • 在Actions设置中配置权限

第三个选项可以在几个不同的级别上完成:

你可以在这里找到默认权限的详细信息。


1
你好。感谢回答。我采纳了建议,但据我所知,这不能直接在工作流中完成。我在工作流中明确分配了所有权限,但仍然无法正常工作。GH Token的权限也设置为读/写。PAT需要仓库权限才能生成注册令牌,但这些条件无法在工作流中分配。 - nu_popli
我刚刚尝试在我的工作流yml中设置permissions: write-all,现在它可以工作了(无法评论当您发表评论时是否有效)。 - ScottishTapWater
6
这是你在互联网上可能会找到的关于这个问题最好的答案,甚至比ChatGPT还要好。 - Wassim AZIRAR
1
在GitHub Enterprise v3.8上,我刚尝试设置作业的permissions: write-all,然后在我的ci/cd流水线中调用gh cli来设置环境级别的secret,但是在env上下文中使用GH_ENTERPRISE_TOKEN: ${{ secrets.GITHUB_TOKEN }}时,我遇到了“Resource not accessible by integration”的错误。然而,如果我改用我的管理员svc帐户的PAT,那么一切都正常。 - Al Dass

70

8
这个权限的默认值最近有改变吗?在我的旧仓库中,我不需要手动启用它。 - Paul Razvan Berg
2
这真的很有帮助。看到路径过滤器需要写入访问权限真是令人恼火... :-/ - Andreas Lundgren
1
这是我第一次发现自己需要手动完成这个任务,因为GitHub的默认行为已经改变了: https://github.blog/changelog/2023-02-02-github-actions-updating-the-default-github_token-permissions-to-read-only/ - Eduardo Pignatelli
1
从免费计划切换到Github企业云计划后,我发现需要确认这些设置以使CI再次正常工作。 - tinystone

15
问题与 Github Actions 工作流运行中自动生成的 GITHUB_TOKEN 权限范围有关。
根据 frennky 的回答,可以在此处找到该令牌的默认权限。这里 基于此,你有两种解决方案:
1. 第一种是 freenky 建议的方法,在作业中使用 permissions字段 更新工作流运行中的GITHUB_TOKEN 权限。
2. 第二种是使用个人访问令牌(Personal Access Token)替代默认的GITHUB_TOKEN,创建具有所需特定权限的访问令牌,然后将其添加为存储库密码(secret)

感谢回答。据我所知,使用PAT的路线是唯一的选择(我已经测试过它,它有效)。如果我错了,请指出来,但我认为在actions工作流中无法直接使用GITHUB_TOKEN来调用registration-token API。 - nu_popli
API 不能使用默认的 GITHUB_TOKEN 权限。但是,通过使用 permission field 可能可以更新 GITHUB_TOKEN 权限范围(我没有尝试过,所以无法确定)。 - GuiFalourd
2
我尝试过了。据我所知,这是不可能完成的。 - nu_popli
@nu_popli - 我刚刚尝试在我的工作流yml中设置permissions: write-all,现在它可以工作了(无法评论您发表评论时是否有效)。 - ScottishTapWater
1
@ScottishTapWater 很好知道这个。我相信那时候它肯定不起作用。我不确定,但我认为也有一个可用的API调用来生成临时令牌。你也可以尝试一下,但不要完全相信我的话。 - nu_popli
显示剩余2条评论

7
  1. 进入存储库的"设置"。
  2. 然后它会显示一个左侧窗格,在那里您会找到"操作"。
  3. 展开"操作"选项卡。
  4. 在选项卡下点击"常规"。
  5. 现在在新页面向下滚动,您将找到"工作流权限"。
  6. 在"工作流权限"下选择"读写"。

您的其他设置似乎都很好,因为您没有报告更多错误。如果问题仍然存在,请告诉我,我会修复它。


现在看起来对于私有仓库(具有组织和免费计划),他们不允许更改此选项。 - undefined

6
将以下权限行添加到您提到的操作系统下面
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
      repository-projects: write

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接