简介
Jenkins 多分支流水线(Multibranch Pipeline)可以扫描源代码仓库,查找包含 Jenkinsfile 的分支,并为每个分支创建一个独立的流水线任务。这使得 main 分支和功能分支能够在同一个父项目下使用各自的流水线定义。
在本实验中,你将准备一个包含两个分支的小型本地 Git 仓库,从 Jenkins 仪表板创建一个多分支流水线,扫描该仓库,并对比每个已发现分支的控制台输出。
准备一个包含两个分支的 Git 仓库
在此步骤中,你将准备一个可供 Jenkins 扫描的小型 Git 仓库。该仓库位于 Jenkins 容器内部,因此 Jenkins 控制器无需依赖 GitHub 或其他外部服务即可访问它。
在终端中运行以下命令,创建一个包含 Jenkinsfile 的 main 分支:
docker exec jenkins bash -lc '
set -e
rm -rf /var/jenkins_home/multibranch-src /var/jenkins_home/multibranch-demo.git
mkdir -p /var/jenkins_home/multibranch-src
cd /var/jenkins_home/multibranch-src
git init -b main
git config user.email "jenkins@example.com"
git config user.name "Jenkins Multibranch"
cat > Jenkinsfile <<'"'"'EOF'"'"'
pipeline {
agent any
stages {
stage("Branch Info") {
steps {
echo "Running main branch pipeline"
sh "echo BRANCH_NAME=${BRANCH_NAME}"
}
}
}
}
EOF
git add Jenkinsfile
git commit -m "Add main branch Jenkinsfile"
'
现在创建一个带有不同流水线消息的 feature/demo 分支,然后将两个分支发布到裸仓库(bare repository)中:
docker exec jenkins bash -lc '
set -e
cd /var/jenkins_home/multibranch-src
git checkout -b feature/demo
sed -i "s/Running main branch pipeline/Running feature demo pipeline/" Jenkinsfile
git add Jenkinsfile
git commit -m "Customize feature branch Jenkinsfile"
git init --bare --initial-branch=main /var/jenkins_home/multibranch-demo.git
git remote add origin /var/jenkins_home/multibranch-demo.git
git push origin main
git push origin feature/demo
touch /var/jenkins_home/multibranch-demo.git/git-daemon-export-ok
if [ -f /tmp/multibranch-git-daemon.pid ]; then
kill "$(cat /tmp/multibranch-git-daemon.pid)" 2>/dev/null || true
rm -f /tmp/multibranch-git-daemon.pid
fi
git daemon --reuseaddr --base-path=/var/jenkins_home --export-all --detach --pid-file=/tmp/multibranch-git-daemon.pid /var/jenkins_home
'
记录 Jenkins 将要扫描的分支:
docker exec jenkins git --git-dir=/var/jenkins_home/multibranch-demo.git branch -a | tee /home/labex/project/multibranch-branches.txt
你应该能看到两个分支:
feature/demo
* main
创建多分支流水线项目
在此步骤中,你将从 Jenkins 仪表板创建一个多分支流水线项目。该项目将扫描 git://localhost/multibranch-demo.git,并查找每个分支中名为 Jenkinsfile 的文件。
打开桌面界面。Firefox 会自动打开 Jenkins。如果没有,请访问 http://localhost:8080。
在 Jenkins 仪表板中:
点击 New Item,输入 multibranch-demo,选择 Multibranch Pipeline,然后点击 OK。
在配置页面:
在 Branch Sources 部分,点击 Add source 并选择 Git。
填写 Git 源信息:
Project Repository:git://localhost/multibranch-demo.gitCredentials:- none -
保持 Behaviors 为默认的分支发现行为。在 Build Configuration 中,保持 Mode 为 by Jenkinsfile,并将 Script Path 保持为 Jenkinsfile。
点击 Save。

运行此命令记录重要的保存配置:
docker exec jenkins sh -lc "grep -n -E 'WorkflowMultiBranchProject|git://localhost/multibranch-demo.git|<scriptPath>Jenkinsfile</scriptPath>' /var/jenkins_home/jobs/multibranch-demo/config.xml" | tee /home/labex/project/multibranch-config-lines.txt
扫描仓库分支
在此步骤中,你将从 Jenkins 仪表板运行分支索引。分支索引会扫描 Git 仓库,查找包含 Jenkinsfile 的分支,并为这些分支创建子任务。
在 multibranch-demo 项目页面,点击 Scan Multibranch Pipeline Now。
等待页面显示 main 和 feature/demo 的子任务。Jenkins 可能还会自动为每个发现的分支启动第一次构建。

运行此命令记录已发现的子任务:
curl -fsS http://localhost:8080/job/multibranch-demo/api/json | grep -o '"name":"[^"]*"' | tee /home/labex/project/multibranch-discovered-jobs.txt
输出应包含两个分支任务:
"name":"main"
"name":"feature%2Fdemo"
检查分支构建
在此步骤中,你将确认 Jenkins 可以构建每个发现的分支。多分支流水线将每个分支作为其独立的子流水线任务进行管理。
从 multibranch-demo 页面打开 main 分支任务。如果构建正在运行,请等待其完成。如果没有构建,点击 Build Now。
返回 multibranch-demo,打开 feature/demo 分支任务,执行相同的操作。
两个分支任务的最新构建都应显示为成功。

运行此命令记录每个分支的最新成功构建:
python3 - <<'PY' | tee /home/labex/project/multibranch-build-results.txt
import json
import urllib.request
for url_name, display in [('main', 'main'), ('feature%252Fdemo', 'feature/demo')]:
with urllib.request.urlopen(f'http://localhost:8080/job/multibranch-demo/job/{url_name}/lastBuild/api/json') as response:
data = json.load(response)
print(f'{display}: {data["result"]}')
PY
你应该看到:
main: SUCCESS
feature/demo: SUCCESS
对比分支流水线输出
在此步骤中,你将对比两个分支构建的控制台输出。main 分支和 feature/demo 分支在各自的 Jenkinsfile 中使用了不同的消息,因此日志证明了 Jenkins 运行了正确的分支特定流水线。
打开最新的 main 分支构建并点击 Console Output。它应该显示 Running main branch pipeline。
然后打开最新的 feature/demo 分支构建并点击 Console Output。它应该显示 Running feature demo pipeline。

运行此命令保存相同的控制台证据:
curl -fsS http://localhost:8080/job/multibranch-demo/job/main/lastBuild/consoleText | grep 'Running main branch pipeline' | tee /home/labex/project/multibranch-console-lines.txt
curl -fsS http://localhost:8080/job/multibranch-demo/job/feature%252Fdemo/lastBuild/consoleText | grep 'Running feature demo pipeline' | tee -a /home/labex/project/multibranch-console-lines.txt
总结
你准备了一个包含两个分支的本地 Git 仓库,从仪表板创建了 Jenkins 多分支流水线,扫描了仓库,确认了两个分支任务均构建成功,并对比了特定于分支的流水线输出。