推送新提交后GitHub Action执行失败,求代码修改及用户通知方案
多语言手册分支管理GitHub Action修复与功能增强
问题概述
我有一个用于自动创建和更新PR的GitHub Action,负责多语言手册的分支管理:创建handbook_v1.1_en这类英文分支完成版本变更后,Action会自动生成7个对应其他语言的分支及PR,首次运行正常。但给英文PR推送新提交后执行报错,同时需要实现PR创建或更新时按语言通知指定用户(比如法语PR通知用户A,西班牙语PR通知用户B和C)。
错误原因分析
报错核心原因有两个:一是PR已存在时重复执行gh pr create触发"pull request already exists"错误;二是原分支同步的git pull命令格式错误,无法正确基于英文分支更新语言分支。
修改后的完整Action代码
name: Create Translation Branches and PRs on: pull_request: types: [opened, reopened, synchronize] jobs: create_translation_branches: if: startsWith(github.head_ref, 'handbook_v') && endsWith(github.head_ref, '_en') runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v3 with: fetch-depth: 0 # 拉取完整分支历史,避免rebase失败 - name: Set up Git run: | git config --global user.name 'ntluong95' git config --global user.email 'ph.ntluong95@gmail.com' - name: Install GitHub CLI run: | sudo apt update sudo apt install -y gh - name: Create language branches and PRs run: | # 定义语言与通知用户的映射关系 declare -A LANG_USERS=( ["fr"]="@userA" ["es"]="@userB @userC" ["vn"]="@userD" ["jp"]="@userE" ["tr"]="@userF" ["pt"]="@userG" ["ru"]="@userH" ) PR_BRANCH="${{ github.head_ref }}" VERSION_SUFFIX="${PR_BRANCH#handbook_}" BASE_BRANCH="main" for lang in "${!LANG_USERS[@]}"; do NEW_BRANCH="handbook_${VERSION_SUFFIX/_en/_$lang}" NOTIFY_USERS="${LANG_USERS[$lang]}" # 拉取远程分支(不存在则忽略) git fetch origin "$NEW_BRANCH" || true # 处理分支创建或同步逻辑 if ! git rev-parse --verify --quiet "$NEW_BRANCH"; then # 从英文分支创建新语言分支 git checkout -b "$NEW_BRANCH" "$PR_BRANCH" else # 切换到现有分支,基于英文分支rebase同步最新变更 git checkout "$NEW_BRANCH" git rebase "$PR_BRANCH" fi # 安全强制推送rebase后的分支 git push origin "$NEW_BRANCH" --force-with-lease # 检查PR是否已存在,存在则更新,不存在则创建 PR_NUMBER=$(gh pr list --base "$BASE_BRANCH" --head "$NEW_BRANCH" --json number --jq '.[0].number') if [ -n "$PR_NUMBER" ]; then # 更新PR内容并添加通知 gh pr edit "$PR_NUMBER" --body "Automated pull request for $lang handbook version ${VERSION_SUFFIX/_en/}\n\nPlease review: $NOTIFY_USERS" else # 创建新PR并通知指定用户 gh pr create --base "$BASE_BRANCH" --head "$NEW_BRANCH" \ --title "Handbook ${VERSION_SUFFIX/_en/} $lang" \ --body "Automated pull request for $lang handbook version ${VERSION_SUFFIX/_en/}\n\nPlease review: $NOTIFY_USERS" fi done env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
关键修改说明
修复分支同步逻辑:
- 改用
git rebase "$PR_BRANCH"替代错误的git pull命令,确保语言分支基于最新的英文分支同步变更 - 添加
fetch-depth: 0拉取完整仓库历史,避免rebase时找不到对应提交 - 使用
--force-with-lease安全强制推送rebase后的分支,防止覆盖他人未提交的修改
- 改用
解决重复创建PR报错:
- 通过
gh pr list查询PR是否已存在,存在则执行gh pr edit更新内容,不存在才创建新PR
- 通过
实现按语言通知用户:
- 新增
LANG_USERS关联数组,直接定义每个语言对应的通知用户 - 在PR正文末尾添加@提及指定用户,创建或更新PR时都会同步更新通知内容
- 新增
内容的提问来源于stack exchange,提问作者Luong Nguyen Thanh
相关产品推荐
相关产品推荐

