728x90
반응형
상황
- 형상관리는 GitLab으로 하고 있고, 이제 프로젝트를 빌드 & 배포 하기 위해 CI/CD스크립트를 작성해야 합니다.
- GitLab-Runner는 2개를 사용하고 있으며, 각 러너의 용도는 다음과 같습니다.
- PowerShell Runner 설치방법
- 넥사크로 빌드를 하기 위한 PowerShell Runner
- Maven 빌드를 위한 openjdk 8 & maven 이 설치된 alpain-linux Runner
처리방법
GitLab CI/CD 시나리오 작성
- 총 4개의 stage 로 진행 할 예정이고, 각 스테이지의 역활은 다음과 같습니다.
- Build
- 현재 파이프라인 번호로 폴더를 생성.
파이프라인별로 배포 폴더를 생성하는 이유는, 동시에 여러 파이프라인이 실행 될 경우 신규 파이프라인에서 빌드된 소스로 계속 덮이기 때문입니다. - nx-build : Nexacro 소스를 PowerShell Runner를 이용해 빌드.
파이프라인 실행 시 자동으로 수행됩니다.
java로 build 할수 있도록 TobeSoft에서 제공해주지만, 아직 완전하진 않아서 PowerShell Runner를 사용하여 빌드하고 있습니다. (자세한 이유는 여기 를 참고합니다.) - mvn-build : Java 소스를 maven jdk 1.8이 설치되어 있는 alpine-linux 를 이용해 빌드.
nx-build job이 실행완료 되면 자동으로 수행됩니다.
- 현재 파이프라인 번호로 폴더를 생성.
- Deploy
- 공통 배포 job (상속해줄 용도)
배포 대상(deploy_server='real'|'dev') 변수와 전체배포여부(is_full = 'true'|'false') 변수를 주입 받아서 배포하는 로직을 구현합니다. - dev-nexa-deploy : 개발 서버용, 서버 재부팅이 필요하지 않은 소스들 배포 (html, js, css, images, fonts, jsp등등)
해당 job은 build stage에서 nx-build job이 실행완료되었을 경우 활성화 되며, 수동으로 실행가능합니다.
공통 배포 Job을 상속받고, 배포대상 변수를 dev로 셋팅하고, 전체배포여부변수를 'false'로 셋팅합니다. - dev-full-deploy : 개발 서버용, 전체 소스를 배포
해당 job은 build stage에서 mvn-build job이 실행완료되었을 경우 활성화 되며, 수동으로 실행가능합니다.
공통 배포 Job을 상속받고, 배포대상 변수를 dev로 셋팅하고, 전체배포여부변수를 'true'로 셋팅합니다. - real-nexa-deploy : 운영 서버용, 서버 재부팅이 필요하지 않은 소스들 배포 (html, js, css, images,fonts,jsp등등)
해당 job은 build stage에서 nx-build job이 실행완료되었을 경우 활성화 되며, 수동으로 실행가능합니다.
공통 배포 Job을 상속받고, 배포대상 변수를 real로 셋팅하고, 전체배포여부변수를 'false'로 셋팅합니다. - real-full-deploy : 운영 서버용, 전체 소스를 배포
해당 job은 build stage에서 mvn-build job이 실행완료되었을 경우 활성화 되며, 수동으로 실행가능합니다.
공통 배포 Job을 상속받고, 배포대상 변수를 real로 셋팅하고, 전체배포여부변수를 'true'로 셋팅합니다.
- 공통 배포 job (상속해줄 용도)
- Restart
- 공통 리스타트 job (상속해줄 용도)
리스타트 대상 (deploy_server='real'|'dev') 변수를 주입받아서 리스타트 하는 로직을 구현합니다. - dev-restart : 개발 서버용, 서버를 수동으로 재부팅.
공통 리스타트 Job을 상속받고, 리스타트 대상을 dev로 셋팅합니다.
해당 job은 deploy stage에서 dev-nexa-deploy가 실행완료 되었을 경우 활성화 되며, 수동으로 실행가능합니다.
(Front로 배포 했기 때문에 리스타트가 필요 없지만, 만약을 위해 만들어 놓은 기능입니다) - dev-restart-auto : 개발 서버용, 서버가 자동으로 재부팅.
공통 리스타트 Job을 상속받고, 리스타트 대상을 dev로 셋팅합니다.
해당 job은 deploy stage에서 dev-full-deploy가 실행완료 되었을 경우 자동으로 실행됩니다.
(Full로 배포 했기 때문에 무조건 리스타트를 해야 해서, 자동으로 실행됩니다.) - real-restart : 개발 서버용, 서버를 수동으로 재부팅.
공통 리스타트 Job을 상속받고, 리스타트 대상을 real으로 셋팅합니다.
해당 job은 deploy stage에서 real-nexa-deploy가 실행완료 되었을 경우 활성화 되며, 수동으로 실행가능합니다.
(Front로 배포 했기 때문에 리스타트가 필요 없지만, 만약을 위해 만들어 놓은 기능입니다) - real-restart-auto: 개발 서버용, 서버가 자동으로 재부팅.
공통 리스타트 Job을 상속받고, 리스타트 대상을 real으로 셋팅합니다.
해당 job은deploy stage에서real-full-deploy가 실행완료 되었을 경우 자동으로 실행됩니다.
(Full로 배포 했기 때문에 무조건 리스타트를 해야 해서, 자동으로 실행됩니다.)
- 공통 리스타트 job (상속해줄 용도)
GitLab CI/CD 스크립트 작성
- GitLab Project 페이지에 들어가서, CI/CD > Editor 을 선택합니다.
- 그러면 다음과 같이 Editor가 열리는데 여기서 CI/CD 스크립트를 작성하면 됩니다.
- 일단 스크립트 내에서 사용할 변수를 선언과, Build Stage (넥사크로 빌드, 메이븐 빌드) 까지만 작성합니다.
(포스팅이 너무 길면 보기 힘들어지니, Deploy Stage, 운영, 개발 배포는 다음 포스팅에서 진행하도록 하겠습니다.)
#변수
variables:
dev_host : '127.0.0.1'
dev_port : '22'
dev_user : 'yun'
dev_pwd : 'qwert!@1234'
dev_path : '/web/yun'
real_host : '127.0.0.2'
real_port : '22'
real_user : 'yun'
real_pwd : 'qwert!@1234'
real_path : '/web/yun'
# 넥사크로 디플로이 툴 경로
nexaTool: "C:\\'Program Files'\\TOBESOFT\\'Nexacro N'\\Tools\\nexacrodeploy.exe"
# 넥사크로 core 라이브러리 경로
nexaLib: "C:\\'Program Files (x86)'\\TOBESOFT\\'Nexacro N'\\SDK\\21.0.0\\nexacrolib"
deployPath: "C:\\gitlab-runner\\yun\\deploy\\$CI_PIPELINE_ID"
# alpine linux image를 사용하는 runner에 volumes마운트 해놓은 deploy 경로
linuxDeployPath: "/yun/deploy"
# alpine linux image를 사용하는 runner에서 배포소스에 접근하기 위한 경로
javaDeployPath: "$linuxDeployPath/$CI_PIPELINE_ID"
stages:
- build
- deploy
- restart
nx-build:
stage: build
before_script:
script:
- echo "nx build"
- New-Item $deployPath/nxui -ItemType Directory -Force
- powershell -Command "$nexaTool2 -P '$((Get-Location).tostring())\ui\nxui.xprj' -O '$deployPath/nxui' -B $nexaLib2 -REGENERATE -COMPRESS -SHRINK"
#실패해도 통과
allow_failure: true
only:
- main
tags:
- window
mvn-build:
stage: build
script:
- echo "mvn build"
- java -version
#maven 빌드
- mvn clean
- mvn install
- mkdir -pv $javaDeployPath
- unzip $PWD/target/*.war -d $javaDeployPath
needs: ['nx-build']
only:
- main
tags:
- maven
.deploy: &deploy
stage: deploy
before_script:
- apk update && apk add openssh-client sshpass rsync
script:
- echo "deploy"
- |
if [ "$deploy_server" = "real" ]; then
deploy_host=${real_host}
deploy_port=${real_port}
deploy_user=${real_user}
deploy_pwd=${real_pwd}
deploy_path=${real_path}
else
deploy_host=${dev_host}
deploy_port=${dev_port}
deploy_user=${dev_user}
deploy_pwd=${dev_pwd}
deploy_path=${dev_path}
fi
if [ "$is_full" = "false" ]; then
# 업데이트가 되면 재부팅이 필요한 파일들은 제외하고 변경사항 배포
else
# 변경사항 전부 배포
fi
when: manual
only:
- main
tags:
- maven
dev-nexa-deploy:
<<: *deploy
variables:
deploy_server: 'dev'
is_full: 'false'
needs: ['nx-build']
dev-full-deploy:
<<: *deploy
variables:
deploy_server: 'dev'
is_full: 'true'
needs: ['nx-build', 'mvn-build']
real-nexa-deploy:
<<: *deploy
variables:
deploy_server: 'real'
is_full: 'false'
needs: ['nx-build']
real-full-deploy:
<<: *deploy
variables:
deploy_server: 'real'
is_full: 'true'
needs: ['nx-build', 'mvn-build']
.restart: &restart
stage: restart
variables:
before_script:
- apk update && apk add openssh-client sshpass rsync
script:
- echo "restart"
- |
if [ "$deploy_server" = "real" ]; then
deploy_host=${real_host}
deploy_port=${real_port}
deploy_user=${real_user}
deploy_pwd=${real_pwd}
deploy_path=${real_path}
server_start_script="/was/bin/startup.sh"
server_stop_script="/was/bin/stop.sh"
server_restart_script="/was/bin/restart.sh"
else
deploy_host=${dev_host}
deploy_port=${dev_port}
deploy_user=${dev_user}
deploy_pwd=${dev_pwd}
deploy_path=${dev_path}
server_start_script="/was/bin/startup.sh"
server_stop_script="/was/bin/stop.sh"
server_restart_script="/was/bin/restart.sh"
fi
# deploy 변수정보와 server_start, stop, restart script 정보로 ssh 접속해서, server를 stop > start 혹은 restart 해준다.
only:
- main
tags:
- maven
dev-restart:
<<: *restart
variables:
deploy_server: 'dev'
needs: ['dev-nexa-deploy']
when: manual
dev-restart-auto:
<<: *restart
variables:
deploy_server: 'dev'
needs: ['dev-full-deploy']
real-restart:
<<: *restart
variables:
deploy_server: 'real'
needs: ['real-nexa-deploy']
when: manual
real-restart-auto:
<<: *restart
variables:
deploy_server: 'real'
needs: ['real-full-deploy']
- 위와 스크립트를 CI/CD에디터에 넣고 상단에 Visualize 탭을 눌러서 job들이 어떻게 흘러가는지 확인해 봅니다.
확인
- 이제 파이프 라인으로 돌아와서, 작성한 CI/CD가 잘돌아가는 지 확인 해봅니다.
- 먼저 파이프 라인이 생성되면 자동으로 Build Stage (nx-build job과 mvn-build job)이 실행됩니다.
- nx-build job (넥사크로 빌드)은 ! 로 표시될텐데, 정상적으로 수행된 것이니 무시하셔도 됩니다.
- nx-build job 실행 로그
Running with gitlab-runner 15.7.1 (6d480948)
Preparing the "shell" executor
Using Shell executor...
...
Successfully generated file : "C:/gitlab-runner/yun/deploy/216/yun/start.json"
Successfully generated file : "C:/gitlab-runner/yun/deploy/216/yun/index.html"
Successfully generated file : "C:/gitlab-runner/yun/deploy/216/yun/launch.html"
Successfully generated file : "C:/gitlab-runner/yun/deploy/216/yun/popup.html"
Successfully generated file : "C:/gitlab-runner/yun/deploy/216/yun/quickview.html"
====== Finish generating ( 12.75 sec ) : Success 689, Fail 19, Copy 53, Skip 0 ======
== Finish
- mvn-build job 실행 로그
Running with gitlab-runner 15.7.1 (6d480948)
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 32.388 s
[INFO] Finished at: 2023-02-16T03:13:55+00:00
[INFO] Final Memory: 35M/524M
[INFO] ------------------------------------------------------------------------
...
Archive: /builds/yun/target/yun.war
...
Job succeeded
- 이제 C:/gitlab-runner/yun/deploy/216 으로 들어가보면, 빌드된 넥사크로 소스와, 빌드된 java 소스를 확인 할 수 있습니다.
- 위에 표시된 "C:/gitlab-runner/yun/deploy/" 경로는 gitlab-runner 등록 시 [runners.docker] volumes에 설정된 경로 입니다.
- powershell runner 설정은여기에서 확인하시면 됩니다.
- deploy, restart stage는 다음 포스팅에서 계속..
728x90
반응형