Files
cointrader/Jenkinsfile
21in7 565414c5e0 feat: add trading dashboard with API and UI components
- Introduced a new trading dashboard consisting of a FastAPI backend (`dashboard-api`) for data retrieval and a React frontend (`dashboard-ui`) for visualization.
- Implemented a log parser to monitor and store bot logs in an SQLite database.
- Configured Docker setup for both API and UI, including necessary Dockerfiles and a docker-compose configuration.
- Added setup documentation for running the dashboard and accessing its features.
- Enhanced the Jenkins pipeline to build and push the new dashboard images.
2026-03-05 20:25:45 +09:00

107 lines
4.2 KiB
Groovy

pipeline {
agent any
environment {
REGISTRY = 'git.gihyeon.com'
IMAGE_NAME = 'gihyeon/cointrader'
IMAGE_TAG = "${env.BUILD_NUMBER}"
FULL_IMAGE = "${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
LATEST_IMAGE = "${REGISTRY}/${IMAGE_NAME}:latest"
DASH_API_IMAGE = "${REGISTRY}/gihyeon/cointrader-dashboard-api"
DASH_UI_IMAGE = "${REGISTRY}/gihyeon/cointrader-dashboard-ui"
// 젠킨스 자격 증명에 저장해둔 디스코드 웹훅 주소를 불러옵니다.
DISCORD_WEBHOOK = credentials('discord-webhook')
}
stages {
// 빌드가 시작되자마자 알림을 보냅니다.
stage('Notify Build Start') {
steps {
sh """
curl -H "Content-Type: application/json" \
-X POST \
-d '{"content": "🚀 **[빌드 시작]** `cointrader` (Build #${env.BUILD_NUMBER}) 배포 파이프라인 가동"}' \
${DISCORD_WEBHOOK}
"""
}
}
stage('Git Clone from Gitea') {
steps {
git branch: 'main',
credentialsId: 'gitea-cred',
url: 'https://git.gihyeon.com/gihyeon/cointrader.git'
}
}
stage('Build Docker Images') {
steps {
sh "docker build -t ${FULL_IMAGE} -t ${LATEST_IMAGE} ."
sh "docker build -t ${DASH_API_IMAGE}:${IMAGE_TAG} -t ${DASH_API_IMAGE}:latest ./dashboard/api"
sh "docker build -t ${DASH_UI_IMAGE}:${IMAGE_TAG} -t ${DASH_UI_IMAGE}:latest ./dashboard/ui"
}
}
stage('Push to Gitea Registry') {
steps {
withCredentials([usernamePassword(credentialsId: 'gitea-registry-cred', passwordVariable: 'GITEA_TOKEN', usernameVariable: 'GITEA_USER')]) {
sh "echo \$GITEA_TOKEN | docker login ${REGISTRY} -u \$GITEA_USER --password-stdin"
sh "docker push ${FULL_IMAGE}"
sh "docker push ${LATEST_IMAGE}"
sh "docker push ${DASH_API_IMAGE}:${IMAGE_TAG}"
sh "docker push ${DASH_API_IMAGE}:latest"
sh "docker push ${DASH_UI_IMAGE}:${IMAGE_TAG}"
sh "docker push ${DASH_UI_IMAGE}:latest"
}
}
}
stage('Deploy to Prod LXC') {
steps {
sh 'ssh root@10.1.10.24 "mkdir -p /root/cointrader"'
sh 'scp docker-compose.yml root@10.1.10.24:/root/cointrader/'
sh '''
ssh root@10.1.10.24 "cd /root/cointrader/ && \
docker compose down && \
docker compose pull && \
docker compose up -d"
'''
}
}
stage('Cleanup') {
steps {
sh "docker rmi ${FULL_IMAGE} || true"
sh "docker rmi ${LATEST_IMAGE} || true"
sh "docker rmi ${DASH_API_IMAGE}:${IMAGE_TAG} || true"
sh "docker rmi ${DASH_API_IMAGE}:latest || true"
sh "docker rmi ${DASH_UI_IMAGE}:${IMAGE_TAG} || true"
sh "docker rmi ${DASH_UI_IMAGE}:latest || true"
}
}
}
// 파이프라인 결과에 따른 디스코드 알림
post {
success {
echo "Build #${env.BUILD_NUMBER} 성공: ${FULL_IMAGE} → 운영 LXC(10.1.10.24) 배포 완료"
sh """
curl -H "Content-Type: application/json" \
-X POST \
-d '{"content": "✅ **[배포 성공]** `cointrader` (Build #${env.BUILD_NUMBER}) 운영 서버(10.1.10.24) 배포 완료!\\n- 📦 이미지: `${FULL_IMAGE}`"}' \
${DISCORD_WEBHOOK}
"""
}
failure {
echo "Build #${env.BUILD_NUMBER} 실패"
sh """
curl -H "Content-Type: application/json" \
-X POST \
-d '{"content": "❌ **[배포 실패]** `cointrader` (Build #${env.BUILD_NUMBER}) 파이프라인 에러 발생. 젠킨스 로그를 확인해 주세요!"}' \
${DISCORD_WEBHOOK}
"""
}
}
}