15 KiB
운영툴 서버 설정
- 운영툴 주소
- 10.20.20.12
- 운영툴 구성을 위한 필요 프로그램 설치
- Docker Desktop Installer
- Git-2.43.0-64-bit
- jdk-17.0.10_windows-x64_bin
- node-v20.11.0-x64
- python-3.12.1-amd64
- jenkins.msi
- Docker MariaDB 구성
- 소스코트 내 \Server\docker\admintool 에 있는 docker-compose 실행
- .env 파일에 root 계정의 패스워드 설정
- db\initdb.d 내에 최초 설치시 실행될 스크립트 구성
- 스키마 추가, 변경 경우 여기에 같이 추가해주는것이 좋음
- 소스코트 내 \Server\docker\admintool 에 있는 docker-compose 실행
- 젠킨스 구성
- 계정명 : admintool
- 암호 : caliverse!1
- 주소 : http://10.20.20.23:8090
- 젠킨스 Git Credential 구성
- enkins 관리 → Credentials → (global)도메인 선택 → Add credential 선택
- kind → Username with password
- Scope → Global
- Username → jenkins_user
- Password → jen3596!@
- Username, Password는 git 계정을 의미
- ID → admintool_git (표시 이름)
-
젠킨스 플러그인 관련 설정
- 플러그인 설치
-
- 기본적인 플러그인은 최초 설치시 설정
- NodeJs Plugin
- Docker Pipeline
- Docker
- Gradle
- Pipeline
- Publish Over SSH
- Subversion Plug-in
-
- Tools 설정
- JDK installations 설정
- Name : jdk
- JAVA_HOME : C:\Program Files\Java\jdk-17
- Gradle installations 설정
- name : gradle
- version : 7.6.4
- NodeJS installation
- name : nodejs
- version : 21.6.2
- JDK installations 설정
- 플러그인 설치
-
Frontend Stage 배포 작업 구성(24-08-23 기준)
pipeline { agent any environment { DOCKER_IMAGE = "caliverse/admintool-front" DOCKER_TAG = "1.0.0" // 신규 버전 DOCKER_TAG_PRE = "1.0.0" // 이전 버전 FILE_NAME = 'admintool_front.tar' DOCKER_NAME = 'admintool-front' DOCKER_PORT = '8080' } stages { stage('Docker Build') { steps { sh 'docker rmi $DOCKER_IMAGE:$DOCKER_TAG_PRE || true' //이전 이미지 삭제 sh 'docker build -t $DOCKER_IMAGE:$DOCKER_TAG .' //새 이미지 생성 echo 'Docker Image 생성' sh 'docker save -o $FILE_NAME $DOCKER_IMAGE:$DOCKER_TAG' //이미지 .tar 로 생성 echo "Docker Image > .tar 파일로 생성" } } stage('Transfer Docker Image') { steps { // aws .tar transfer sshPublisher( publishers: [ sshPublisherDesc( configName: 'stage-frontend', transfers: [ sshTransfer( sourceFiles: "${FILE_NAME}", remoteDirectory: '', execCommand: """ echo ".tar 전송 완료 """, execTimeout: 120000 ) ], usePromotionTimestamp: false, verbose: true ) ] ) } } stage('Deploy to Remote'){ steps{ // aws command sshPublisher( publishers: [ sshPublisherDesc( configName: 'stage-frontend', transfers: [ sshTransfer( execCommand: """ docker stop ${DOCKER_NAME} || true && docker rm ${DOCKER_NAME} || true && docker rmi ${DOCKER_IMAGE}:${DOCKER_TAG_PRE} || true && docker load -i ${FILE_NAME} && docker run -d \ -p ${DOCKER_PORT}:${DOCKER_PORT} \ --name ${DOCKER_NAME} \ -v ./admintool/log:/var/log/nginx \ -e TZ=\${TZ:-Asia/Seoul} \ ${DOCKER_IMAGE}:${DOCKER_TAG} && rm ${FILE_NAME} echo 'Docker Container Create Complete' """, execTimeout: 120000 ) ], usePromotionTimestamp: false, verbose: true ) ] ) } } } } -
Frontend Reverse Proxy(nginx.conf)
server { listen 8080; listen [::]:8080; server_name localhost; location / { root /usr/share/nginx/admintool; index index.html index.htm; try_files $uri $uri/ /index.html; } # api reverse proxy location /api/ { proxy_pass http://172.30.148.164:23450; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/admintool; } } -
Frontend Dockerfile
FROM node:20.11.0 as build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build FROM nginx:alpine COPY nginx.conf /etc/nginx/conf.d/default.conf COPY --from=build /app/build /usr/share/nginx/admintool # port 8080 EXPOSE 8080 CMD ["nginx", "-g", "daemon off;"] -
Backend Stage 배포 작업 구성(24-08-23 기준)
pipeline { agent any environment { DOCKER_IMAGE = 'caliverse/admintool-back' DOCKER_TAG = '1.0.0' DOCKER_TAG_PRE = '1.0.0' FILE_NAME = 'admintool_back.tar' DOCKER_NAME = 'admintool-back' DOCKER_PORT = '23450' } stages { stage('Gradle Build') { steps { script { sh 'chmod +x gradlew' //gradle 권한 설정 sh './gradlew clean build -x test' //빌드 test는 하지않는다 } } } stage('Docker Image Build') { steps { script { sh 'docker rmi $DOCKER_IMAGE:$DOCKER_TAG_PRE || true' //이전 이미지 삭제 sh 'docker build -t $DOCKER_IMAGE:$DOCKER_TAG .' echo 'Docker Image Create' sh 'docker save -o $FILE_NAME $DOCKER_IMAGE:$DOCKER_TAG' echo 'Docker Image > .tar File Create' } } } stage('SSH Tunneling') { steps { script { sh 'ssh -f -N -L 127.30.148.164:2211:172.30.148.164:2211 ubuntu@52.32.111.3 -p 2211 -i /home/admintool/USWest2-KeyPair.pem -o StrictHostKeyChecking=no &' } } } stage('Transfer Docker Image') { steps { // aws .tar transfer sshPublisher( publishers: [ sshPublisherDesc( configName: 'stage-backend', transfers: [ sshTransfer( sourceFiles: "${FILE_NAME}", remoteDirectory: '', execCommand: """ echo '.tar Transfer Complete' """, execTimeout: 120000 ) ], usePromotionTimestamp: false, verbose: true ) ] ) } } stage('Deploy to Remote'){ steps{ // aws command sshPublisher( publishers: [ sshPublisherDesc( configName: 'stage-backend', transfers: [ sshTransfer( execCommand: """ docker load -i ${FILE_NAME} && docker stop ${DOCKER_NAME} || true && docker rm ${DOCKER_NAME} || true && docker rmi ${DOCKER_IMAGE}:${DOCKER_TAG_PRE} || true && docker run -d \ -p ${DOCKER_PORT}:${DOCKER_PORT} \ --name ${DOCKER_NAME} \ -e TZ=\${TZ:-Asia/Seoul} \ -v ./admintool/log:/logs \ ${DOCKER_IMAGE}:${DOCKER_TAG} && rm ${FILE_NAME} """, execTimeout: 120000 ) ], usePromotionTimestamp: false, verbose: true ) ] ) } } } } -
Backend Dockerfile
FROM openjdk:17 ARG JAR_FILE=build/libs/CaliverseAdminAPI.jar COPY ${JAR_FILE} admintool.jar ENTRYPOINT ["java","-jar","/admintool.jar"]
-
Frontend 작업 구성(24-02-21 기준) - 사용안함
pipeline { agent any environment { CI = 'false' } stages { stage('Pull Code') { steps { git branch: 'dev', credentialsId: 'admintool_git', url: 'http://44.227.18.113/caliverseadmin/backofficefront.git' } } stage('Move Files') { steps { bat 'xcopy /E /Y ..\Dev_FrontEnd_Build\* D:\AdminTool\FrontEnd\' } } stage('Build') { steps { dir('D:\AdminTool\FrontEnd\') { bat 'npm install' bat 'npm install pm2' bat 'npm run build' } } } stage('Stop') { steps { dir('D:\AdminTool\FrontEnd\') { script { try { bat 'pm2 delete AdminTool'
} catch (error) {}} } } } stage('Create ecosystem.config.js if not exists') { steps { script { def configFile = 'D:\\AdminTool\\FrontEnd\\ecosystem.config.js' def configContent = '''module.exports = { apps: [{ name: 'AdminTool', script: './node_modules/react-scripts/scripts/start.js', instances: 2, exec_mode: 'cluster' }] }''' if (!fileExists(configFile)) { writeFile file: configFile, text: configContent echo "Created ecosystem.config.js" } else { echo "ecosystem.config.js already exists" } } } } stage('Start') { steps { dir('D:\\AdminTool\\FrontEnd\\') { bat ''' set BUILD_ID=dontKillMe node_modules\\.bin\\pm2 start --name AdminTool ''' } } } }}
-
Backend 작업 구성(24-02-21 기준) - 사용안함
pipeline { agent any environment { CI = 'false' } stages { stage('Pull Code') {
steps { git branch: 'dev', credentialsId: 'admintool_git', url: 'http://44.227.18.113/caliverseadmin/backofficeapi.git' } } stage('Move Files') { steps { bat 'xcopy /E /Y ..\\Dev_BackEnd_Build\\* D:\\AdminTool\\BackEnd\\' } } stage('Stop') { steps { script { bat ''' for /f "tokens=5" %%a in ('netstat -ano ^| findstr :9099') do ( set pid=%%a ) if not "%pid%"=="" ( taskkill /F /PID %pid% echo Process Ended. PID: %pid% ) else ( echo No PID!! ) ''' } } } stage('Build') { steps { dir('D:\\AdminTool\\BackEnd\\') { script { def buildResult = bat returnStatus: true, script: 'gradlew bootJar' if (buildResult != 0) { error 'Failed to build the project' } } } } } stage('Run') { steps { dir('D:\\AdminTool\\BackEnd\\build\\libs\\') { script { bat ''' set JENKINS_NODE_COOKIE=dontKillMe start /b cmd /c java -jar -Dspring.profiles.active=dev .\\CaliverseAdminAPI.jar & ''' } } } } }}