Jenkins与Git集成 - Webhook自动触发与多分支Pipeline

Jenkins与Git集成

一、前言

Jenkins和Git是CI/CD中最经典的搭档。代码提交到Git仓库后,自动触发Jenkins构建,这是持续集成的核心场景。本文将详细介绍Jenkins与Git的各种集成方式,从基础的代码拉取到高级的Webhook自动触发和多分支Pipeline。

二、Git基础集成

2.1 在Jenkins中配置Git凭据

在拉取私有Git仓库代码之前,需要先配置Git凭据。

HTTPS方式

  • 进入 Credentials → System → Global credentials → Add Credentials
  • Kind: Username with password
  • Username: Git用户名
  • Password: Git密码或Personal Access Token(推荐用Token)
  • ID: gitlab-https-creds

SSH方式

# 1. 生成SSH密钥对
ssh-keygen -t ed25519 -C "jenkins@company.com" -f ~/.ssh/jenkins_git

# 2. 查看公钥(添加到Git服务器)
cat ~/.ssh/jenkins_git.pub

# 3. 查看私钥(添加到Jenkins凭据)
cat ~/.ssh/jenkins_git

然后在Jenkins中添加SSH凭据:

  • Kind: SSH Username with private key
  • Username: git
  • Private Key: Enter directly,粘贴私钥内容
  • ID: gitlab-ssh-creds

2.2 在Pipeline中拉取代码

pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                // 方式1:简单拉取
                git 'https://github.com/user/project.git'
                
                // 方式2:带凭据和分支
                git branch: 'main',
                    credentialsId: 'gitlab-https-creds',
                    url: 'https://gitlab.com/group/project.git'
                
                // 方式3:使用checkout(更灵活)
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: '*/main']],
                    userRemoteConfigs: [[
                        url: 'git@gitlab.com:group/project.git',
                        credentialsId: 'gitlab-ssh-creds'
                    ]]
                ])
                
                // 方式4:从SCM自动拉取(Pipeline from SCM模式)
                checkout scm
            }
        }
    }
}

2.3 获取Git信息

拉取代码后,可以获取Git的提交信息:

pipeline {
    agent any
    
    stages {
        stage('Git Info') {
            steps {
                script {
                    // 获取当前提交哈希(短)
                    def commitHash = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
                    echo "提交哈希: ${commitHash}"
                    
                    // 获取当前分支名
                    def branchName = sh(returnStdout: true, script: 'git rev-parse --abbrev-ref HEAD').trim()
                    echo "当前分支: ${branchName}"
                    
                    // 获取提交者
                    def author = sh(returnStdout: true, script: 'git log -1 --pretty=format:"%an"').trim()
                    echo "提交者: ${author}"
                    
                    // 获取提交信息
                    def message = sh(returnStdout: true, script: 'git log -1 --pretty=format:"%s"').trim()
                    echo "提交信息: ${message}"
                    
                    // 设置为环境变量供后续阶段使用
                    env.GIT_COMMIT_SHORT = commitHash
                    env.GIT_AUTHOR = author
                }
            }
        }
    }
}

三、Webhook自动触发

前面学的Poll SCM是Jenkins主动去问"有新代码吗?",效率低且浪费资源。Webhook是Git服务器主动告诉Jenkins"有新代码了!",实时且高效。

3.1 GitHub Webhook配置

步骤:

  • 1. 在Jenkins中安装 GitHub Integration Plugin
  • 2. 在Pipeline配置中,勾选 "GitHub hook trigger for GITScm polling"
  • 3. 在GitHub仓库中配置Webhook:
    • 进入仓库 Settings → Webhooks → Add webhook
    • Payload URL: http://jenkins-server:8080/github-webhook/
    • Content type: application/json
    • 选择触发事件: Just the push event
    • 点击 Add webhook

在Pipeline中使用:

pipeline {
    agent any
    
    triggers {
        githubPush()
    }
    
    stages {
        stage('Build') {
            steps {
                checkout scm
                sh 'mvn clean package'
            }
        }
    }
}

3.2 GitLab Webhook配置

需要安装 GitLab Plugin

步骤:

  • 1. 在Pipeline配置中,勾选 "Build when a change is pushed to GitLab"
  • 2. 记下GitLab webhook URL:http://jenkins-server:8080/project/your-job-name
  • 3. 在GitLab项目中配置Webhook:
    • 进入项目 Settings → Webhooks
    • URL: 填写上面的URL
    • Secret token: 从Jenkins配置页面复制
    • Trigger: 勾选Push events、Merge request events等
pipeline {
    agent any
    
    triggers {
        gitlab(
            triggerOnPush: true,
            triggerOnMergeRequest: true,
            branchFilterType: 'NameBasedFilter',
            includeBranchesSpec: 'main,develop'
        )
    }
    
    stages {
        stage('Build') {
            steps {
                checkout scm
                sh 'mvn clean package'
            }
        }
    }
}

3.3 通用Webhook(Gitee/自建Git等)

对于其他Git平台,可以使用 Generic Webhook Trigger Plugin

