브랜치 미리보기를 서로 분리하기

GitBeginner
지금 연습하기

소개

Cedar & Common은 동네 행사를 준비하고 있습니다. 공식 프로그램은 이미 공개되어 있으며, 두 후보 계획에는 각각 별도의 미리보기가 필요합니다. Jenkins는 두 브랜치를 모두 빌드할 수 있지만, 현재 Pipeline들은 같은 위치에 게시합니다. 빌드가 성공했다는 사실만으로는 두 아이디어를 모두 계속 제공할 수 없습니다.

이 실습에서는 브랜치를 탐색하고 충돌을 관찰한 뒤, 각 Jenkinsfile을 변경하여 사용 가능한 미리보기 두 개를 게시합니다. 그런 다음 한쪽의 모임 시각을 바꾸고, 해당 미리보기만 업데이트되면서 다른 계획은 그대로 유지되는지 확인합니다.

전제 지식은 기본적인 터미널 입력과 경로, Jenkins 페이지 탐색, 짧은 Declarative Pipeline을 알아보는 능력입니다. Git 브랜치, 커밋, 푸시, 인덱싱과 새 Pipeline 설정은 사용하기 전에 설명합니다. 저장소, Java 빌더, 게시 프로그램, Jenkins 플러그인은 준비되어 있으므로 설치하거나 웹사이트를 작성할 필요가 없습니다. 이는 하나의 VM에서 실행되는 로컬 훈련용 소스 및 미리보기 서비스이며, GitHub나 운영용 배포 플랫폼이 아닙니다. 소요 시간은 작성자의 예상치이며, 초보자를 대상으로 측정한 값은 아닙니다.

계획과 각 브랜치 빌드 탐색하기

이 단계에서는 정상 프로그램과 후보 소스를 살펴본 다음, 브랜치 작업을 발견하고 공유 미리보기의 충돌을 관찰합니다. Preview Desk에서 시작하세요.

Open the official program을 선택하세요. Common Ground Day와 09:30을 확인하세요. Explore this plan을 선택하여 세 활동과 경로 그림을 확인하세요. Download the activities로 실제 CSV를 다운로드하고, Read visitor notes로 전체 안내문을 읽으세요. 브라우저의 Back 동작으로 개요로 돌아간 다음, 다시 Back으로 데스크로 돌아가세요. Read the courtyard notes도 열어 Courtyard Stories를 확인하세요. 작업하는 동안 기존의 두 프로그램을 계속 사용할 수 있어야 합니다.

Source로 전환하세요. 이 터미널은 Git 작업 사본입니다. 편집할 수 있는 파일들은 한 번에 하나의 선택된 브랜치에 속합니다. 브랜치는 소스 이력의 한 갈래에 붙인 이름입니다. 브랜치를 전환하면 작업 파일이 해당 브랜치 버전으로 바뀌며, 다른 브랜치는 바뀌지 않습니다. 커밋은 저장소 내용을 기록한 버전으로 해시로 식별됩니다. 이 식별자는 Jenkins 빌드와 해당 소스를 연결합니다.

터미널은 /home/labex/project/community-site에서 열립니다. pwd는 현재 디렉터리를 출력합니다. git --no-pager branch --list는 로컬 브랜치를 나열하며, *는 선택된 브랜치를 표시합니다. --no-pager는 결과를 터미널에 바로 표시하게 합니다. 이 옵션이 없으면 Git이 대화형 뷰어를 열 수 있습니다. 셸 프롬프트 대신 (END)가 보이면 q를 눌러 뷰어를 종료하세요. 다음을 실행하세요.

pwd
git --no-pager branch --list

목록에는 main, courtyard-notes, garden-plan, river-plan이 포함됩니다. 준비된 선택 상태는 garden-plan입니다. 실수로 디렉터리를 바꿨다면 계속하기 전에 cd /home/labex/project/community-site로 돌아오세요.

cat은 파일을 변경하지 않고 출력합니다. event.properties는 제목, 모임 정보, 활동에 대한 설정을 한 줄에 하나씩 key=value 형식으로 저장합니다. 이 작은 데이터 파일을 읽어 보세요.

cat event.properties

이 파일은 Garden Gathering을 나타내며, Glasshouse gate에서 10:00에 모입니다. meeting_time 줄은 제공된 빌더가 사용하는 데이터이며, 빌더는 페이지, CSV, 안내문을 함께 생성합니다.

