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

一、前言
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流程就有了最核心的一环!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







