Post

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

S2I (Source to Image)

1. 개요

한 줄 요약: S2I Builder Image 내부에서 소스 코드를 컴파일/빌드하는 스크립트 기반 빌드 도구 (Red Hat / OpenShift 개발)

언제 사용하나:

  • Tekton Pipeline에서 소스 코드를 컴파일할 때
  • S2I Builder Image의 빌드 도구(Maven, npm, Gradle 등)를 활용해 빌드 산출물만 생성
  • 별도 이미지 생성 없이 빌드 결과물을 Workspace에 저장

핵심 흐름:

1
소스 코드 → assemble 스크립트 실행 → 컴파일된 산출물 (JAR, WAR 등)

assemble은 이미지 빌드를 하지 않습니다. 컴파일 도구가 설치된 환경을 제공하고 빌드 산출물만 만드는 역할입니다. 이미지 생성은 별도 Task (Buildah 등)에서 처리합니다.


2. 핵심 개념

2.1. assemble 스크립트

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

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

2.2. Tekton Workspace와 S2I의 관계

1
2
3
4
5
6
7
8
9
Tekton Workspace (PVC)
  └── $(workspaces.s2i.path) = /workspace/s2i

  /workspace/s2i/
    └── s2i/
        └── bin/
            ├── assemble        ← Maven 빌드 스크립트
            ├── run             ← 실행 스크립트
            └── save-artifacts  ← 아티팩트 저장 스크립트

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

1
2
3
# 심볼릭 링크 생성
ln -s $(workspaces.s2i.path)/s2i/bin /usr/libexec/s2i
# → /usr/libexec/s2i ──링크──→ /workspace/s2i/s2i/bin

Before (링크 생성 전):

1
2
3
4
5
6
7
/workspace/s2i/s2i/bin/
  ├── assemble     ← 실제 스크립트
  ├── run
  └── save-artifacts

/usr/libexec/
  (아무것도 없음)

After (링크 생성 후):

1
2
3
4
5
6
7
/workspace/s2i/s2i/bin/
  ├── assemble     ← 실제 파일
  ├── run
  └── save-artifacts

/usr/libexec/
  └── s2i ────────────────→ /workspace/s2i/s2i/bin (심볼릭 링크)

2.3. src-maven-img-aicd 이미지

HyperCloud 환경에서 사용하는 컴파일 이미지입니다.

  • JDK, Maven 등 빌드 도구 포함
  • S2I assemble 스크립트 내장
  • Tekton의 compile 단계에서 사용

3. 실무 패턴

3.1. Java Maven 컴파일 Task

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: maven-build
spec:
  workspaces:
    - name: source
      description: 소스 코드 및 빌드 결과물 저장
  steps:
    - name: compile
      image: registry.example.com/s2i-java:11  # Maven 포함된 Builder Image
      workingDir: $(workspaces.source.path)
      script: |
        #!/bin/bash
        set -e

        echo "=== Copying source to /tmp/src ==="
        mkdir -p /tmp/src
        cp -R $(workspaces.source.path)/. /tmp/src/

        echo "=== Running Maven build via assemble ==="
        sh /usr/libexec/s2i/assemble

        echo "=== Copying build artifacts back to workspace ==="
        cp -R /tmp/src/target $(workspaces.source.path)/

        echo "=== Build output ==="
        ls -la $(workspaces.source.path)/target/*.jar

assemble 스크립트 내부 (예시):

1
2
3
4
5
6
7
8
#!/bin/bash -e
cd /tmp/src

echo "---> Building with Maven"
mvn clean package -DskipTests

echo "---> Build completed"
ls -la /tmp/src/target/*.jar

결과: Workspace에 target/app.jar 생성 → 다음 Task (이미지 빌드 또는 배포)에서 사용

3.2. HyperCloud IC에서 S2I 사용 예시

1
2
3
4
5
6
# IntegrationConfig의 compile 단계
jobs:
  postSubmit:
    - name: compile
      image: scr-maven-img-aicd          # S2I assemble 스크립트 포함된 이미지
      script: /usr/local/s2i/bin/assemble

3.3. 빌드 흐름 전체

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Git Push / Tag
  ↓
CICD Operator → PipelineRun 생성
  ↓
[Task 1] compile (S2I assemble)
  - src-maven-img-aicd 컨테이너 실행
  - Workspace → /tmp/src 복사
  - sh /usr/libexec/s2i/assemble 실행
  - /tmp/src/target/*.jar → Workspace 복사
  ↓
[Task 2] build-image (Buildah)
  - Workspace의 JAR 파일로 컨테이너 이미지 빌드
  ↓
[Task 3] push-image
  - HyperRegistry에 이미지 푸시

4. 주의사항 및 흔한 실수

빌드 산출물 경로 누락

1
2
3
4
5
6
7
# ❌ assemble 실행 후 Workspace로 복사 안 함
sh /usr/libexec/s2i/assemble
# → 다음 Task에서 target/*.jar 없음

# ✅ assemble 후 반드시 Workspace로 복사
sh /usr/libexec/s2i/assemble
cp -R /tmp/src/target $(workspaces.source.path)/

소스 코드 경로 혼동

1
2
3
4
5
6
# ❌ Workspace 경로에서 직접 assemble 실행
# → /tmp/src에 소스 없어서 빌드 실패

# ✅ Workspace → /tmp/src 복사 후 실행
cp -R $(workspaces.source.path)/. /tmp/src/
sh /usr/libexec/s2i/assemble

빌드 실패 시 에러 무시

1
2
3
4
5
6
7
8
# ❌ set -e 없이 실행
sh /usr/libexec/s2i/assemble
# → Maven 빌드 실패해도 Task 성공으로 표시됨

# ✅ 스크립트 시작에 set -e 추가
#!/bin/bash
set -e   # 에러 시 즉시 중단
sh /usr/libexec/s2i/assemble

버전 호환성

  • S2I 자체는 K8s 버전과 무관하지만, Builder Image의 빌드 도구 버전 확인 필요
  • Maven 3.6+, Node.js 14+ 등 언어/빌드 도구 버전 맞춰야 함

5. 핵심 정리

1
2
3
4
5
S2I의 역할 분담:

assemble 스크립트   →  소스 코드 컴파일 (JAR/WAR 생성)
Buildah / Podman   →  컨테이너 이미지 빌드
Tekton Workspace   →  Task 간 빌드 산출물 공유

S2I를 사용하는 이유: 언어별 Builder Image만 교체하면 동일한 파이프라인 구조로 Java, Node.js, Python 등 다양한 언어의 빌드를 표준화할 수 있습니다.


참고 자료

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

Comments powered by Disqus.