홈 › CI/CD › 01 / 7

CI/CD 개념과 파이프라인

섹션 7진행 0 / 7

3. 코드 예제

예제 1: 소스 준비와 ci.sh 의 run_step 함수 — 01_pipeline.sh 발췌

bash
run_step() {
    STEP=$((STEP + 1))
    local name="$1"; shift
    local start=$SECONDS
    echo "-- 단계 $STEP: $name --"
    if "$@"; then
        local elapsed=$((SECONDS - start))
        echo "$name ${elapsed}s" >> timing.log
        echo "[OK] $name"
    else
        local code=$?
        echo "[FAIL] $name (종료 코드 $code)"
        echo "파이프라인 중단"
        exit "$code"
    fi
}
text
== 1. 소스 준비 (checkout 대신) ==
파일 3개 준비 완료: Main.java, Calc.java, CalcTest.java
== 2. 로컬 파이프라인 러너 생성 (ci.sh) ==
ci.sh 생성 완료 (34줄)

run_step 은 이름과 명령을 받아 실행하고, 성공하면 [OK], 실패하면 종료 코드를 남기고 그 자리에서 exit 합니다. "$@" 로 명령을 그대로 실행해 javac·java·jar 어떤 명령이든 같은 함수로 감쌀 수 있습니다.

예제 2: 성공 시나리오 실행 — 01_pipeline.sh 발췌

bash
run_step "checkout" true
run_step "build" "$JAVA_BIN/javac" -encoding UTF-8 -d out src/Main.java src/Calc.java src/CalcTest.java
run_step "test" "$JAVA_BIN/java" -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -cp out CalcTest
run_step "정적 검사" "$JAVA_BIN/javac" -encoding UTF-8 -Xlint:all -Werror -d out src/Main.java src/Calc.java src/CalcTest.java
run_step "패키징" "$JAVA_BIN/jar" --create --file deploy/app.jar --main-class Main -C out .
run_step "배포" bash -c 'echo "deploy/app.jar 를 배포 대상 서버로 복사한다고 가정"'
text
== 3. 파이프라인 실행 - 성공 시나리오 ==
-- 단계 1: checkout --
[OK] checkout
-- 단계 2: build --
[OK] build
-- 단계 3: test --
테스트 통과: 2+3 = 5
[OK] test
-- 단계 4: 정적 검사 --
[OK] 정적 검사
-- 단계 5: 패키징 --
[OK] 패키징
-- 단계 6: 배포 --
deploy/app.jar 를 배포 대상 서버로 복사한다고 가정
[OK] 배포
파이프라인 성공
종료 코드: 0

여섯 단계가 순서대로 실행되며, 테스트 단계는 CalcTest.main 이 직접 검증한 결과를 출력합니다. 정적 검사 단계는 같은 소스를 -Xlint:all -Werror 로 다시 컴파일해 경고를 오류로 취급합니다.

예제 3: 재현 가능한 산출물 확인 — 01_pipeline.sh 발췌

bash
echo "패키징 결과 (클래스 파일 해시, jar 자체는 타임스탬프 때문에 제외):"
"$JAVA_BIN/jar" tf deploy/app.jar | grep '\.class
  

 | sort
sha256sum out/*.class | sort
text
패키징 결과 (클래스 파일 해시, jar 자체는 타임스탬프 때문에 제외):
Calc.class
CalcTest.class
Main.class
896dcde3242877b97fd98c5c423ff1764383b0f438f0538ff88527375745c953 *out/Main.class
a2a6e596fdf72ed73590fe4f93d60534285beb1a6ec7b6fedbef3f56aa4fe252 *out/Calc.class
f95c720ee3ff7a2c651c776582a7dc7161ce3bc35e3c358ee8520faa2cdcf98b *out/CalcTest.class

jar tf 로 jar 안 항목 목록을, sha256sum 으로 클래스 파일 각각의 해시를 확인합니다. 소스가 그대로면 이 값은 몇 번을 다시 빌드해도 항상 같습니다.

예제 4: 버그 주입 후 실패 시나리오 — 01_pipeline.sh 발췌

bash
sed -i 's/return a + b;/return a - b;/' src/Calc.java
rm -rf deploy && mkdir -p deploy
bash ci.sh "$JAVA_BIN"
CODE=$?
echo "종료 코드: $CODE"
ls deploy 2>/dev/null | sort
text
== 4. 버그 주입 후 재실행 - 실패 시나리오 ==
-- 단계 1: checkout --
[OK] checkout
-- 단계 2: build --
[OK] build
-- 단계 3: test --
테스트 실패: 2+3 = -1 (기대값 5)
[FAIL] test (종료 코드 1)
파이프라인 중단
종료 코드: 1
deploy 폴더 상태 (패키징·배포 단계까지 못 가서 비어 있어야 정상):
(비어 있음)

sed 로 Calc.add 의 연산을 + 에서 - 로 바꿔 테스트가 실패하게 만들었습니다. 빌드는 통과했지만 테스트에서 멈춰 정적 검사·패키징·배포는 실행되지 않았고, deploy 폴더는 비어 있습니다.