当代码推送到分支时,GitHub 工作流程无法运行

Cod*_*Med 6 github github-actions

GitHub 中的 CI/CD 管道需要首先将代码从dev分支推送到test分支,然后在test代码推送到分支后立即在test分支上运行工作流。

当代码从 GitHub 外部的 devbox推送到分支时,下面dev-environ-workflow的代码确实成功地代码从分支推送到分支。devtestdev

问题是,test-environ-workflow当代码从 .push 推入test分支时,无法运行dev-environ-workflow

任何 GitHub 帐户都可以仅使用三个文件和以下结构来重现此问题:

.gihub/workflows/
    dev-workflow.yaml
    test-workflow.yaml
myapp.py
Run Code Online (Sandbox Code Playgroud)

myapp.py

.gihub/workflows/
    dev-workflow.yaml
    test-workflow.yaml
myapp.py
Run Code Online (Sandbox Code Playgroud)

dev-workflow.yaml

print('Hello from myapp!')
Run Code Online (Sandbox Code Playgroud)

test-workflow.yaml

name: dev-environ-workflow
on:
  push:
    branches:
      - dev
jobs:
  push-to-test-branch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - shell: bash
        name: Push changes to test branch
        env:
          GIT_PAT: ${{ secrets.GIT_PAT }}
        run: |
          repoWithToken="https://"$GIT_PAT"@github.com/myAccountName/trigger.git"
          git config --global user.email "me@mydomain.com"
          git config --global user.name "myAccountName"
          git init
          git remote set-url origin $repoWithToken
          git branch -M test
          git add --all
          git push --force -u origin test
Run Code Online (Sandbox Code Playgroud)

dev-environ-workflow从 GitHub 之外互联网上任何位置的远程开发盒触发的命令是:

name: test-environ-workflow
on:
  push:
    branches:
      - test
jobs:
  push-to-test-branch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - shell: bash
        name: Do anything
        run: echo "Successfully triggered test-environ-workflow"
Run Code Online (Sandbox Code Playgroud)

您还需要为名为 的 GitHub 存储库创建一个环境变量,GIT_PAT其中包含将用于将代码推送到分支的个人访问令牌test

为了在成功将代码推送到分支test-environ-workflow时成功触发,上面具体需要更改什么?dev-environ-workflowtest

Bro*_*ary 3

正如您可能从GitHub 文档中了解到的那样:

当您使用存储库GITHUB_TOKEN执行任务时,由 触发的事件(和GITHUB_TOKEN除外)将不会创建新的工作流运行。这可以防止您意外创建递归工作流运行。workflow_dispatchrepository_dispatch

您正在使用个人访问令牌来解决此问题,但无论如何都将actions/checkout其存储GITHUB_TOKEN在本地存储库配置中,并且在执行 git 操作时将使用它而不是 PAT。

这记录在actions/checkout README 文件中

身份验证令牌保留在本地 git 配置中。这使您的脚本能够运行经过身份验证的 git 命令。该令牌在作业后清理期间被删除。设置 persist-credentials: false 以选择退出。

您需要告诉actions/checkout不要使用 来保留令牌persist-credentials: false

因此,uses您的开发工作流程中的步骤如下:

steps:
  - uses: actions/checkout@v3
    with:
      persist-credentials: false
  - more steps...
Run Code Online (Sandbox Code Playgroud)

更新

@GuiFalourd 在问题评论中提到您可能只需要覆盖GITHUB_TOKEN环境变量。我实际上更喜欢该解决方案,因为这样您就不必在存储库 URL 中传递令牌,这意味着您根本不必覆盖存储库远程。我实际上并没有GITHUB_TOKEN在这里覆盖环境变量,但您可以将 PAT 传递给actions/checkout

steps:
  - uses: actions/checkout@v3
    with:
      token: ${{ secrets.GIT_PAT }}
  - more steps...
Run Code Online (Sandbox Code Playgroud)

这是我的开发工作流程的最小工作版本:

变化:

  • 您不需要初始化存储库,因为actions/checkout它已经完成了。
  • 您无需再更改远程 URL,因为我们不会在 URL 中传递令牌。
  • 您不需要这样做,git add --all因为您没有更改任何文件。
  • 您不需要设置用户名或电子邮件,因为您没有创建任何新的提交。
  • 您不必将分支更改或重命名为test. 您可以按名称将当前签出的 HEAD 提交推送到任何远程分支。
name: dev-environ-workflow
on:
  push:
    branches:
      - dev
jobs:
  push-to-test-branch:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          token: ${{ secrets.GIT_PAT }}
      - shell: bash
        name: Push changes to test branch
        run: git push -f origin HEAD:test
Run Code Online (Sandbox Code Playgroud)