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 등 다양한 언어의 빌드를 표준화할 수 있습니다.
참고 자료
Comments powered by Disqus.