pipeline {
    agent any
    
    triggers {
        GenericTrigger(
            genericVariables: [
                [key: 'ref', value: '$.ref'],
                [key: 'commit_message', value: '$.commits[0].message'],
                [key: 'author', value: '$.commits[0].author.name']
            ],
            causeString: 'Triggered by $author',
            token: 'my-webhook-secret-token',
            printContributedVariables: true,
            printPostContent: true
        )
    }
    
    stages {
        stage('Build') {
            steps {
                echo "触发分支: ${ref}"
                echo "提交信息: ${commit_message}"
                echo "提交者: ${author}"
                checkout scm
                sh 'mvn clean package'
            }
        }
    }
}

Webhook URL:http://jenkins-server:8080/generic-webhook-trigger/invoke?token=my-webhook-secret-token

四、多分支Pipeline(Multibranch Pipeline)

多分支Pipeline是管理多分支项目的最佳方式,它会自动为每个分支创建一个Pipeline任务。

4.1 创建Multibranch Pipeline

步骤:

  • 1. New Item → 输入名称 → 选择 "Multibranch Pipeline"
  • 2. 在Branch Sources中添加Git仓库
  • 3. 配置仓库地址和凭据
  • 4. 设置分支过滤策略
  • 5. Scan Multibranch Pipeline Triggers:设置自动扫描间隔
  • 6. 保存

Jenkins会自动扫描所有分支,为包含Jenkinsfile的分支创建Pipeline任务。

4.2 分支过滤

# 只构建特定分支
Filter by name (with regular expression):
  .*main.*|.*develop.*|.*feature/.*

# 排除特定分支
Exclude: hotfix-.*

# 只发现PR
Discover pull requests from origin: 
  Merging the PR with the target branch

4.3 多分支Pipeline中的环境变量

多分支Pipeline会自动设置一些有用的环境变量:

BRANCH_NAME     # 当前分支名,如 main, develop, feature/new-api
CHANGE_ID       # PR/MR的ID
CHANGE_TARGET   # PR/MR的目标分支
CHANGE_TITLE    # PR/MR的标题
CHANGE_AUTHOR   # PR/MR的作者

4.4 按分支执行不同策略

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        
        stage('Test') {
            steps {
                sh 'mvn test'
            }
        }
        
        stage('Deploy Dev') {
            when {
                anyOf {
                    branch 'develop'
                    branch 'feature/*'
                }
            }
            steps {
                sh './deploy.sh dev'
            }
        }
        
        stage('Deploy Staging') {
            when {
                branch 'release/*'
            }
            steps {
                sh './deploy.sh staging'
            }
        }
        
        stage('Deploy Production') {
            when {
                branch 'main'
            }
            steps {
                input '确认部署到生产环境?'
                sh './deploy.sh production'
            }
        }
    }
}

五、Git Submodule支持

如果你的项目使用了Git Submodule,需要在checkout中启用:

checkout([
    $class: 'GitSCM',
    branches: [[name: '*/main']],
    doGenerateSubmoduleConfigurations: false,
    extensions: [
        [$class: 'SubmoduleOption',
         disableSubmodules: false,
         parentCredentials: true,
         recursiveSubmodules: true,
         reference: '',
         trackingSubmodules: false]
    ],
    submoduleCfg: [],
    userRemoteConfigs: [[
        url: 'https://github.com/user/main-project.git',
        credentialsId: 'git-creds'
    ]]
])

六、Git高级配置

6.1 浅克隆

对于历史很长的大仓库,浅克隆可以大幅加快检出速度:

checkout([
    $class: 'GitSCM',
    branches: [[name: '*/main']],
    extensions: [
        [$class: 'CloneOption', depth: 1, noTags: false, shallow: true]
    ],
    userRemoteConfigs: [[
        url: 'https://github.com/user/project.git',
        credentialsId: 'git-creds'
    ]]
])

6.2 稀疏检出

只检出需要的目录:

extensions: [
    [$class: 'SparseCheckoutPaths',
     sparseCheckoutPaths: [
         [path: 'src/main/'],
         [path: 'pom.xml']
     ]]
]

6.3 检出前清理

extensions: [
    [$class: 'CleanBeforeCheckout'],
    [$class: 'CleanCheckout']
]

七、Git与Jenkins集成最佳实践

  • 优先使用Webhook:比Poll SCM更实时、更节省资源
  • 使用SSH方式:比HTTPS更安全,不需要每次输入密码
  • 用Multibranch Pipeline:自动管理所有分支,无需手动创建任务
  • Jenkinsfile纳入版本控制:Pipeline配置跟着代码走
  • 大仓库用浅克隆:加速检出,节省磁盘空间
  • 敏感信息用Credentials:不要在Jenkinsfile中硬编码密码
  • 分支策略统一:团队约定分支命名规范

八、总结

本文详细介绍了Jenkins与Git的集成方式:

  • Git凭据配置:HTTPS和SSH两种方式
  • 代码拉取:git、checkout、checkout scm
  • Webhook触发:GitHub、GitLab、通用Webhook
  • 多分支Pipeline:自动管理多分支项目
  • Git高级配置:Submodule、浅克隆、稀疏检出
  • 最佳实践:Webhook优先、SSH方式、版本控制Pipeline

掌握了Git集成,你的CI/CD流程就有了最核心的一环!

发表回复

后才能评论