Post

[CI/CD] S2I(Source to Image) 완전 정리: Tekton 파이프라인 컴파일 단계

📌 들어가며

이번 글에서는 소스 코드를 컴파일하는 스크립트 기반 빌드 도구 S2I(Source to Image)를 정리한다. Red Hat/OpenShift가 만든 방식으로, Tekton 파이프라인의 컴파일 단계에서 assemble 스크립트로 빌드 산출물(JAR/WAR)을 만든다.

S2I란? S2I Builder Image 내부에서 소스를 컴파일/빌드하는 스크립트 도구. 핵심은 이미지를 만들지 않는다는 점 — 컴파일 도구가 설치된 환경을 제공해 빌드 산출물만 생성하고, 이미지 생성은 별도 Task(Buildah 등)가 담당한다.

1
소스 코드 → assemble 스크립트 → 컴파일 산출물(JAR/WAR)

1. assemble 스크립트

S2I Builder Image 내부 표준 경로에 존재하는 빌드 스크립트다.

항목
스크립트 위치/usr/libexec/s2i/assemble
입력 경로/tmp/src(소스)
출력 경로/tmp/src/target 또는 /dist
실행sh /usr/libexec/s2i/assemble

2. Tekton Workspace 연결 (심볼릭 링크)

S2I Builder Image가 기대하는 표준 경로(/usr/libexec/s2i)와 Tekton Workspace 경로를 심볼릭 링크로 잇는다.

1
2
ln -s $(workspaces.s2i.path)/s2i/bin /usr/libexec/s2i
# /usr/libexec/s2i ──링크──→ /workspace/s2i/s2i/bin
flowchart LR
    Std["/usr/libexec/s2i<br/>(Builder가 기대하는 경로)"]
    WS["/workspace/s2i/s2i/bin<br/>(assemble·run·save-artifacts)"]
    Std -- "심볼릭 링크" --> WS

💡 왜 링크를 거나 — S2I Builder Image는 무조건 /usr/libexec/s2i/assemble을 찾는다. 하지만 실제 스크립트는 Tekton Workspace(PVC)에 있다. 그래서 표준 경로를 Workspace로 링크해, Builder가 기대하는 위치에서 실제 스크립트가 실행되게 한다.


3. 실무 — Maven 컴파일 Task

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: maven-build
spec:
  workspaces:
    - name: source
  steps:
    - name: compile
      image: registry.example.com/s2i-java:11   # Maven 포함 Builder
      workingDir: $(workspaces.source.path)
      script: |
        #!/bin/bash
        set -e
        mkdir -p /tmp/src
        cp -R $(workspaces.source.path)/. /tmp/src/      # ① Workspace → /tmp/src
        sh /usr/libexec/s2i/assemble                      # ② assemble 실행
        cp -R /tmp/src/target $(workspaces.source.path)/  # ③ 산출물 → Workspace
        ls -la $(workspaces.source.path)/target/*.jar

assemble 내부(예시):

1
2
3
#!/bin/bash -e
cd /tmp/src
mvn clean package -DskipTests

4. 전체 빌드 흐름

S2I는 컴파일만 담당하고, 이미지 빌드·푸시는 뒤 Task가 맡는다.

flowchart LR
    Git["Git Push/Tag"] --> Op["CICD Operator<br/>PipelineRun 생성"]
    Op --> T1["Task1 compile<br/>(S2I assemble)"]
    T1 --> T2["Task2 build-image<br/>(Buildah)"]
    T2 --> T3["Task3 push<br/>(HyperRegistry)"]
Task도구역할
compileS2I assemble소스 → JAR
build-imageBuildah/PodmanJAR → 컨테이너 이미지
push-레지스트리 푸시

5. 흔한 실수

⚠️ ① 산출물 복사 누락assemble/tmp/src/targetWorkspace로 복사 안 하면 다음 Task에서 JAR을 못 찾는다. ② 소스 경로 혼동 — Workspace에서 바로 assemble하면 /tmp/src에 소스가 없어 실패. 반드시 /tmp/src로 먼저 복사. set -e 누락 — 없으면 Maven 빌드가 실패해도 Task가 성공으로 표시된다. 스크립트 첫 줄에 set -e를 둔다.

1
2
3
4
# ✅ 올바른 순서
cp -R $(workspaces.source.path)/. /tmp/src/   # 소스 복사
sh /usr/libexec/s2i/assemble                   # 빌드
cp -R /tmp/src/target $(workspaces.source.path)/   # 산출물 회수

📝 정리

1
2
3
4
5
S2I (Source to Image)
├─ 역할   assemble로 소스 컴파일(이미지 X, 산출물 O)
├─ 경로   /usr/libexec/s2i/assemble ← Workspace 심볼릭 링크
├─ 흐름   compile(S2I) → build-image(Buildah) → push
└─ 실수   산출물 복사·소스 경로·set -e 누락 주의
개념한 줄 정의
S2I소스 컴파일 스크립트 도구
assemble빌드 산출물 생성 스크립트
역할 분담S2I=컴파일, Buildah=이미지

S2I의 핵심은 assemble이 컴파일만 하고 이미지는 안 만든다는 것이다. 언어별 Builder Image만 교체하면 Java·Node·Python을 동일한 파이프라인 구조로 표준화할 수 있는 것이 최대 장점이다.


🔗 참고

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.