git switch는 이 작업 사본의 브랜치를 선택합니다. 두 번째 후보와 비교한 다음 돌아오세요.

git switch river-plan
cat event.properties
git switch garden-plan

두 번째 계획은 Riverside Picnic이며, River steps에서 14:00에 모입니다. 이는 한 페이지에 다른 브랜치 배지만 붙인 것이 아니라, 실제로 서로 다른 소스 파일입니다.

후보 브랜치의 Jenkinsfile을 편집할 수 있으며, 나중에 요청하는 meeting_time 변경은 event.properties에서 수행합니다. 템플릿, 경로 이미지, 빌더, 게시 프로그램을 변경하지 마세요. 준비된 Jenkins 프로젝트나 브랜치 작업을 편집, 삭제, 이름 변경 또는 재생성하지 마세요. 모든 Git 및 Jenkins 이력과 보관된 모든 미리보기 아카이브, main 및 courtyard-notes 브랜치, 공식 프로그램, 안뜰 미리보기를 보존하세요. 이 실습에는 Docker나 관리자 명령이 필요하지 않습니다.

여기까지 살펴본 내용을 바탕으로 어느 후보가 10:00에 시작하고 어느 후보가 14:00에 시작하는지 확인하세요. 아직 후보 미리보기는 게시되지 않았습니다.

이제 Jenkins 자체 브랜치 탐색을 실행하고, 성공한 빌드와 실제 게시 결과를 비교합니다. Jenkins로 전환하고 Dashboard에서 community-previews를 여세요.

준비된 이 상위 작업은 Multibranch Pipeline입니다. Git 저장소에서 Jenkinsfile이 있는 브랜치를 스캔하고, 각 브랜치에 하위 Pipeline 작업을 만듭니다. 소스는 이 훈련 환경 안의 작은 읽기 전용 Git 서비스를 사용합니다. 나중에 푸시하면 작업 사본에 준비된 origin을 통해 소스 변경 사항을 게시하게 됩니다. 외부 계정이나 자격 증명은 필요하지 않습니다.

Jenkins 페이지가 완전히 로드될 때까지 기다린 다음 Scan Multibranch Pipeline Now를 선택하세요. Scan Multibranch Pipeline Log를 열고 Finished: SUCCESS를 기다리세요. 스캔은 garden-plan과 river-plan을 발견합니다. main과 courtyard-notes에는 Jenkinsfile이 없으므로 후보 작업이 아닙니다. community-previews 이동 경로 링크로 돌아가세요. 두 하위 빌드가 모두 끝날 때까지 기다리세요.

garden-plan을 열고, 번호가 지정된 빌드와 Console Output을 여세요. 출력에서 Garden Gathering, 10:00, 체크아웃한 소스 리비전을 확인할 수 있어야 합니다. community-previews를 통해 돌아가 river-plan을 열고, 번호가 지정된 빌드의 콘솔을 살펴보세요. Riverside Picnic, 14:00, 해당 브랜치의 소스 리비전이 표시되어야 합니다. 둘 다 SUCCESS로 끝나야 합니다. 이 준비된 환경에서는 체크아웃이 성공하기 전에 Using Default Git 도구 메시지가 나타날 수 있습니다. 실제 리비전과 최종 결과를 읽고 체크아웃 완료 여부를 판단하세요.

Source로 전환하세요. 제공된 Pipeline을 읽어 보세요.

cat Jenkinsfile

options { skipDefaultCheckout() }는 Declarative Pipeline의 암시적인 소스 체크아웃을 끄므로, 화면에 보이는 Check out this branch 단계에서 체크아웃을 명시적으로 수행합니다. checkout scm은 이 Jenkinsfile을 제공한 특정 브랜치 리비전을 사용합니다. 이를 고정된 브랜치를 체크아웃하는 방식으로 바꾸지 마세요.

제공된 Build preview 단계는 체크아웃한 소스를 실제 방문객 파일로 만듭니다. Archive preview는 Jenkins에 preview.zip을 보관하고, 이후 Publish preview가 동일한 바이트를 로컬 데스크로 전송합니다. 마지막 post 블록은 deleteDir()를 사용해 해당 빌드의 작업 공간을 비웁니다. 이 단계들과 정리 작업을 유지하세요.

environment 블록은 각 단계에 값을 제공합니다. 현재 두 브랜치에는 같은 설정이 들어 있습니다.

PREVIEW_KEY = 'shared'

