소개
Jenkins 멀티브랜치 파이프라인 (Multibranch Pipeline) 은 소스 제어 저장소를 스캔하여 Jenkinsfile이 포함된 브랜치를 찾아내고, 각 브랜치마다 하나의 파이프라인 작업을 생성합니다. 이를 통해 main 브랜치와 기능 (feature) 브랜치가 하나의 상위 프로젝트 아래에서 각자의 파이프라인 정의를 사용할 수 있습니다.
이번 실습에서는 두 개의 브랜치를 가진 작은 로컬 Git 저장소를 준비하고, Jenkins 대시보드에서 멀티브랜치 파이프라인을 생성한 뒤, 저장소를 스캔하여 각 브랜치에서 발견된 콘솔 출력을 비교해 보겠습니다.
두 개의 브랜치를 가진 Git 저장소 준비하기
이 단계에서는 Jenkins 가 스캔할 수 있는 작은 Git 저장소를 준비합니다. 이 저장소는 Jenkins 컨테이너 내부에 위치하므로, GitHub 나 다른 외부 서비스에 의존하지 않고도 Jenkins 컨트롤러가 직접 접근할 수 있습니다.
터미널에서 다음 명령어를 실행하여 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) 저장소에 게시합니다.
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 대시보드에서 멀티브랜치 파이프라인을 생성했으며, 저장소를 스캔하고, 두 브랜치 작업이 성공적으로 빌드되는 것을 확인한 뒤, 브랜치별 파이프라인 출력을 비교해 보았습니다.