가게 업데이트 전에 테스트하기

JenkinsBeginner
지금 연습하기

소개

Moss & Mallow는 가상의 동네 선물 가게입니다. 새 씨앗 키트 컬렉션에서도 기존의 묶음 할인과 배송 규칙을 유지해야 합니다. 가게는 이미 정상적으로 운영되고 있지만, 제공된 Jenkins Pipeline은 실제 가격 테스트가 실패해도 릴리스 후보를 게시할 수 있습니다.

이 실습에서는 실제 테스트 실패 내용을 읽고, Jenkins 빌드 상태를 릴리스 결정과 연결한 다음, 정상적으로 작동하는 후보를 게시합니다. 기본적인 Jenkins 화면 탐색과 짧은 Declarative Pipeline을 알아볼 수 있는 능력을 전제로 합니다. 새로 사용하는 테스트 보고서와 게이트 설정은 실습에서 설명합니다. 애플리케이션 프로그래밍, 소프트웨어 설치, 클라우드 계정 또는 실제 구매는 필요하지 않습니다.

고객의 이용 과정을 확인할 때는 Gift Shop을, 설정과 빌드 작업을 할 때는 Jenkins를 사용합니다. 두 서비스는 준비된 하나의 VM에서 실행됩니다. 두 후보인 broken과 fixed는 제공된 테스트용 버전입니다. 각 단원은 독립적으로 시작합니다. 예상 소요 시간에는 읽기와 일반적인 실수에 드는 시간이 포함되어 있으며, 초보자를 대상으로 측정한 값은 아닙니다.

실패한 테스트가 실제로 무엇을 멈추는지 확인하기

이 단계에서는 정상 가격과 실제 실패한 테스트를 비교하고, 불안정한 Jenkins 빌드가 왜 여전히 게시를 수행할 수 있는지 알아봅니다. Gift Shop에서 시작하세요.

Find a little gift 또는 탐색 메뉴의 Shop을 선택하세요. 씨앗 키트 하나의 가격은 £12입니다. 씨앗 키트를 세 개 이상 구매하면 10% 묶음 할인이 적용됩니다. 배송비는 £4이며, 상품 금액 합계가 £40 이상이면 무료입니다. 표시된 가격은 예상 금액이며, 가게는 결제를 받지 않습니다.

씨앗 키트의 Quantity를 3으로 설정하고 Check basket을 선택하세요. 정상적인 상품 금액은 £32.40, 배송비는 £4.00, 총액은 £36.40입니다. Shop을 눌러 돌아가세요. 피크닉 상자 두 개도 확인하세요. 상품 금액은 £40.00이며 배송은 무료입니다. Visit을 열어 씨앗 관리 카드를 다운로드하고, 저장된 텍스트 파일을 읽어 보세요. 실습을 마칠 때도 이러한 정상 기능을 계속 사용할 수 있어야 합니다.

**후보(candidate)**는 릴리스 대상으로 검토 중인 버전입니다. **빌드(build)**는 Jenkins를 한 번 실행한 것으로, 고유한 번호, 매개변수, 결과를 가집니다. Jenkins 탭으로 전환하세요. shop-update를 연 다음 Build with Parameters를 선택하세요. RELEASE를 broken으로 둔 채 Build를 선택하세요. 이 첫 실행에서는 문제를 관찰할 수 있도록 잘못된 훈련용 후보를 의도적으로 게시합니다. 실제 고객에게는 영향을 주지 않습니다.

빌드가 끝날 때까지 기다리세요. Builds 아래에서 해당 번호의 항목을 연 다음 Console Output을 여세요. Pipeline에는 세 단계가 있습니다. Prepare는 선택한 후보를 빌드 작업 공간으로 복사하고, Test는 제공된 가격 검사를 실행하며, Publish는 패키지를 가게에 전달합니다.

콘솔에는 다음과 같이 일정하게 나타나는 줄들이 포함되어야 합니다.

Pricing failures: 1
Release received
Finished: UNSTABLE

UNSTABLE은 테스트 실패와 같은 품질 문제가 빌드에 있다는 뜻입니다. 이 상태 자체가 이후의 모든 단계를 막는 것은 아닙니다. Release received는 이 Pipeline이 여전히 게시를 수행했음을 보여 줍니다.

해당 빌드에서 Tests를 여세요. 실패한 seed_bundle 테스트를 열고 실패 세부 정보를 읽어 보세요.