PREVIEW_KEY는 데스크의 게시 주소를 선택합니다. 리터럴 문자열 'shared'는 체크아웃한 소스가 서로 달라도 두 빌드를 한 위치로 보냅니다. Preview Desk로 돌아가 새로 고침하세요. shared 후보 카드 하나가 있으며, 마지막에 게시한 브랜치가 표시됩니다. 해당 카드의 Open preview 링크를 선택하고 제목을 성공한 두 원본 빌드와 비교하세요. 이 주소 하나로는 독립된 미리보기 두 개를 공유할 수 없습니다.

브라우저의 Back 동작으로 데스크로 돌아가세요. 공식 프로그램과 안뜰 안내문은 여전히 작동해야 합니다. 별도의 브랜치 작업이 있다고 해서 게시 결과도 자동으로 분리되는 것은 아니라는 사실을 확인했습니다.

각 브랜치에 별도 미리보기 제공하기

이 단계에서는 각 브랜치의 Jenkinsfile을 변경하고 게시한 다음, 독립된 미리보기 두 개를 빌드합니다. Source의 /home/labex/project/community-site에서 시작하세요.

Jenkins는 Multibranch 빌드에서 env.BRANCH_NAME을 제공합니다. 이는 garden-plan과 같은 현재 브랜치 이름입니다. 공유 값을 Jenkins 자체 브랜치 식별 정보로 바꾸세요.

PREVIEW_KEY = "${env.BRANCH_NAME}"

Groovy의 큰따옴표 안에서는 ${...}로 변수 값을 삽입할 수 있습니다. 이 표현식을 작은따옴표로 감싸면 변수 값 대신 문자 자체가 그대로 유지됩니다. 이 실습의 브랜치 이름은 이미 미리보기 주소에 적합한 단순한 소문자와 하이픈을 사용합니다. 임의의 브랜치 이름에도 적용할 수 있는 일반적인 정제 규칙은 아닙니다.

먼저 garden 후보를 선택하세요. git status --short는 커밋하지 않은 변경 사항을 간결하게 보여 줍니다. M은 수정된 파일을 뜻하며, 출력이 없으면 작업 사본에 변경 사항이 없다는 뜻입니다. nano는 지정한 파일을 여는 터미널 편집기이며, 저장하고 종료할 때까지 이 터미널을 사용합니다.

git switch garden-plan
git status --short
nano Jenkinsfile

nano는 이 터미널에서 지정한 파일을 편집합니다. 화살표 키로 PREVIEW_KEY 줄로 이동하세요. Home을 눌러 줄의 시작으로 이동한 다음 Ctrl+K를 한 번 눌러 그 한 줄을 잘라내세요. 위에 제시된 교체 줄 전체를 들여쓰기까지 포함하여 입력하고, Enter를 눌러 다음 RECEIVER_URL 줄과 분리하세요. 다른 줄을 추가로 잘라내지 마세요. Ctrl+O로 저장하고, Enter를 눌러 Jenkinsfile을 확인한 다음, Ctrl+X로 종료하세요. 여기서 Ctrl은 macOS를 포함하여 Control 키를 누른 상태를 뜻합니다.

Git 이력에 기록하기 전에 편집 내용을 살펴보세요. git diff는 작업 파일을 커밋된 버전과 비교합니다. 앞서 사용한 것처럼 --no-pager는 터미널에 바로 출력하고, --는 옵션과 파일 경로를 구분합니다. 다음을 실행하세요.

git --no-pager diff -- Jenkinsfile

차이에는 이전 PREVIEW_KEY 줄의 삭제와 새 줄의 추가만 표시되어야 합니다. 접두사 -와 +는 삭제 및 추가된 텍스트를 나타내며, 파일에 입력할 문자가 아닙니다. 의도하지 않은 변경이 보이면 nano Jenkinsfile을 다시 열어 수정하고 저장한 뒤 종료하여 다시 살펴보세요. 파일을 찾을 수 없다는 오류가 보이면 pwd를 실행하고 위에 제시된 작업 디렉터리로 돌아가세요.

**커밋(commit)**은 스테이징된 소스 변경을 선택된 브랜치에 기록합니다. git add는 이 파일을 스테이징하고, git commit -m은 지정된 메시지로 기록하며, git push origin garden-plan은 해당 브랜치를 준비된 origin 저장소에 게시하여 Jenkins가 새 커밋을 발견할 수 있게 합니다. 이 커밋 명령들에서 큰따옴표는 여러 단어로 된 메시지를 하나의 인수로 묶습니다. 이 명령들은 소스 이력을 변경하며, 서비스 중인 미리보기를 직접 바꾸지는 않습니다.

