Dependabot 触发事件时的限制
Dependabot 能够在其拉取请求和评论上触发 GitHub Actions 工作流程;但是,某些事件的处理方式不同。
对于由 Dependabot (github.actor == 'dependabot[bot]'
) 使用 pull_request
、pull_request_review
、pull_request_review_comment
、push
、create
、deployment
和 deployment_status
事件发起的工作流,存在以下限制:
GITHUB_TOKEN
默认拥有只读权限。- 机密是从 Dependabot 机密填充的。 GitHub Actions 机密不可用。
对于 Dependabot (github.actor == 'dependabot[bot]'
) 使用 pull_request_target
事件发起的工作流,如果拉取请求的基本引用是由 Dependabot (github.event.pull_request.user.login == 'dependabot[bot]'
) 创建的,GITHUB_TOKEN
将是只读的,并且机密不可用。
即使工作流由其他执行组件重新运行,这些限制仍然适用。
有关详细信息,请参阅确保 GitHub Actions 和工作流安全:阻止 pwn 请求。
Dependabot 触发现有工作流程时的故障疑难解答
为 GitHub.com 设置 Dependabot 更新后,当现有工作流由 Dependabot 事件触发时,���可能会看到失败。
默认情况下,由 Dependabot 从 push
、pull_request
、pull_request_review
或 pull_request_review_comment
事件中触发的 GitHub Actions 工作流运行被视为从存储库分支中打开。 与其他参与者触发的工作流不同,这意味着它们会接收一个只读 GITHUB_TOKEN
,并且无权访问任何通常可用的机密。 这将导致尝试写入仓库的任何工作流程在由 Dependabot 触发时失败。
有三种方法可以解决此问题:
- 可以更新工作流,使其不再由 Dependabot 使用如下表达式触发:
if: github.actor != 'dependabot[bot]'
。 有关详细信息,请参阅“对工作流和操作中的表达式求值”。 - 可以修改工作流以使用包含
pull_request_target
的两步过程,该过程没有这些限制。 有关详细信息,请参阅“对 GitHub Actions 上的 Dependabot 进行故障排除”。 - 可为由 Dependabot 触发的工作流提供对机密的访问权限,并允许
permissions
术语增加GITHUB_TOKEN
的默认范围。
本文提供了一些故障排除建议。 你也可以参阅“GitHub Actions 的工作流语法”。
访问密钥
当 Dependabot 事件触发工作流程时,工作流程唯一可用的机密是 Dependabot 机密。 GitHub Actions 机密不可用。**** 因此,必须将 Dependabot 事件触发的工作流使用的任何机密存储为 Dependabot 机密。 有关详细信息,请参阅“为 Dependabot 配置对专用注册表的访���权限”。
Dependabot 机密添加到 secrets
上下文,并使用与 GitHub Actions 的机密完全相同的语法进行引用。 有关详细信息,请参阅“在 GitHub Actions 中使用机密”。
如果您的工作流程将由 Dependabot 和其他参与者触发,则最简单的解决方案是将令牌与操作以及名称相同的 Dependabot 密钥中所需的权限一起存储。 然后,工作流程可以包括对这些机密的单个调用。 如果 Dependabot 的机密具有不同的名称,请使用条件指定正确的机密,以供不同的参与者使用。
有关使用条件的示例,请参阅“通过 GitHub Actions 自动化 Dependabot”。
要使用用户名和密码访问 AWS 上的私有容器注册表,工作流必须包含 username
和 password
的机密。
在此示例中,当 Dependabot 触发工作流时,将使用名称为 READONLY_AWS_ACCESS_KEY_ID
和 READONLY_AWS_ACCESS_KEY
的 Dependabot 机密。 如果另一个执行组件触发了工作流程,则使用具有这些名称的操作机密。
name: CI on: pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Login to private container registry for dependencies uses: docker/login-action@3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c with: registry: https://1234567890.dkr.ecr.us-east-1.amazonaws.com username: ${{ secrets.READONLY_AWS_ACCESS_KEY_ID }} password: ${{ secrets.READONLY_AWS_ACCESS_KEY }} - name: Build the Docker image run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)
name: CI
on:
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Login to private container registry for dependencies
uses: docker/login-action@3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c
with:
registry: https://1234567890.dkr.ecr.us-east-1.amazonaws.com
username: ${{ secrets.READONLY_AWS_ACCESS_KEY_ID }}
password: ${{ secrets.READONLY_AWS_ACCESS_KEY }}
- name: Build the Docker image
run: docker build . --file Dockerfile --tag my-image-name:$(date +%s)
更改 GITHUB_TOKEN
权限
默认情况下,由 Dependabot 触发的 GitHub Actions 工作流都会获得具有只读权限的 GITHUB_TOKEN
。 可以使用工作流中的 permissions
密钥来增加对令牌的访问权限:
name: CI on: pull_request # Set the access for individual scopes, or use permissions: write-all permissions: pull-requests: write issues: write ... jobs: ...
name: CI
on: pull_request
# Set the access for individual scopes, or use permissions: write-all
permissions:
pull-requests: write
issues: write
...
jobs:
...
有关详细信息,请参阅“在工作流中使用 GITHUB_TOKEN 进行身份验证”。
手动重新运行工作流程
手动重新运行 Dependabot 工作流时,即使发起重新运行的用户具有不同的权限,该工作流也会使用以前所用的权限运行。 有关详细信息,请参阅“重新运行工作流程和作业”。