Expected 3240 400; got 2880 400

실제 Jenkins 테스트 보고서: 실패한 사례 하나와 통과한 사례 세 개

값의 단위는 펜스입니다. 테스트는 상품 금액 £32.40과 배송비 £4를 예상했지만, 후보는 상품 금액을 £28.80으로 계산했습니다. 나머지 세 테스트는 통과했습니다. 이 결과는 실제 후보의 가격 계산 프로그램을 실행해서 얻은 것이며, XML 보고서는 그 비교 결과로 생성됩니다.

Gift Shop으로 전환하고 Shop을 눌러 씨앗 키트 세 개를 다시 확인하세요. 필요하면 페이지를 새로 고침하세요. 이제 잘못된 총액인 £32.80이 표시됩니다. 단순한 경고 색상이 아니라 실제로 잘못된 릴리스가 게시된 것을 확인한 것입니다. 이 단계의 검사를 실행하기 전에 해당 번호의 Jenkins 빌드로 돌아가세요.

테스트 결과를 게시 여부와 연결하기

이 단계에서는 실패한 테스트를 계속 확인할 수 있으면서도 Publish 단계는 실행되지 않도록 Pipeline을 변경합니다. Jenkins에서 시작하고, 이동 경로 링크를 사용해 shop-update 작업 페이지를 여세요.

Configure를 선택한 다음 Pipeline 섹션으로 이동하세요. Script 편집기에는 Declarative Pipeline이 들어 있습니다. agent any는 사용 가능한 Jenkins 실행기를 선택합니다. 이 준비된 입문용 환경에서는 컨트롤러 컨테이너 안에서 실행됩니다. 작업 공간(workspace)은 해당 빌드에 할당된 디렉터리입니다. 독립 에이전트는 별도의 프로젝트에서 배웁니다.

Test 단계를 읽어 보세요. 제공된 sh returnStatus: true, script: ... 줄은 테스트 스크립트를 실행하고, 즉시 Pipeline 오류를 발생시키는 대신 종료 상태를 반환합니다. 따라서 다음 junit 단계에서 테스트 세부 정보를 게시할 수 있습니다. 종료 상태가 0이면 스크립트가 통과했다는 뜻이고, 0이 아니면 통과하지 못했다는 뜻입니다. junit은 XML 결과 파일을 읽어 테스트를 이 빌드에 연결하며, 일반적으로 테스트가 실패하면 빌드를 UNSTABLE로 표시합니다.

Pipeline **옵션(option)**은 Jenkins가 Pipeline을 실행하는 방식을 바꿉니다. agent any 바로 다음에 아래 줄을 추가하세요. 중괄호는 옵션을 하나로 묶습니다. 여는 중괄호와 닫는 중괄호를 모두 표시된 그대로 유지하세요.

options { skipStagesAfterUnstable() }

이제 스크립트의 시작 부분은 다음과 같아야 합니다. 수신자 주소와 제공된 Prepare, Test, Publish 단계를 포함하여 나머지 기존 줄은 모두 유지하세요.

