12k
All articles

在每次推送时自动创建拉取请求

借助 GitHub Actions、GitHub CLI 或 CI/CD 工具,在每次推送时自动创建 pull request,简化代码审查流程并提升工作效率。

OpenReplay Team
OpenReplay Team
在每次推送时自动创建拉取请求

Git 自动化可以显著简化您的开发工作流程。本指南探讨了如何在每次将代码推送到存储库时自动创建拉取请求,使用各种工具和方法。

关键要点

  • 了解三种自动创建 PR 的方法:GitHub Actions、GitHub CLI 和 CI/CD 工具
  • 通过适当的身份验证和权限实现安全的自动化实践
  • 了解管理自动拉取请求的最佳实践
  • 设置分支保护和条件 PR 创建逻辑

方法 1:使用 GitHub Actions(推荐)

GitHub Actions 提供了一种原生、可靠的方式来自动创建 PR。以下是设置方法:

步骤 1:创建 GitHub Actions 工作流

  1. 如果存储库中不存在 .github/workflows/ 目录,请创建它
  2. 创建一个名为 auto-pr.yml 的新文件
  3. 添加以下配置:
name: Auto PR on Push

on:
  push:
    branches:
      - 'feature/**'    # 匹配 feature/* 分支
      - 'bugfix/**'     # 匹配 bugfix/* 分支  
      # 根据需要添加更多分支模式

jobs:
  create-pull-request:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # 正确比较分支所需

      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          commit-message: ""Auto-created PR from ${{ github.ref_name }}""
          title: ""Auto PR: ${{ github.ref_name }}""
          body: |
            从推送到 ${{ github.ref_name }} 自动创建的拉取请求
            
            分支: ${{ github.ref_name }}
            触发者: ${{ github.actor }}
          branch: ${{ github.ref_name }}
          base: main
          labels: |
            automated-pr
            needs-review

步骤 2:配置存储库设置

  1. 转到存储库的 Settings → Actions → General
  2. 在""Workflow permissions""下,选择""Read and write permissions""
  3. 保存更改

方法 2:使用 GitHub CLI

对于偏好本地自动化的开发人员,GitHub CLI 提供了一个简单直接的解决方案。

步骤 1:安装 GitHub CLI

选择您的平台:

  • macOS: brew install gh
  • Ubuntu/Debian: sudo apt install gh
  • Windows: winget install GitHub.cli 或从 <https://cli.github.com> 下载
  • 其他 Linux:按照 <https://github.com/cli/cli#installation> 的说明进行操作

步骤 2:认证 GitHub CLI

gh auth login

步骤 3:设置推送后钩子

创建并配置推送后钩子:

#!/bin/bash

# 获取当前分支名称
BRANCH=$(git rev-parse --abbrev-ref HEAD)

# 不为 main/master 分支创建 PR
if [[ ""$BRANCH"" == ""main"" ]] || [[ ""$BRANCH"" == ""master"" ]]; then
    exit 0
fi

# 检查 PR 是否已存在 
PR_EXISTS=$(gh pr list --head ""$BRANCH"" --json number --jq length)

if [ ""$PR_EXISTS"" -eq 0 ]; then
    # 如果 PR 不存在则创建
    gh pr create 
        --base main 
        --head ""$BRANCH"" 
        --title ""Auto PR: $BRANCH"" 
        --body "" $BRANCH 自动创建的拉取请求"" 
        --label ""automated-pr""  
fi

方法 3:使用 CI/CD 工具

对于使用其他 CI/CD 平台的团队,以下是使用 GitHub 的 REST API 实现 PR 自动化的方法。

Jenkins 流水线示例

pipeline {
    agent any
    
    environment {
        GITHUB_TOKEN = credentials('github-token')
    }
    
    stages {
        stage('Create PR') {
            steps {
                script {
                    def branchName = sh(
                        returnStdout: true, 
                        script: 'git rev-parse --abbrev-ref HEAD'
                    ).trim()
                    
                    // 不为 main/master 创建 PR
                    if (branchName != 'main' && branchName != 'master') {
                        def response = sh(
                            returnStdout: true,
                            script: """"""
                                curl -X POST 
                                    -H 'Authorization: token ${GITHUB_TOKEN}' 
                                    -H 'Accept: application/vnd.github.v3+json' 
                                    https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/pulls 
                                    -d '{
                                        ""title"": ""Auto PR: ${branchName}"",
                                        ""head"": ""${branchName}"",
                                        ""base"": ""main"",
                                        ""body"": ""从 Jenkins 流水线自动创建的拉取请求""
                                    }'
                            """"""
                        )
                    }
                }
            }
        }
    }
}

最佳实践和安全考虑

  • 为主分支启用分支保护规则
  • 创建标准化的 PR 模板
  • 使用标签区分自动 PR
  • 设置自动审阅人分配
  • 使用存储库机密安全地存储令牌
  • 将令牌权限限制在所需范围内
  • 定期轮换身份验证令牌
  • 检查自动 PR 设置以防止敏感数据泄露

结论

自动化拉取请求创建可以通过确保一致的代码审查流程和减少手动工作来显著改善您的开发工作流程。无论您选择 GitHub Actions、GitHub CLI 还是 CI/CD 工具,实施这些自动化技术都将有助于简化开发流程并保持更好的代码质量控制。

常见问题

为什么我应该自动创建拉取请求?

自动创建 PR 可确保代码审查过程的一致性,节省时间,减少人为错误,并有助于保持代码更改的清晰历史记录。对于同时处理多个功能的团队尤其有用。

我应该选择哪种方法进行 PR 自动化?

对于大多数用户,推荐使用 GitHub Actions,因为它提供与 GitHub 的原生集成,只需最少的设置,并提供强大的功能。但是,如果您更喜欢本地自动化,GitHub CLI 是一个不错的替代方案,而 CI/CD 工具更适合复杂的企业环境。

如何防止创建重复的 PR?

提供的脚本包括检查以防止重复的 PR。对于 GitHub CLI,我们在创建新 PR 之前检查现有 PR。使用 GitHub Actions,您可以使用 `peter-evans/create-pull-request` 操作,它会自动处理这个问题。

我可以自定义 PR 模板和标签吗?

是的,您可以通过修改任何方法中的 body 参数来自定义 PR 模板。对于标签,您可以在 GitHub Actions 工作流或 CLI 命令中添加它们。您还可以设置存储库范围的 PR 模板。

如何处理身份验证和安全性?

使用存储库机密存储令牌,实施适当的权限范围,并定期轮换凭据。对于 GitHub Actions,尽可能使用内置的 GITHUB_TOKEN。对于 CLI 和 CI/CD 工具,创建具有最小所需权限的专用访问令牌。

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers

We use cookies to improve your experience. By using our site, you accept cookies.