From 261404dd72337a208fd29f0e64fc30dc805ebdc0 Mon Sep 17 00:00:00 2001 From: John Hanzu Kim Date: Thu, 19 Jun 2025 14:59:27 +0900 Subject: [PATCH 1/4] Update Jenkinsfile --- smarketing-java/deployment/Jenkinsfile | 48 ++++++++++++-------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/smarketing-java/deployment/Jenkinsfile b/smarketing-java/deployment/Jenkinsfile index f0b3ad3..e22b768 100644 --- a/smarketing-java/deployment/Jenkinsfile +++ b/smarketing-java/deployment/Jenkinsfile @@ -194,11 +194,11 @@ podTemplate( git add . git commit -m "Update SMarketing services to ${imageTag} - Services updated: - ${services.collect { "- ${it}: ${props.registry}/${props.image_org}/${it}:${imageTag}" }.join('\n')} - - Build: ${env.BUILD_NUMBER} - Commit: ${env.GIT_COMMIT}" +Services updated: +${services.collect { "- ${it}: ${props.registry}/${props.image_org}/${it}:${imageTag}" }.join('\n')} + +Build: ${env.BUILD_NUMBER} +Commit: ${env.GIT_COMMIT}" git push origin main echo "โœ… Successfully updated manifest repository" @@ -212,23 +212,21 @@ podTemplate( } stage('Trigger ArgoCD Sync') { - steps { - script { - echo """ - ๐ŸŽฏ CI Pipeline ์™„๋ฃŒ! - - ๐Ÿ“ฆ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋“ค: - ${services.collect { "- ${props.registry}/${props.image_org}/${it}:${imageTag}" }.join('\n')} - - ๐Ÿ”„ ArgoCD ๋™์ž‘: - - ArgoCD๊ฐ€ manifest repository ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค - - ๊ฐ ์„œ๋น„์Šค๋ณ„ Application์ด ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค - - ArgoCD UI์—์„œ ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์„ธ์š” - - ๐ŸŒ ArgoCD UI: [ArgoCD ์ ‘์† URL] - ๐Ÿ“ Manifest Repo: ${MANIFEST_REPO} - """ - } + script { + echo """ +๐ŸŽฏ CI Pipeline ์™„๋ฃŒ! + +๐Ÿ“ฆ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋“ค: +${services.collect { "- ${props.registry}/${props.image_org}/${it}:${imageTag}" }.join('\n')} + +๐Ÿ”„ ArgoCD ๋™์ž‘: +- ArgoCD๊ฐ€ manifest repository ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค +- ๊ฐ ์„œ๋น„์Šค๋ณ„ Application์ด ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค +- ArgoCD UI์—์„œ ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์„ธ์š” + +๐ŸŒ ArgoCD UI: [ArgoCD ์ ‘์† URL] +๐Ÿ“ Manifest Repo: ${MANIFEST_REPO} + """ } } } @@ -242,9 +240,9 @@ podTemplate( } success { echo """ - โœ… CI Pipeline ์„ฑ๊ณต! - ๐Ÿท๏ธ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ํƒœ๊ทธ: ${imageTag} - ๐Ÿ”„ ArgoCD๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค +โœ… CI Pipeline ์„ฑ๊ณต! +๐Ÿท๏ธ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ํƒœ๊ทธ: ${imageTag} +๐Ÿ”„ ArgoCD๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค """ } failure { From ca5b4166e3b17015153866a9aaba6556a86fe959 Mon Sep 17 00:00:00 2001 From: John Hanzu Kim Date: Thu, 19 Jun 2025 15:08:37 +0900 Subject: [PATCH 2/4] Update Jenkinsfile --- smarketing-java/deployment/Jenkinsfile | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/smarketing-java/deployment/Jenkinsfile b/smarketing-java/deployment/Jenkinsfile index e22b768..0b65cc1 100644 --- a/smarketing-java/deployment/Jenkinsfile +++ b/smarketing-java/deployment/Jenkinsfile @@ -193,13 +193,7 @@ podTemplate( if [ -n "\$(git status --porcelain)" ]; then git add . git commit -m "Update SMarketing services to ${imageTag} - -Services updated: -${services.collect { "- ${it}: ${props.registry}/${props.image_org}/${it}:${imageTag}" }.join('\n')} - -Build: ${env.BUILD_NUMBER} -Commit: ${env.GIT_COMMIT}" - + git push origin main echo "โœ… Successfully updated manifest repository" else From 458be8df697c88ee9008356ce34db0aa9435188b Mon Sep 17 00:00:00 2001 From: John Hanzu Kim Date: Thu, 19 Jun 2025 15:17:21 +0900 Subject: [PATCH 3/4] Update Jenkinsfile --- smarketing-java/deployment/Jenkinsfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/smarketing-java/deployment/Jenkinsfile b/smarketing-java/deployment/Jenkinsfile index 0b65cc1..75af95c 100644 --- a/smarketing-java/deployment/Jenkinsfile +++ b/smarketing-java/deployment/Jenkinsfile @@ -192,8 +192,7 @@ podTemplate( # ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์ปค๋ฐ‹ ๋ฐ ํ‘ธ์‹œ if [ -n "\$(git status --porcelain)" ]; then git add . - git commit -m "Update SMarketing services to ${imageTag} - + git commit -m "Update SMarketing services to ${imageTag} - Build ${env.BUILD_NUMBER}" git push origin main echo "โœ… Successfully updated manifest repository" else From f53974812ce47e5ad9ca25c95c790461147d8f1f Mon Sep 17 00:00:00 2001 From: John Hanzu Kim Date: Thu, 19 Jun 2025 15:25:06 +0900 Subject: [PATCH 4/4] Update Jenkinsfile --- smarketing-java/deployment/Jenkinsfile | 327 +++++++++++++------------ 1 file changed, 164 insertions(+), 163 deletions(-) diff --git a/smarketing-java/deployment/Jenkinsfile b/smarketing-java/deployment/Jenkinsfile index 75af95c..821ed02 100644 --- a/smarketing-java/deployment/Jenkinsfile +++ b/smarketing-java/deployment/Jenkinsfile @@ -1,4 +1,4 @@ -// smarketing-backend/smarketing-java/deployment/Jenkinsfile_ArgoCD +// smarketing-backend/smarketing-java/deployment/Jenkinsfile def PIPELINE_ID = "${env.BUILD_NUMBER}" @@ -30,183 +30,184 @@ podTemplate( def MANIFEST_REPO = 'https://github.com/won-ktds/smarketing-manifest.git' def MANIFEST_CREDENTIAL_ID = 'github-credentials-smarketing' - stage("Get Source") { - checkout scm - - // smarketing-java ํ•˜์œ„์— ์žˆ๋Š” ์„ค์ • ํŒŒ์ผ ์ฝ๊ธฐ - props = readProperties file: "smarketing-java/deployment/deploy_env_vars" + try { + stage("Get Source") { + checkout scm + + // smarketing-java ํ•˜์œ„์— ์žˆ๋Š” ์„ค์ • ํŒŒ์ผ ์ฝ๊ธฐ + props = readProperties file: "smarketing-java/deployment/deploy_env_vars" - echo "=== Build Information ===" - echo "Services: ${services}" - echo "Image Tag: ${imageTag}" - echo "Registry: ${props.registry}" - echo "Image Org: ${props.image_org}" - } + echo "=== Build Information ===" + echo "Services: ${services}" + echo "Image Tag: ${imageTag}" + echo "Registry: ${props.registry}" + echo "Image Org: ${props.image_org}" + } - stage("Check Changes") { - script { - def changes = sh( - script: "git diff --name-only HEAD~1 HEAD", - returnStdout: true - ).trim() + stage("Check Changes") { + script { + def changes = sh( + script: "git diff --name-only HEAD~1 HEAD", + returnStdout: true + ).trim() - if (!changes.contains("smarketing-java/")) { - echo "No changes in smarketing-java, skipping build" - currentBuild.result = 'SUCCESS' - error("Stopping pipeline - no changes detected") + if (!changes.contains("smarketing-java/")) { + echo "No changes in smarketing-java, skipping build" + currentBuild.result = 'SUCCESS' + error("Stopping pipeline - no changes detected") + } + + echo "Changes detected in smarketing-java, proceeding with build" } - - echo "Changes detected in smarketing-java, proceeding with build" } - } - stage('Build Applications') { - container('gradle') { - sh """ - echo "=== smarketing-java ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ ===" - cd smarketing-java - - echo "=== gradlew ๊ถŒํ•œ ์„ค์ • ===" - chmod +x gradlew - - echo "=== ์ „์ฒด ์„œ๋น„์Šค ๋นŒ๋“œ ===" - ./gradlew :member:clean :member:build -x test - ./gradlew :store:clean :store:build -x test - ./gradlew :marketing-content:clean :marketing-content:build -x test - ./gradlew :ai-recommend:clean :ai-recommend:build -x test - - echo "=== ๋นŒ๋“œ ๊ฒฐ๊ณผ ํ™•์ธ ===" - find . -name "*.jar" -path "*/build/libs/*" | grep -v 'plain.jar' - """ - } - } - - stage('Build & Push Images') { - container('docker') { - sh """ - echo "=== Docker ๋ฐ๋ชฌ ์‹œ์ž‘ ๋Œ€๊ธฐ ===" - timeout 30 sh -c 'until docker info; do sleep 1; done' - """ - - // ACR Credential์„ Jenkins์—์„œ ์ง์ ‘ ์‚ฌ์šฉ - withCredentials([usernamePassword( - credentialsId: 'acr-credentials', - usernameVariable: 'ACR_USERNAME', - passwordVariable: 'ACR_PASSWORD' - )]) { + stage('Build Applications') { + container('gradle') { sh """ - echo "=== Docker๋กœ ACR ๋กœ๊ทธ์ธ ===" - echo "\$ACR_PASSWORD" | docker login ${props.registry} --username \$ACR_USERNAME --password-stdin + echo "=== smarketing-java ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ ===" + cd smarketing-java + + echo "=== gradlew ๊ถŒํ•œ ์„ค์ • ===" + chmod +x gradlew + + echo "=== ์ „์ฒด ์„œ๋น„์Šค ๋นŒ๋“œ ===" + ./gradlew :member:clean :member:build -x test + ./gradlew :store:clean :store:build -x test + ./gradlew :marketing-content:clean :marketing-content:build -x test + ./gradlew :ai-recommend:clean :ai-recommend:build -x test + + echo "=== ๋นŒ๋“œ ๊ฒฐ๊ณผ ํ™•์ธ ===" + find . -name "*.jar" -path "*/build/libs/*" | grep -v 'plain.jar' + """ + } + } + + stage('Build & Push Images') { + container('docker') { + sh """ + echo "=== Docker ๋ฐ๋ชฌ ์‹œ์ž‘ ๋Œ€๊ธฐ ===" + timeout 30 sh -c 'until docker info; do sleep 1; done' """ - services.each { service -> - script { - def buildDir = "smarketing-java/${service}" - def fullImageName = "${props.registry}/${props.image_org}/${service}:${imageTag}" + // ACR Credential์„ Jenkins์—์„œ ์ง์ ‘ ์‚ฌ์šฉ + withCredentials([usernamePassword( + credentialsId: 'acr-credentials', + usernameVariable: 'ACR_USERNAME', + passwordVariable: 'ACR_PASSWORD' + )]) { + sh """ + echo "=== Docker๋กœ ACR ๋กœ๊ทธ์ธ ===" + echo "\$ACR_PASSWORD" | docker login ${props.registry} --username \$ACR_USERNAME --password-stdin + """ - echo "Building image for ${service}: ${fullImageName}" - - // ์‹ค์ œ JAR ํŒŒ์ผ๋ช… ๋™์  ํƒ์ง€ - def actualJarFile = sh( - script: """ - cd ${buildDir}/build/libs - ls *.jar | grep -v 'plain.jar' | head -1 - """, - returnStdout: true - ).trim() - - if (!actualJarFile) { - error "${service} JAR ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" - } - - echo "๋ฐœ๊ฒฌ๋œ JAR ํŒŒ์ผ: ${actualJarFile}" + services.each { service -> + script { + def buildDir = "smarketing-java/${service}" + def fullImageName = "${props.registry}/${props.image_org}/${service}:${imageTag}" - sh """ - echo "=== ${service} ์ด๋ฏธ์ง€ ๋นŒ๋“œ ===" - docker build \\ - --build-arg BUILD_LIB_DIR="${buildDir}/build/libs" \\ - --build-arg ARTIFACTORY_FILE="${actualJarFile}" \\ - -f smarketing-java/deployment/container/Dockerfile \\ - -t ${fullImageName} . - - echo "=== ${service} ์ด๋ฏธ์ง€ ํ‘ธ์‹œ ===" - docker push ${fullImageName} + echo "Building image for ${service}: ${fullImageName}" - echo "Successfully built and pushed: ${fullImageName}" - """ + // ์‹ค์ œ JAR ํŒŒ์ผ๋ช… ๋™์  ํƒ์ง€ + def actualJarFile = sh( + script: """ + cd ${buildDir}/build/libs + ls *.jar | grep -v 'plain.jar' | head -1 + """, + returnStdout: true + ).trim() + + if (!actualJarFile) { + error "${service} JAR ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค" + } + + echo "๋ฐœ๊ฒฌ๋œ JAR ํŒŒ์ผ: ${actualJarFile}" + + sh """ + echo "=== ${service} ์ด๋ฏธ์ง€ ๋นŒ๋“œ ===" + docker build \\ + --build-arg BUILD_LIB_DIR="${buildDir}/build/libs" \\ + --build-arg ARTIFACTORY_FILE="${actualJarFile}" \\ + -f smarketing-java/deployment/container/Dockerfile \\ + -t ${fullImageName} . + + echo "=== ${service} ์ด๋ฏธ์ง€ ํ‘ธ์‹œ ===" + docker push ${fullImageName} + + echo "Successfully built and pushed: ${fullImageName}" + """ + } } } } } - } - stage('Update Manifest Repository') { - container('git') { - script { - // Manifest Repository Clone - withCredentials([usernamePassword( - credentialsId: MANIFEST_CREDENTIAL_ID, - usernameVariable: 'GIT_USERNAME', - passwordVariable: 'GIT_PASSWORD' - )]) { - sh """ - echo "=== Git ์„ค์ • ===" - git config --global user.name "Jenkins CI" - git config --global user.email "jenkins@company.com" + stage('Update Manifest Repository') { + container('git') { + script { + // Manifest Repository Clone + withCredentials([usernamePassword( + credentialsId: MANIFEST_CREDENTIAL_ID, + usernameVariable: 'GIT_USERNAME', + passwordVariable: 'GIT_PASSWORD' + )]) { + sh """ + echo "=== Git ์„ค์ • ===" + git config --global user.name "Jenkins CI" + git config --global user.email "jenkins@company.com" + + echo "=== Manifest Repository Clone ===" + rm -rf manifest-repo + git clone https://\$GIT_USERNAME:\$GIT_PASSWORD@github.com/won-ktds/smarketing-manifest.git manifest-repo + cd manifest-repo + """ - echo "=== Manifest Repository Clone ===" - rm -rf manifest-repo - git clone https://\$GIT_USERNAME:\$GIT_PASSWORD@github.com/won-ktds/smarketing-manifest.git manifest-repo - cd manifest-repo - """ - - services.each { service -> - def fullImageName = "${props.registry}/${props.image_org}/${service}:${imageTag}" - def deploymentFile = "smarketing/deployments/${service}/${service}-deployment.yaml" + services.each { service -> + def fullImageName = "${props.registry}/${props.image_org}/${service}:${imageTag}" + def deploymentFile = "smarketing/deployments/${service}/${service}-deployment.yaml" + + sh """ + cd manifest-repo + + echo "=== ${service} ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ ===" + if [ -f "${deploymentFile}" ]; then + # ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ (sed ์‚ฌ์šฉ) + sed -i 's|image: ${props.registry}/${props.image_org}/${service}:.*|image: ${fullImageName}|g' "${deploymentFile}" + echo "Updated ${deploymentFile} with new image: ${fullImageName}" + + # ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ + echo "=== ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ ํ™•์ธ ===" + grep "image: ${props.registry}/${props.image_org}/${service}" "${deploymentFile}" || echo "์ด๋ฏธ์ง€ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ ํ™•์ธ ์‹คํŒจ" + else + echo "Warning: ${deploymentFile} not found" + fi + """ + } sh """ cd manifest-repo - echo "=== ${service} ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ ===" - if [ -f "${deploymentFile}" ]; then - # ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ (sed ์‚ฌ์šฉ) - sed -i 's|image: ${props.registry}/${props.image_org}/${service}:.*|image: ${fullImageName}|g' "${deploymentFile}" - echo "Updated ${deploymentFile} with new image: ${fullImageName}" - - # ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ - echo "=== ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ ํ™•์ธ ===" - grep "image: ${props.registry}/${props.image_org}/${service}" "${deploymentFile}" || echo "์ด๋ฏธ์ง€ ํƒœ๊ทธ ์—…๋ฐ์ดํŠธ ํ™•์ธ ์‹คํŒจ" + echo "=== Git ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ ===" + git status + git diff + + # ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์ปค๋ฐ‹ ๋ฐ ํ‘ธ์‹œ + if [ -n "\$(git status --porcelain)" ]; then + git add . + git commit -m "Update SMarketing services to ${imageTag} - Build ${env.BUILD_NUMBER}" + git push origin main + echo "โœ… Successfully updated manifest repository" else - echo "Warning: ${deploymentFile} not found" + echo "โ„น๏ธ No changes to commit" fi """ } - - sh """ - cd manifest-repo - - echo "=== Git ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ ===" - git status - git diff - - # ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์ปค๋ฐ‹ ๋ฐ ํ‘ธ์‹œ - if [ -n "\$(git status --porcelain)" ]; then - git add . - git commit -m "Update SMarketing services to ${imageTag} - Build ${env.BUILD_NUMBER}" - git push origin main - echo "โœ… Successfully updated manifest repository" - else - echo "โ„น๏ธ No changes to commit" - fi - """ } } } - } - stage('Trigger ArgoCD Sync') { - script { - echo """ + stage('Trigger ArgoCD Sync') { + script { + echo """ ๐ŸŽฏ CI Pipeline ์™„๋ฃŒ! ๐Ÿ“ฆ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋“ค: @@ -219,27 +220,27 @@ ${services.collect { "- ${props.registry}/${props.image_org}/${it}:${imageTag}" ๐ŸŒ ArgoCD UI: [ArgoCD ์ ‘์† URL] ๐Ÿ“ Manifest Repo: ${MANIFEST_REPO} - """ + """ + } } - } - } - - post { - always { - container('docker') { - sh 'docker system prune -f || true' - } - sh 'rm -rf manifest-repo || true' - } - success { + + // ์„ฑ๊ณต ์‹œ ์ฒ˜๋ฆฌ echo """ โœ… CI Pipeline ์„ฑ๊ณต! ๐Ÿท๏ธ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ํƒœ๊ทธ: ${imageTag} ๐Ÿ”„ ArgoCD๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค """ - } - failure { - echo "โŒ CI Pipeline ์‹คํŒจ!" + + } catch (Exception e) { + // ์‹คํŒจ ์‹œ ์ฒ˜๋ฆฌ + echo "โŒ CI Pipeline ์‹คํŒจ: ${e.getMessage()}" + throw e + } finally { + // ์ •๋ฆฌ ์ž‘์—… (ํ•ญ์ƒ ์‹คํ–‰) + container('docker') { + sh 'docker system prune -f || true' + } + sh 'rm -rf manifest-repo || true' } } }