Jenkins Dev パイプライン
developブランチをプッシュすると、Jenkinsが自動的にビルドし、K8sdevnamespaceにデプロイします。
Jenkinsへの接続
| 項目 | 値 |
|---|---|
| URL | 社内Jenkinsサーバー (VPN必要) |
| ビュー | InfoLineage |
| ジョブ一覧 | infolineage-platform-api, infolineage-platform-worker, infolineage-platform-frontend |
| Credentials | harbor(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'),
]
)
| コンテナ | 役割 | 画像 |
|---|---|---|
java | Gradleビルド | eclipse-temurin:25-jre (API), eclipse-temurin:25 (Worker) |
docker | イメージビルド & Harborプッシュ | docker:20.10 |
kubectl | K8s デプロイ | 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 条件
| Job | SKIP_BUILD=true (スキップ) |
|---|---|
| API | backend/infolineage-apiおよびbackend/infolineage-common変更なし |
| Worker | backend/infolineage-workerおよびbackend/infolineage-common変更なし |
| Frontend | frontend/変更なし |
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フォールバックします。