git add Jenkinsfile
git commit -m "Give the garden plan its own preview"
git push origin garden-plan

이제 다른 후보에도 같은 설정을 적용하세요.

git switch river-plan
git status --short
nano Jenkinsfile

같은 nano 조작과 정확히 같은 큰따옴표 표현식을 사용하여 PREVIEW_KEY 줄만 바꾸세요. 저장하고 종료하세요. 이 브랜치를 검토하고 커밋한 다음 푸시하세요.

git --no-pager diff -- Jenkinsfile
git add Jenkinsfile
git commit -m "Give the river plan its own preview"
git push origin river-plan

Git이 커밋하지 않은 변경 사항 때문에 전환을 거부하면, 먼저 현재 브랜치에서 git status --short를 실행하고 차이를 살펴보세요. 전환하기 전에 의도한 편집을 마치거나 수정하세요. 파일을 버리거나 저장소를 초기화하지 마세요. 의도한 편집을 이미 커밋한 뒤 git commit이 커밋할 내용이 없다고 하면, git --no-pager log -1 --oneline을 살펴보고 브랜치 푸시를 계속하세요. -1은 이 화면에 커밋 하나만 표시하게 하고, --oneline은 짧은 식별자와 메시지를 보여 줍니다.

Jenkins로 전환하고 이동 경로 링크로 community-previews에 돌아간 다음, Scan Multibranch Pipeline Now를 다시 선택하세요. 이 로컬 실습에는 웹훅이 없으므로 소스를 푸시하는 것만으로는 스캔이 요청되지 않습니다. 스캔과 새 하위 빌드 두 개가 모두 성공적으로 끝날 때까지 기다리세요. 각 콘솔에는 해당 브랜치만의 미리보기 키가 표시되어야 합니다. 빌드가 Groovy 구문 오류를 보고하면 Source에서 해당 Jenkinsfile의 따옴표와 중괄호를 수정하고, 해당 브랜치에 수정 사항을 커밋하고 푸시한 다음 다시 스캔하세요. 소스 대신 생성된 하위 작업을 편집하지 마세요.

Preview Desk로 전환하고 새로 고침하세요. 이제 garden-plan과 river-plan 카드가 따로 있어야 합니다. 이전 shared 카드는 앞서 관찰한 결과로 남아 있어도 됩니다. 각 후보의 Open preview 링크를 열고 올바른 제목, 모임 시각, 세 활동, 경로 이미지, CSV, 방문객 안내문을 확인하세요. 계획을 살펴본 뒤에는 브라우저의 Back 동작으로 해당 개요로 돌아가고, 다시 Back으로 데스크로 돌아온 다음 다른 카드를 여세요. 두 미리보기 주소는 서로 달라야 하며, 동시에 계속 사용할 수 있어야 합니다.

독립된 garden-plan 및 river-plan 카드가 있는 Preview Desk

각 제목과 원래 모임 시각 위에 있는 garden-plan 및 river-plan 키를 찾으세요. 남아 있는 shared 카드는 이전 충돌을 보여 주며, 어느 독립 미리보기도 대신하지 못합니다.

Jenkins에서 각 브랜치의 가장 최근 성공한 빌드 상태 페이지를 열고, Build Artifacts에서 preview.zip을 다운로드하세요. 각 ZIP을 서로 다른 새 폴더에 추출하고 index.html을 여세요. 일곱 파일을 모두 함께 유지하세요. 페이지와 첨부 파일이 로컬에서 작동해야 합니다. 텍스트 첨부 파일은 새 다운로드를 시작하는 대신 바로 열릴 수 있습니다. build.json은 실제 원본 브랜치와 커밋을 식별합니다. 완전한 이 미리보기들이 결과물이며, 성공을 나타내는 빌드 표시 두 개만으로는 충분하지 않습니다.

한 계획을 업데이트하고 다른 계획 보존하기

이 단계에서는 garden 모임 시각을 바꾸고 다시 스캔하여 해당 브랜치의 미리보기만 업데이트합니다. Jenkins에서 시작하고 가장 최근 성공한 river-plan 빌드 번호를 적어 두세요. 비교할 수 있도록 해당 미리보기를 열어 두세요.

