メインコンテンツまでスキップ

Jenkins Dev パイプライン

developブランチをプッシュすると、Jenkinsが自動的にビルドし、K8sdevnamespaceにデプロイします。

Jenkinsへの接続

項目
URL社内Jenkinsサーバー (VPN必要)
ビューInfoLineage
ジョブ一覧infolineage-platform-api, infolineage-platform-worker, infolineage-platform-frontend
Credentialsharbor(Harbor レジストリ ログイン)

Jenkinsfileの位置

infra/jenkins/
├── Jenkinsfile.api
├── Jenkinsfile.worker
└── Jenkinsfile.frontend

各JobのPipeline設定でSCM→ Jenkinsfileのパスを指定します。

podTemplate パターン

すべての Jenkinsfile は Kubernetes podTemplate を使用します。ビルド Pod にコンテナを複数束ねて段階的に実行します。

podTemplate(
label: label,
containers: [
containerTemplate(name: 'java', image: 'eclipse-temurin:25-jre', ...),
containerTemplate(name: 'docker', image: 'docker:20.10', privileged: true, ...),
containerTemplate(name: 'kubectl', image: 'lachlanevenson/k8s-kubectl', ...),
],
volumes: [
hostPathVolume(hostPath: '/var/run/docker.sock', mountPath: '/var/run/docker.sock'),
]
)
コンテナ役割画像
javaGradleビルドeclipse-temurin:25-jre (API), eclipse-temurin:25 (Worker)
dockerイメージビルド & Harborプッシュdocker:20.10
kubectlK8s デプロイlachlanevenson/k8s-kubectl

APIジョブはnodeSelector: jenkins.kubernetes.io/dedicated=trueを追加で指定します。

パイプラインステージ

1ステップ: Git Pull

stage('Git Pull') {
checkout scm
}

ステップ2: 変更されたパスを確認する

git diff HEAD~1 HEAD変更されたファイルの一覧を確認します。

SKIP_BUILD 条件

JobSKIP_BUILD=true (スキップ)
APIbackend/infolineage-apiおよびbackend/infolineage-common変更なし
Workerbackend/infolineage-workerおよびbackend/infolineage-common変更なし
Frontendfrontend/変更なし

SKIP_BUILD=trueGradleビルドとDockerビルドをスキップします。K8s デプロイは常に実行されますなります。

ステップ3: Gradleビルド (API / Worker)

./gradlew :infolineage-api:bootJar \
-x test \
--build-cache \
-Dorg.gradle.jvmargs="--enable-preview -Xmx1g"

--build-cacheオプションとしてキャッシュを活用してインクリメンタルビルドを実行します。FrontendはDockerマルチステージビルドで処理されるため、別途Gradleステップはありません。

4段階: Docker Build & Push

docker login scr.softcamp.co.kr -u $HARBOR_USR --password-stdin

# API / Worker
docker build -f backend/<module>/Dockerfile -t <IMAGE> backend/
# Frontend
docker build -f frontend/Dockerfile \
--build-arg VITE_USE_MOCKS=false \
--build-arg VITE_API_BASE_URL=/platform/api \
--build-arg VITE_AUTH_DISABLED=false \
--build-arg VITE_SHIELD_ID_BASE_URL=https://devlogin.softcamp.co.kr \
--build-arg VITE_CLIENT_NAME=InfoLineage \
-t <IMAGE> frontend/

docker push <IMAGE>
docker rmi <IMAGE> || true

画像タグは常に:latestを使用します。

5ステップ: K8s デプロイ

# API / Worker
kubectl apply -f infra/k8s/dev/configmap.yaml -n dev
kubectl apply -f infra/k8s/dev/secret.yaml -n dev
kubectl apply -f infra/k8s/dev/<module>-service.yaml -n dev
kubectl apply -f infra/k8s/dev/<module>-deployment.yaml -n dev
kubectl rollout restart deployment/infolineage-platform-<module> -n dev
kubectl rollout status deployment/infolineage-platform-<module> -n dev --timeout=120s

特定のブランチ選択ビルド

Jenkinsジョブ設定 →Branch Specifier特定のブランチを対象にビルドするように修正します。

*/develop          # 기본값
*/feature/api-* # feature 브랜치 패턴

手動ビルド時Build with Parameters→ ブランチ入力で希望のブランチを指定できます。

トラブルシューティング

containerCapを超えてPodの作成に失敗しました

Jenkins Kubernetes プラグインの設定でcontainerCap値が低いとPodの作成に失敗します。

# 증상
ERROR: Error allocating a new node ... containerCap exceeded

解決: Jenkins 管理 → Clouds → Kubernetes → Container Cap 値の引き上げ (基本 10 → 50 以上)。

以前のビルドのPodがPending/Runningのままになっている場合

# 정리
kubectl get pods -n jenkins | grep infolineage
kubectl delete pod <stuck-pod-name> -n jenkins

git diff HEAD~1 HEAD失敗 (最初のコミット)

最初のコミットまたはシャロークローンの場合HEAD~1を参照できないため、SKIP_BUILDの判断が失敗します。Jenkinsfileは|| git diff --name-only HEADフォールバックします。