diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..7f4e4fd
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,234 @@
+pipeline {
+ agent any
+
+ parameters {
+ choice(
+ name: 'ENVIRONMENT',
+ choices: ['dev', 'staging', 'prod'],
+ description: 'Target environment'
+ )
+ choice(
+ name: 'SKIP_SONARQUBE',
+ choices: ['true', 'false'],
+ description: 'Skip SonarQube Analysis'
+ )
+ }
+
+ environment {
+ // Container Registry
+ REGISTRY = 'acrdigitalgarage02.azurecr.io'
+ IMAGE_ORG = 'hgzero'
+
+ // Azure
+ RESOURCE_GROUP = 'rg-digitalgarage-02'
+ AKS_CLUSTER = 'aks-digitalgarage-02'
+ NAMESPACE = 'hgzero'
+
+ // Image Tag
+ IMAGE_TAG = "${new Date().format('yyyyMMddHHmmss')}"
+
+ // Services
+ SERVICES = 'user meeting stt ai notification'
+
+ // Credentials
+ ACR_CREDENTIALS = credentials('acr-credentials')
+ DOCKERHUB_CREDENTIALS = credentials('dockerhub-credentials')
+ SONAR_TOKEN = credentials('sonar-token')
+ GIT_CREDENTIALS = credentials('git-credentials')
+ }
+
+ stages {
+ stage('Checkout') {
+ steps {
+ script {
+ echo "๐ Checking out code..."
+ checkout scm
+ }
+ }
+ }
+
+ stage('Setup Java') {
+ steps {
+ script {
+ echo "โ Setting up Java 21..."
+ // Jenkins์ JDK 21์ด ์ค์ ๋์ด ์์ด์ผ ํจ
+ // Global Tool Configuration์์ 'JDK21' ์ด๋ฆ์ผ๋ก ์ค์
+ }
+ }
+ }
+
+ stage('Load Environment Variables') {
+ steps {
+ script {
+ echo "๐ Loading environment variables for ${params.ENVIRONMENT}..."
+
+ def configFile = ".github/config/deploy_env_vars_${params.ENVIRONMENT}"
+ if (fileExists(configFile)) {
+ def config = readFile(configFile)
+ config.split('\n').each { line ->
+ if (line && !line.startsWith('#')) {
+ def parts = line.split('=', 2)
+ if (parts.size() == 2) {
+ def key = parts[0].trim()
+ def value = parts[1].trim()
+
+ if (key == 'resource_group') {
+ env.RESOURCE_GROUP = value
+ } else if (key == 'cluster_name') {
+ env.AKS_CLUSTER = value
+ }
+ }
+ }
+ }
+ }
+
+ echo "Registry: ${env.REGISTRY}"
+ echo "Image Org: ${env.IMAGE_ORG}"
+ echo "Resource Group: ${env.RESOURCE_GROUP}"
+ echo "AKS Cluster: ${env.AKS_CLUSTER}"
+ }
+ }
+ }
+
+ stage('Build with Gradle') {
+ steps {
+ script {
+ echo "๐จ Building with Gradle..."
+ sh 'chmod +x gradlew'
+ sh './gradlew build -x test'
+ }
+ }
+ }
+
+ stage('SonarQube Analysis') {
+ when {
+ expression { params.SKIP_SONARQUBE == 'false' }
+ }
+ steps {
+ script {
+ echo "๐ Running SonarQube Analysis..."
+
+ withSonarQubeEnv('SonarQube') {
+ env.SERVICES.split().each { service ->
+ echo "Analyzing ${service}..."
+ sh """
+ ./gradlew :${service}:test :${service}:jacocoTestReport :${service}:sonar \
+ -Dsonar.projectKey=hgzero-${service}-${params.ENVIRONMENT} \
+ -Dsonar.projectName=hgzero-${service}-${params.ENVIRONMENT} \
+ -Dsonar.host.url=\${SONAR_HOST_URL} \
+ -Dsonar.token=\${SONAR_TOKEN} \
+ -Dsonar.java.binaries=build/classes/java/main \
+ -Dsonar.coverage.jacoco.xmlReportPaths=build/reports/jacoco/test/jacocoTestReport.xml \
+ -Dsonar.exclusions=**/config/**,**/entity/**,**/dto/**,**/*Application.class,**/exception/**
+ """
+ }
+ }
+ }
+ }
+ }
+
+ stage('Archive Artifacts') {
+ steps {
+ script {
+ echo "๐ฆ Archiving build artifacts..."
+ archiveArtifacts artifacts: '**/build/libs/*.jar', fingerprint: true
+ }
+ }
+ }
+
+ stage('Docker Build & Push') {
+ steps {
+ script {
+ echo "๐ณ Building and pushing Docker images..."
+
+ // Login to Docker Hub (prevent rate limit)
+ sh """
+ echo ${DOCKERHUB_CREDENTIALS_PSW} | docker login -u ${DOCKERHUB_CREDENTIALS_USR} --password-stdin
+ """
+
+ // Login to Azure Container Registry
+ sh """
+ echo ${ACR_CREDENTIALS_PSW} | docker login ${REGISTRY} -u ${ACR_CREDENTIALS_USR} --password-stdin
+ """
+
+ // Build and push each service
+ env.SERVICES.split().each { service ->
+ echo "Building ${service}..."
+
+ def imageTag = "${env.REGISTRY}/${env.IMAGE_ORG}/${service}:${params.ENVIRONMENT}-${env.IMAGE_TAG}"
+
+ sh """
+ docker build \
+ --build-arg BUILD_LIB_DIR="${service}/build/libs" \
+ --build-arg ARTIFACTORY_FILE="${service}.jar" \
+ -f deployment/container/Dockerfile-backend \
+ -t ${imageTag} .
+ """
+
+ echo "Pushing ${service}..."
+ sh "docker push ${imageTag}"
+
+ echo "โ
${service} image pushed: ${imageTag}"
+ }
+ }
+ }
+ }
+
+ stage('Update Manifest Repository') {
+ steps {
+ script {
+ echo "๐ Updating manifest repository..."
+
+ // Clone manifest repository
+ sh """
+ rm -rf manifest-repo
+ git clone https://${GIT_CREDENTIALS_USR}:${GIT_CREDENTIALS_PSW}@github.com/hjmoons/hgzero-manifest.git manifest-repo
+ """
+
+ dir('manifest-repo') {
+ // Install Kustomize
+ sh """
+ curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
+ chmod +x kustomize
+ """
+
+ // Update manifest
+ dir("hgzero-back/kustomize/overlays/${params.ENVIRONMENT}") {
+ env.SERVICES.split().each { service ->
+ sh """
+ ../../../kustomize edit set image ${env.REGISTRY}/${env.IMAGE_ORG}/${service}:${params.ENVIRONMENT}-${env.IMAGE_TAG}
+ """
+ }
+ }
+
+ // Git commit and push
+ sh """
+ git config user.name "Jenkins"
+ git config user.email "jenkins@hgzero.com"
+ git add .
+ git commit -m "๐ Update hgzero ${params.ENVIRONMENT} images to ${params.ENVIRONMENT}-${env.IMAGE_TAG}"
+ git push origin main
+ """
+ }
+
+ echo "โ
Manifest repository updated. ArgoCD will auto-deploy."
+ }
+ }
+ }
+ }
+
+ post {
+ success {
+ echo "โ
Pipeline completed successfully!"
+ echo "Environment: ${params.ENVIRONMENT}"
+ echo "Image Tag: ${env.IMAGE_TAG}"
+ }
+ failure {
+ echo "โ Pipeline failed!"
+ }
+ always {
+ // Clean workspace
+ cleanWs()
+ }
+ }
+}
diff --git a/ai-java-back/.run/ai-service.run.xml b/ai-java-back/.run/ai-service.run.xml
deleted file mode 100644
index 854373b..0000000
--- a/ai-java-back/.run/ai-service.run.xml
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
- false
- false
-
-
-
\ No newline at end of file
diff --git a/deployment/jenkins/JENKINS_SETUP.md b/deployment/jenkins/JENKINS_SETUP.md
new file mode 100644
index 0000000..da375fc
--- /dev/null
+++ b/deployment/jenkins/JENKINS_SETUP.md
@@ -0,0 +1,256 @@
+# Jenkins Pipeline ์ค์ ๊ฐ์ด๋
+
+## ๊ฐ์
+GitHub Actions๊ฐ ๋งํ ์์ ๋ Jenkins๋ฅผ ์ฌ์ฉํ์ฌ HGZero ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ๊ฐ์ด๋์
๋๋ค.
+
+## ์ ์ ์กฐ๊ฑด
+
+### 1. Jenkins ์๋ฒ ์๊ตฌ์ฌํญ
+- Jenkins 2.x ์ด์
+- Docker๊ฐ ์ค์น๋์ด ์์ด์ผ ํจ
+- Kustomize CLI ๋ค์ด๋ก๋ ๊ฐ๋ฅํ ํ๊ฒฝ
+- ์ธํฐ๋ท ์ฐ๊ฒฐ (Docker Hub, Azure Container Registry, GitHub ์ ๊ทผ)
+
+### 2. ํ์ Jenkins ํ๋ฌ๊ทธ์ธ
+๋ค์ ํ๋ฌ๊ทธ์ธ๋ค์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค:
+- Pipeline (๊ธฐ๋ณธ ํฌํจ)
+- Git Plugin
+- Docker Pipeline Plugin
+- SonarQube Scanner Plugin (์ ํ์ฌํญ)
+- Credentials Plugin (๊ธฐ๋ณธ ํฌํจ)
+
+## Jenkins ์ค์ ๋จ๊ณ
+
+### 1๋จ๊ณ: Credentials ์ค์
+
+Jenkins ๊ด๋ฆฌ โ Manage Credentials โ Global credentials์์ ๋ค์ credential๋ค์ ์ถ๊ฐํฉ๋๋ค:
+
+#### 1.1 ACR Credentials
+- **ID**: `acr-credentials`
+- **Type**: Username with password
+- **Username**: Azure Container Registry ์ฌ์ฉ์๋ช
+- **Password**: Azure Container Registry ๋น๋ฐ๋ฒํธ
+- **Description**: Azure Container Registry Credentials
+
+#### 1.2 Docker Hub Credentials
+- **ID**: `dockerhub-credentials`
+- **Type**: Username with password
+- **Username**: Docker Hub ์ฌ์ฉ์๋ช
+- **Password**: Docker Hub ๋น๋ฐ๋ฒํธ ๋๋ Access Token
+- **Description**: Docker Hub Credentials (rate limit ๋ฐฉ์ง์ฉ)
+
+#### 1.3 SonarQube Token (์ ํ์ฌํญ)
+- **ID**: `sonar-token`
+- **Type**: Secret text
+- **Secret**: SonarQube authentication token
+- **Description**: SonarQube Token
+
+#### 1.4 Git Credentials
+- **ID**: `git-credentials`
+- **Type**: Username with password
+- **Username**: GitHub ์ฌ์ฉ์๋ช
+- **Password**: GitHub Personal Access Token (repo ๊ถํ ํ์)
+- **Description**: GitHub Credentials for Manifest Repository
+
+> **์ค์**: GitHub Personal Access Token ์์ฑ ์ ๋ค์ ๊ถํ์ด ํ์ํฉ๋๋ค:
+> - `repo` (Full control of private repositories)
+
+### 2๋จ๊ณ: JDK 21 ์ค์
+
+Jenkins ๊ด๋ฆฌ โ Global Tool Configuration โ JDK์์:
+1. "Add JDK" ํด๋ฆญ
+2. **Name**: `JDK21`
+3. "Install automatically" ์ฒดํฌ
+4. Install from adoptium.net ์ ํ
+5. Version: jdk-21.x.x ์ ํ
+
+> **์ฐธ๊ณ **: ๋๋ Jenkins ์๋ฒ์ JDK 21์ด ์ด๋ฏธ ์ค์น๋์ด ์๋ค๋ฉด, ์ค์น ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
+
+### 3๋จ๊ณ: SonarQube ์๋ฒ ์ค์ (์ ํ์ฌํญ)
+
+SonarQube ๋ถ์์ ์ฌ์ฉํ๋ ค๋ฉด:
+
+Jenkins ๊ด๋ฆฌ โ Configure System โ SonarQube servers์์:
+1. "Add SonarQube" ํด๋ฆญ
+2. **Name**: `SonarQube`
+3. **Server URL**: SonarQube ์๋ฒ URL
+4. **Server authentication token**: ์์ ์์ฑํ `sonar-token` credential ์ ํ
+
+### 4๋จ๊ณ: Pipeline Job ์์ฑ
+
+1. Jenkins ๋ฉ์ธ ํ๋ฉด์์ "New Item" ํด๋ฆญ
+2. Job ์ด๋ฆ ์
๋ ฅ (์: `hgzero-backend-pipeline`)
+3. "Pipeline" ์ ํ
+4. "OK" ํด๋ฆญ
+
+Pipeline ์ค์ :
+1. **General**
+ - "This project is parameterized" ์ฒดํฌ (์๋์ผ๋ก Jenkinsfile์ parameters๊ฐ ์ธ์๋จ)
+
+2. **Pipeline**
+ - **Definition**: Pipeline script from SCM
+ - **SCM**: Git
+ - **Repository URL**: `https://github.com/hjmoons/HGZero.git` (๋๋ ์ค์ ์ ์ฅ์ URL)
+ - **Credentials**: ํ์์ Git credentials ์ ํ
+ - **Branch Specifier**: `*/main` (๋๋ ์ํ๋ ๋ธ๋์น)
+ - **Script Path**: `Jenkinsfile`
+
+3. "Save" ํด๋ฆญ
+
+## Pipeline ์คํ
+
+### ์๋ ์คํ
+1. ์์ฑํ Pipeline Job ์ ํ
+2. "Build with Parameters" ํด๋ฆญ
+3. ํ๋ผ๋ฏธํฐ ์ ํ:
+ - **ENVIRONMENT**: `dev`, `staging`, ๋๋ `prod` ์ ํ
+ - **SKIP_SONARQUBE**: `true` (๊ฑด๋๋ฐ๊ธฐ) ๋๋ `false` (์คํ)
+4. "Build" ํด๋ฆญ
+
+### Pipeline ๋์ ํ๋ฆ
+
+```
+1. Checkout
+ โโ> Git ์ ์ฅ์์์ ์ฝ๋ ์ฒดํฌ์์
+
+2. Setup Java
+ โโ> JDK 21 ํ๊ฒฝ ์ค์
+
+3. Load Environment Variables
+ โโ> .github/config/deploy_env_vars_{ํ๊ฒฝ} ํ์ผ์์ ํ๊ฒฝ๋ณ์ ๋ก๋
+
+4. Build with Gradle
+ โโ> ./gradlew build -x test ์คํ (JAR ํ์ผ ์์ฑ)
+
+5. SonarQube Analysis (์ ํ์ฌํญ)
+ โโ> ๊ฐ ์๋น์ค๋ณ ํ
์คํธ ๋ฐ ์ฝ๋ ํ์ง ๋ถ์
+
+6. Archive Artifacts
+ โโ> ์์ฑ๋ JAR ํ์ผ์ Jenkins์ ๋ณด๊ด
+
+7. Docker Build & Push
+ โโ> ๊ฐ ์๋น์ค๋ณ Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ACR์ ํธ์
+
+8. Update Manifest Repository
+ โโ> hgzero-manifest ์ ์ฅ์์ Kustomize ํ์ผ ์
๋ฐ์ดํธ
+ โโ> ArgoCD๊ฐ ์๋์ผ๋ก ๋ฐฐํฌ ๊ฐ์ง
+```
+
+## ๋น๋ ๊ฒฐ๊ณผ ํ์ธ
+
+### ์ฑ๊ณต ์
+- Console Output์ "โ
Pipeline completed successfully!" ๋ฉ์์ง ํ์
+- Environment์ Image Tag ์ ๋ณด ์ถ๋ ฅ
+- Manifest ์ ์ฅ์๊ฐ ์
๋ฐ์ดํธ๋จ
+- ArgoCD๊ฐ ์๋์ผ๋ก ์ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌ
+
+### ์คํจ ์
+- Console Output์ "โ Pipeline failed!" ๋ฉ์์ง ํ์
+- ์คํจํ Stage์ ์๋ฌ ๋ฉ์์ง ํ์ธ
+- Workspace๊ฐ ์๋์ผ๋ก ์ ๋ฆฌ๋จ
+
+## ํ๊ฒฝ๋ณ ์ค์
+
+### Dev ํ๊ฒฝ
+```bash
+ENVIRONMENT: dev
+```
+- ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐฐํฌ
+- ๋น ๋ฅธ ๋ฐ๋ณต ๊ฐ๋ฐ์ฉ
+
+### Staging ํ๊ฒฝ
+```bash
+ENVIRONMENT: staging
+```
+- ์คํ
์ด์ง ํ๊ฒฝ์ ๋ฐฐํฌ
+- ํ๋ก๋์
๋ฐฐํฌ ์ ์ต์ข
๊ฒ์ฆ
+
+### Production ํ๊ฒฝ
+```bash
+ENVIRONMENT: prod
+```
+- ํ๋ก๋์
ํ๊ฒฝ์ ๋ฐฐํฌ
+- **์ฃผ์**: ํ๋ก๋์
๋ฐฐํฌ๋ ์ ์คํ๊ฒ ์งํ
+
+## ํธ๋ฌ๋ธ์ํ
+
+### ๋ฌธ์ 1: Gradle ๋น๋ ์คํจ
+**์ฆ์**: `./gradlew build` ์คํจ
+
+**ํด๊ฒฐ๋ฐฉ๋ฒ**:
+- Console Output์์ ์๋ฌ ๋ก๊ทธ ํ์ธ
+- Java ๋ฒ์ ์ด 21์ธ์ง ํ์ธ
+- Gradle wrapper ๊ถํ ํ์ธ: `chmod +x gradlew`
+
+### ๋ฌธ์ 2: Docker ๋ก๊ทธ์ธ ์คํจ
+**์ฆ์**: Docker login ์คํจ
+
+**ํด๊ฒฐ๋ฐฉ๋ฒ**:
+- Jenkins Credentials์ ACR credentials๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์๋์ง ํ์ธ
+- Azure Container Registry URL์ด `acrdigitalgarage02.azurecr.io`์ธ์ง ํ์ธ
+- Credential ID๊ฐ ์ ํํ `acr-credentials`์ธ์ง ํ์ธ
+
+### ๋ฌธ์ 3: Git clone ์คํจ (Manifest Repository)
+**์ฆ์**: hgzero-manifest ์ ์ฅ์ clone ์คํจ
+
+**ํด๊ฒฐ๋ฐฉ๋ฒ**:
+- GitHub Personal Access Token์ด ์ ํจํ์ง ํ์ธ
+- Token์ `repo` ๊ถํ์ด ์๋์ง ํ์ธ
+- Credential ID๊ฐ ์ ํํ `git-credentials`์ธ์ง ํ์ธ
+
+### ๋ฌธ์ 4: Kustomize ์ค์น ์คํจ
+**์ฆ์**: Kustomize ๋ค์ด๋ก๋ ์คํจ
+
+**ํด๊ฒฐ๋ฐฉ๋ฒ**:
+- Jenkins ์๋ฒ์์ ์ธํฐ๋ท ์ฐ๊ฒฐ ํ์ธ
+- curl ๋ช
๋ น์ด๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ํ์ธ
+- ํ์์ Kustomize๋ฅผ ๋ฏธ๋ฆฌ ์ค์นํ๊ณ PATH์ ์ถ๊ฐ
+
+## ๋ณด์ ๊ณ ๋ ค์ฌํญ
+
+1. **Credentials ๊ด๋ฆฌ**
+ - ๋ชจ๋ ๋น๋ฐ๋ฒํธ์ ํ ํฐ์ Jenkins Credentials๋ก ๊ด๋ฆฌ
+ - Pipeline ์ฝ๋์ ์ ๋ ํ๋์ฝ๋ฉํ์ง ์์
+
+2. **Git Credentials**
+ - Personal Access Token ์ฌ์ฉ (๋น๋ฐ๋ฒํธ ์ฌ์ฉ ๊ธ์ง)
+ - ์ต์ ๊ถํ ์์น ์ ์ฉ
+
+3. **Docker Registry**
+ - ACR ์ ๊ทผ์ Service Principal ๋๋ ๊ด๋ฆฌ๋๋ ์๊ฒฉ ์ฆ๋ช
์ฌ์ฉ ๊ถ์ฅ
+
+## ์ถ๊ฐ ์ฐธ๊ณ ์ฌํญ
+
+### Webhook ์ค์ (์ ํ์ฌํญ)
+GitHub push ์ด๋ฒคํธ ์ ์๋์ผ๋ก ๋น๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ค๋ฉด:
+
+1. Jenkins Job โ Configure โ Build Triggers
+2. "GitHub hook trigger for GITScm polling" ์ฒดํฌ
+3. GitHub ์ ์ฅ์ โ Settings โ Webhooks
+4. Jenkins URL ์ถ๊ฐ: `http://{jenkins-url}/github-webhook/`
+
+### ์๋ฆผ ์ค์ (์ ํ์ฌํญ)
+๋น๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ฉ์ผ์ด๋ Slack์ผ๋ก ๋ฐ์ผ๋ ค๋ฉด:
+
+- Email: Email Extension Plugin ์ค์น ๋ฐ ์ค์
+- Slack: Slack Notification Plugin ์ค์น ๋ฐ ์ค์
+
+## ์ง์ ์๋น์ค
+
+ํ์ฌ Pipeline์์ ๋น๋ํ๋ ์๋น์ค:
+- `user`: ์ฌ์ฉ์ ๊ด๋ฆฌ ์๋น์ค
+- `meeting`: ํ์ ๊ด๋ฆฌ ์๋น์ค
+- `stt`: ์์ฑ-ํ
์คํธ ๋ณํ ์๋น์ค
+- `ai`: AI ์ฒ๋ฆฌ ์๋น์ค
+- `notification`: ์๋ฆผ ์๋น์ค
+
+## ๊ด๋ จ ํ์ผ
+
+- `Jenkinsfile`: Pipeline ์ ์ ํ์ผ
+- `.github/config/deploy_env_vars_{ํ๊ฒฝ}`: ํ๊ฒฝ๋ณ ๋ณ์ ํ์ผ
+- `deployment/container/Dockerfile-backend`: ๋ฐฑ์๋ Dockerfile
+- `hgzero-manifest` ์ ์ฅ์: Kubernetes ๋งค๋ํ์คํธ ํ์ผ
+
+## ๋ฌธ์
+
+Pipeline ๊ด๋ จ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด Jenkins Console Output์ ํ์ธํ๊ณ , ํ์์ DevOps ํ์ ๋ฌธ์ํ์ธ์.
diff --git a/stt/.run/stt.run.xml b/stt/.run/stt.run.xml
deleted file mode 100644
index 598caeb..0000000
--- a/stt/.run/stt.run.xml
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
- false
- false
-
-
-
\ No newline at end of file