[Linux] CI/CD 개선: Jenkins를 활용한 자동화 배포 시스템 구축(nonub)
■ 배경
회사에서 사용하는 기존 CI/CD 시스템에서는 Jenkins를 통해 빌드된 파일이 서버로 옮겨지는 구조가 이미 구현되어 있었습니다. 그러나 배포 과정은 여전히 수작업으로 진행되었고, 개발자가 직접 서버에 원격 접속하여 각 도메인에 맞게 배포하는 번거로운 과정을 거쳐야 했습니다. 이러한 상황은 불편함 뿐만 아니라 개발자들의 생산성을 저하시킨다고 생각하여 개선을 하기로 결심했습니다.
■ 개선 목표
이러한 문제를 해결하기 위해, 저는 CI/CD 프로세스를 자동화하여 배포 과정에서의 인적 오류를 줄이고, 업무 효율성을 높이는 것을 목표로 하였습니다. 이를 위해 Jenkins를 통해 전달되는 압축된 빌드파일을 타겟서버인 linux의 nonub 이용한 자동 배포 스크립트 실행시키는 시스템을 만들기로 했습니다.
■ 구현 과정
1. 플래그(flag) 파일 만들기
빌드된 소스 파일이 외에 소스 파일의 정보를 담은 텍스트 파일을 하나 생성하여 함께 웹서버로 전달한다.
내 경우에는 빌드가 이뤄지는 work 여러개 존재해서 이를 구분할 수 있는 {JOB_NAME}을 플래그 파일에 작성해서 전달했다.
예시
$ echo ${JOB_NAME} > deploy_flag.txt
2. 배포 쉘 만들기
배포 쉘의 내용은 특정 위치에 플래그 파일이 있을 경우, 플래그 파일의 내용을 읽어서 job에 맞는 위치에 소스를 배포해주고 완료되면 플래그 파일을 삭제한다. 플래그 파일은 2초에 한번씩 확인한다.
3. 와쳐(watcher) 만들기
1번에서 작성한 플래그 파일이 생성되었을 때, 2번에서 만든 배포 쉘이 수행될 수 있게 와쳐(watcher)를 리눅스 nohub을 이용해서 만들수 있다. nohub은 웹서버에 접속한 유저의 세션이 종료되어도 프로세스가 수행될 수 있게해주는 유틸리티이다.
백그라운드에서 프로세스 수행하기
$ nohup command [arguments] &
위 명령어를 통해서 백그라운드에서 프로세스를 수행할 수 있다. '&'를 제외하면 세션이 종료되었을 때, 프로세스가 종료되게끔할 수 있다.
배포 쉘 백그라운드 실행하기
$ nohub sh /deploy.sh &
2에서 작성한 배포 쉘이 root 경로(/)의 deploy.sh이라는 이름의 쉘일 경우, 위와 같이 백그라운드로 실행할 수 있다.
nohub을 실행하면 추가 명령어를 입력할 수 있게끔 나오는데 아무키나 누르거나 ctl + c로 종료하면 된다.
종료하여도 백그라운드에서 deploy.sh은 계속 실행된다.
nohub을 실행한 위치에 nohub.out 파일이 생성되었다면, 정상적으로 수행된 것이다. 해당 파일은 nohub으로 실행한 프로세스의 로그파일로 deploy.sh에 echo 등으로 특정 상황에서 출력명령어를 수행한다면, 로그를 쌓아서 확인할 수 있다.
4. nohub 프로세스 종료하기
$ ps -ef | grep deploy
deploy.sh을 수행하고 있는 프로세스의 id를 확인한다.
$ kill -9 [processId]
# 예시: kill -9 5876
확인한 프로세스 id를 강제종료(9 옵션) 시킨다.
■ 결과
업무 효율성 향상: 배포 과정이 5단계에서 1단계로 줄어들면서, 개발자들은 더 이상 서버에 직접 접속할 필요가 없어졌습니다. 이는 팀의 생산성을 대폭 향상시켰습니다.
인적 오류 감소: 자동화된 배포 과정 덕분에 인적 오류가 크게 줄어들어, 배포의 안정성을 높일 수 있었습니다.
보안 강화: 원격 접속을 최소화함으로써 보안적인 위험 요소를 줄일 수 있었습니다.
폐쇄망이나 보안정책이 강력한 환경에서 부족한 CI/CD 환경을 위와 같은 방식으로 개선할 수 있었습니다.
비슷한 환경에서 비슷한 문제를 겪는다면 도움이 될 수 도 있을것 같습니다.
'Programming > Linux' 카테고리의 다른 글
| [Shell Script] CI/CD 자동화 배포를 위한 파일 모니터닝 쉘 스크립트 만들기 (0) | 2024.08.05 |
|---|---|
| [PowerShell] 파워쉘 웹 크롤링 / 파워쉘 변수 한글 저장 문제 해결 (1) | 2022.05.10 |
| [Linux / Terminal] 리눅스, 터미널 자주 사용하는 명령어 정리 (0) | 2022.02.04 |
