Source로 전환하세요. garden 브랜치를 선택하고 작은 데이터 파일을 편집하세요.

git switch garden-plan
git status --short
nano event.properties

meeting_time 줄 전체만 meeting_time=10:00에서 다음 내용으로 바꾸세요.

meeting_time=10:30

Pipeline 줄에 사용했던 것과 동일하게 화살표 키, Home, 한 번의 Ctrl+K, 교체 텍스트 입력, Enter 조작을 사용하세요. Ctrl+O, Enter로 저장하고 Ctrl+X로 종료하세요. 빌더는 이 값 하나를 읽어 페이지, CSV, 안내문을 일관되게 유지합니다. 생성된 방문객 파일은 편집하지 않습니다.

이 소스 업데이트를 검토하고 게시하세요.

git --no-pager diff -- event.properties
git add event.properties
git commit -m "Move the garden meeting to 10:30"
git push origin garden-plan

차이에는 해당 모임 시각 변경만 있어야 합니다. 그렇지 않으면 커밋하기 전에 파일을 수정하세요. river 브랜치에는 소스 변경이 없습니다.

Jenkins로 전환하고 community-previews로 돌아가 Scan Multibranch Pipeline Now를 선택하세요. 인덱싱 후 garden 작업은 변경된 리비전으로 새 빌드를 실행하고, 변경되지 않은 river 브랜치는 적어 둔 빌드 번호를 유지해야 합니다. garden 빌드가 SUCCESS로 끝날 때까지 기다리세요. Console Output을 열고 새 커밋 및 10:30을 소스 변경과 연결해 보세요.

스캔에서 변경 사항이 없다고 하고 garden 미리보기가 이전 상태라면 Source로 돌아가세요. git status --short와 git --no-pager log -1 --oneline을 확인하고, 의도한 변경이 garden-plan에 커밋되었는지 확인한 다음, 해당 브랜치를 푸시한 뒤 다시 스캔하세요. origin에 도달하지 않은 로컬 파일 편집이나 커밋은 아직 Jenkins가 발견할 수 있는 소스가 아닙니다. 빌드가 실패하면 콘솔을 읽고, 추가 커밋과 푸시를 통해 표시된 소스 오류를 수정하세요. VM을 초기화하거나 제공된 빌더를 교체하지 마세요.

Preview Desk로 전환하고 새로 고침하세요. garden-plan을 여세요. 이제 Garden Gathering의 모임 시각은 10:30이어야 합니다. Explore this plan, 다운로드한 활동 CSV, 전체 방문객 안내문을 살펴보세요. 모임 시각이 모든 곳에서 일치해야 합니다. river-plan을 여세요. Riverside Picnic은 여전히 14:00에 모이며, 원래 활동과 정상 첨부 파일을 유지해야 합니다. 해당 build.json은 이전 소스 커밋과 Jenkins 자체 빌드 번호를 유지해야 합니다. 이 마지막 업데이트에서는 변경되지 않은 해당 하위 작업을 다시 실행하지 마세요.

Jenkins로 돌아가 최신 garden preview.zip을 다운로드하세요. 또 다른 새 폴더에 추출하고 로컬 페이지, 이미지, CSV, 안내문 검사를 반복하세요. 새 garden 커밋을 식별해야 하며, 앞서 다운로드한 river 자료 묶음도 여전히 독립적으로 사용할 수 있어야 합니다.

마지막으로 Preview Desk로 돌아가 Open the official program과 Read the courtyard notes를 열고, 두 프로그램이 모두 온전히 유지되는지 확인하세요. 원래 브랜치 및 빌드 이력을 보존하세요. 이후 소스를 편집할 때마다 완료 검사 전에 커밋하고 푸시한 뒤 해당 Jenkins 빌드를 완료하세요. 이제 서비스 중인 미리보기 두 개와, 한쪽을 업데이트해도 다른 쪽을 덮어쓰거나 다시 빌드하지 않았다는 증거가 있습니다.

요약

Jenkins 자체 Multibranch 탐색과 각 Jenkinsfile에 연결된 소스 리비전을 사용한 다음, Jenkins의 브랜치 식별 정보로 게시 위치를 분리했습니다. 이제 두 계획 모두 독립된 주소에서 사용 가능한 페이지, 이미지, 첨부 파일을 제공합니다. 이후의 garden 커밋은 해당 미리보기만 업데이트했으며, river 빌드, 공식 프로그램, 안뜰 미리보기는 온전히 유지되었습니다.