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 repository-projects: write ... jobs: ...
name: CI
on: pull_request
# Set the access for individual scopes, or use permissions: write-all
permissions:
pull-requests: write
issues: write
repository-projects: write
...
jobs:
...
有关详细信息,请参阅“自动令牌身份验证”。
手动重新运行工作流程
手动重新运行 Dependabot 工作流时,即使发起重新运行的用户具有不同的权限,该工作流也会使用以前所用的权限运行。 有关详细信息,请参阅“重新运行工作流程和作业”。