创建多分支流水线

Beginner

简介

Jenkins 多分支流水线(Multibranch Pipeline)可以扫描源代码仓库,查找包含 Jenkinsfile 的分支,并为每个分支创建一个独立的流水线任务。这使得 main 分支和功能分支能够在同一个父项目下使用各自的流水线定义。

在本实验中,你将准备一个包含两个分支的小型本地 Git 仓库,从 Jenkins 仪表板创建一个多分支流水线,扫描该仓库,并对比每个已发现分支的控制台输出。

准备一个包含两个分支的 Git 仓库

在此步骤中,你将准备一个可供 Jenkins 扫描的小型 Git 仓库。该仓库位于 Jenkins 容器内部,因此 Jenkins 控制器无需依赖 GitHub 或其他外部服务即可访问它。

在终端中运行以下命令,创建一个包含 Jenkinsfilemain 分支:

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.git
  • Credentials: - none -

保持 Behaviors 为默认的分支发现行为。在 Build Configuration 中,保持 Modeby Jenkinsfile,并将 Script Path 保持为 Jenkinsfile

点击 Save

Jenkins 多分支流水线 Git 源

运行此命令记录重要的保存配置:

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

等待页面显示 mainfeature/demo 的子任务。Jenkins 可能还会自动为每个发现的分支启动第一次构建。

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 分支任务,执行相同的操作。

两个分支任务的最新构建都应显示为成功。

Jenkins 成功的分支构建

运行此命令记录每个分支的最新成功构建:

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

Jenkins 多分支流水线控制台输出

运行此命令保存相同的控制台证据:

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 多分支流水线,扫描了仓库,确认了两个分支任务均构建成功,并对比了特定于分支的流水线输出。