pipeline {
    agent any
    options { skipStagesAfterUnstable() }

이 옵션은 빌드가 불안정한 상태가 된 후의 단계들을 건너뜁니다. 실패한 테스트를 통과로 바꾸지는 않습니다. 기본 보고서 게시 구문을 유지하세요.

junit testResults: 'reports/pricing.xml'

후보 복사, test-shop.sh 실행, 패키지 게시에 사용하는 기존 셸 호출을 유지하세요. 테스트 보고서는 반드시 해당 테스트 실행기로 생성해야 합니다. 보고서를 작성하는 단계로 대체하거나 다른 셸 명령을 추가하지 마세요.

skipMarkingBuildUnstable: true를 추가하지 마세요. 이 설정은 게이트가 의존하는 빌드 상태 표시를 억제합니다. 테스트를 제거하거나, 예상 가격을 바꾸거나, 제공된 후보나 게시 프로그램을 변경하거나, 모든 후보의 게시를 건너뛰지 마세요.

Save를 선택하세요. Build with Parameters를 선택하고 broken을 유지한 채 Build를 선택하세요. 새 번호가 지정된 빌드가 끝날 때까지 기다리세요. Console Output을 여세요. 이번에는 다음 내용이 표시되어야 합니다.

Pricing failures: 1
Stage "Publish" skipped due to earlier stage(s) marking the build as unstable
Finished: UNSTABLE

Tests를 여세요. 동일한 실패 테스트 하나와 통과한 테스트 세 개가 계속 있어야 합니다. 새 빌드에는 Release received가 없어야 합니다. 가게에는 이전의 잘못된 릴리스가 여전히 표시될 수 있습니다. 새 시도를 차단해도 이전 게시가 자동으로 되돌려지지는 않기 때문입니다. 다음 단계에서 정상 후보로 교체합니다.

빌드가 대신 Groovy 구문 오류를 보고하면 Configure를 다시 여세요. 추가한 options 줄이 pipeline 안에서 agent any 바로 아래에 있고, 중괄호의 짝이 맞는지 확인하세요. 수정한 뒤 Save를 선택하고 broken을 다시 실행하세요. 구문 오류가 발생한 것만으로는 이 단계를 완료한 것이 아닙니다. Jenkins는 때때로 Checks API 게시자 알림을 출력합니다. 이 로컬 과정에서는 호스팅된 Git 서비스를 사용하지 않으므로, 그 알림은 실제 테스트 결과를 대신하지 않습니다.

정상적으로 작동하는 후보 게시하기

이 단계에서는 동일한 Pipeline이 올바른 업데이트를 전달하면서도 정상적인 고객 이용 과정을 유지할 수 있음을 입증합니다. Jenkins의 shop-update 작업 페이지에서 시작하세요.

Build with Parameters를 선택하세요. RELEASE를 fixed로 설정한 다음 Build를 선택하세요. 이렇게 하면 제공된 정상 후보가 선택됩니다. 방금 테스트한 Pipeline을 변경하는 것은 아닙니다. 완료될 때까지 기다린 뒤 새 빌드의 Console Output을 여세요.

Pricing failures: 0
Release received
Finished: SUCCESS

Tests를 여세요. 네 개의 가격 테스트가 모두 통과해야 합니다. 해당 빌드의 상태 페이지로 돌아가 Build Artifacts를 찾으세요. shop-release.tar.gz를 다운로드하세요. 아티팩트(artifact)는 Jenkins가 이 빌드를 위해 보관하는 파일입니다. 이 압축 아카이브에는 가격 계산 프로그램, 릴리스 메타데이터, 관리 카드가 들어 있습니다. 이 아카이브는 가게로 전송되는 실제 패키지이기도 하며, 별도로 다시 빌드한 복사본이 아닙니다.

Gift Shop으로 전환하고 브랜드 링크를 선택해 홈으로 돌아간 다음 새로 고침하세요. 이제 컬렉션은 Gifts to grow together입니다. Shop을 열고 씨앗 키트 세 개를 확인하세요. 상품 금액은 £32.40, 배송비는 £4.00, 총액은 £36.40이어야 합니다. 피크닉 상자 두 개의 배송은 여전히 무료여야 합니다. Delivery와 Visit을 열고 관리 카드를 다시 다운로드하여 내용이 온전한지 확인하세요.

상품 금액, 배송비, 총액이 올바르게 표시된 정상 장바구니

최종 검사는 실제 실패 및 성공 빌드를 현재 저장된 Pipeline 및 배포된 파일 바이트와 연결합니다. 이 실행들 이후에 Pipeline을 편집했다면 broken을 실행한 다음 fixed를 다시 실행하여, 두 결과가 모두 제출하는 버전을 나타내도록 하세요. 이전 빌드와 원래 가게 리소스를 유지하세요. 보고서를 작성하거나 콘솔 내용을 파일로 복사할 필요는 없습니다.

실수로 broken을 다시 선택했다면 게이트를 그대로 둔 채 fixed를 실행하세요. Jenkins가 아직 빌드 중이라면 빌드를 계속 추가로 요청하지 말고, 해당 번호의 빌드에서 최종 결과가 나올 때까지 기다리세요. 홈페이지만 정상적으로 열리는 것으로는 충분하지 않습니다. 장바구니 가격과 다운로드도 완성된 작업의 일부입니다.

요약

실제로 실패한 가격 테스트를 관찰하고, 불안정한 빌드가 왜 여전히 게시를 수행하는지 확인한 뒤 Jenkins 테스트 결과를 릴리스 게이트와 연결했습니다. 그런 다음 동일한 Pipeline을 사용하여 정상 후보를 전달하고 실제 가격, 보관된 패키지, 가게의 정상 기능을 확인했습니다.