πŸ“ μ μ–΄μ„œ λ¨Έλ¦Ώμ†μœΌλ‘œ

폐쇄망 ν™˜κ²½μ˜ λ ˆκ±°μ‹œ CI/CD κ°œμ„ κΈ°: μˆ˜λ™ 배포 5단계λ₯Ό 1λ‹¨κ³„λ‘œ μžλ™ν™”ν•˜κΈ° λ³Έλ¬Έ

Programming/Linux

폐쇄망 ν™˜κ²½μ˜ λ ˆκ±°μ‹œ CI/CD κ°œμ„ κΈ°: μˆ˜λ™ 배포 5단계λ₯Ό 1λ‹¨κ³„λ‘œ μžλ™ν™”ν•˜κΈ°

Space_Jin 2025. 1. 29. 13:14
728x90
λ°˜μ‘ν˜•

β–  λ°°κ²½: "μ›λž˜ κ·Έλž˜μš”"

μ œκ°€ μΌν•˜κ³  μžˆλŠ” 금육 νšŒμ‚¬μ— κ΅¬ν˜„λ˜μ–΄ 있던 κΈ°μ‘΄ CI/CD μ‹œμŠ€ν…œμ€ 반μͺ½μ§œλ¦¬ μžλ™ν™”μ˜€μŠ΅λ‹ˆλ‹€.

Jenkinsλ₯Ό 톡해 λΉŒλ“œλœ μ†ŒμŠ€ μ••μΆ• 파일일이 νƒ€κ²Ÿ μ„œλ²„λ‘œ μ „μ†‘λ˜λŠ” κ²ƒκΉŒμ§€λŠ” κ΅¬ν˜„λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ, κ·Έ μ΄ν›„μ˜ 과정은 μ˜¨μ „νžˆ 개발자의 λͺ«μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

κ°œλ°œμžκ°€ 직접 νƒ€κ²Ÿ μ„œλ²„μ— μ„œλ²„ μ ‘μ†μš© clientλ₯Ό μ΄μš©ν•΄ μ ‘μ†ν•˜κ³ , 각 도메인 ν™˜κ²½μ— 맞좰 슀크립트λ₯Ό μ°Ύμ•„ μ‹€ν–‰ν•˜λŠ” 5λ‹¨κ³„μ˜ 번거둜운 μˆ˜μž‘μ—…μ„ κ±°μ³μ•Όλ§Œ ν–ˆμŠ΅λ‹ˆλ‹€.

MSA둜 κ΅¬μ„±λœ μ„œλΉ„μŠ€λŠ” μ—¬λŸ¬ μ„œλ²„μ™€ κ·Έ μ•ˆμ— 도메인이 또 λ‚˜λ‰˜μ–΄μžˆλŠ”λ° μ΄λŸ¬ν•œ κ΅¬μ‘°λŠ” μ‹ κ·œ μž…μ‚¬μž μ˜¨λ³΄λ”©μ˜ 높은 μ§„μž… μž₯벽이 λ˜μ—ˆκ³ , 무엇보닀 크고 μž‘μ€ 휴먼 μ—λŸ¬(Human Error)λ₯Ό μœ λ°œν–ˆμŠ΅λ‹ˆλ‹€.

 

λ‹€λ“€ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œμ˜ λΆˆνŽΈν•¨μ„ κ°μˆ˜ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€. "이미 μ•žμ„œ λΉ„μŠ·ν•œ μ„œλΉ„μŠ€λ₯Ό μš΄μ˜ν•˜λŠ” λ‹€λ₯Έ νŒ€λ„ μ΄λ ‡κ²Œν•˜κ³  μžˆλ‹€." 라고 말이죠.

이 'λ‹Ήμ—°ν•œ λΆˆνŽΈν•¨'이 νŒ€μ˜ 생산성을 κ°‰μ•„λ¨Ήκ³  μžˆλ‹€κ³  νŒλ‹¨ν•˜μ—¬ κ°œμ„  μž‘μ—…μ— μ°©μˆ˜ν–ˆμŠ΅λ‹ˆλ‹€.

기쑴의 배포 방식 도식화

β–  λΆ„μ„ν•˜κΈ°: μ™œ?

κ°€μž₯ λ¨Όμ € λ“  생각은 "μ™œ 이런 λ°©μ‹μœΌλ‘œ λ˜μ–΄μžˆμ„κΉŒ?"μ˜€μŠ΅λ‹ˆλ‹€. 처음 μ΄λŸ¬ν•œ μ•„ν‚€ν…μ²˜κ°€ κ΅¬ν˜„λœ μ΄μœ κ°€ μžˆμ„ν…Œλ‹ˆκΉŒμš”.

원인은 μ‚¬λ‚΄μ˜ μ‹œμŠ€ν…œμ΄ κ°•λ ₯ν•œ λ³΄μ•ˆ 정책이 적용된 νμ‡„λ§μ΄μ—ˆλ‹€λŠ” μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

 

λ³΄μ•ˆμ  μ œμ•½ 사항

- Jenkinsλ₯Ό ν†΅ν•œ SSH 원격 λͺ…λ Ήμ–΄ μ‹€ν–‰ μ œν•œ(νŠΉμ • 파일 μ „μ†‘λ§Œ ν—ˆμš©)

- μ„œλ²„ λ‚΄ Crontab μ‚¬μš© λΆˆκ°€

- μ™ΈλΆ€ 라이브러리(예: inotify-tools) λ„μž… λΆˆκ°€

- μ—­ν•  별 μ„œλ²„ 계정 뢄리(FTP, webdomain μ ‘κ·Ό)

 

μš”μ•½ν•˜μžλ©΄, 저희 λ³΄μ•ˆ ν™˜κ²½μ—μ„œλŠ” jenkinsκ°€ μ„€μΉ˜λœ μ„œλ²„μ—μ„œ μ†ŒμŠ€κ°€ λ°°ν¬λ˜μ–΄μ•Όν•  νƒ€κ²Ÿ μ„œλ²„λ‘œ μ•½μ†λœ μœ„μΉ˜λ‘œ λΉŒλ“œλœ μ†ŒμŠ€νŒŒμΌμ˜ μ••μΆ•νŒŒμΌ(tar.gz)만 전달이 κ°€λŠ₯ν–ˆκ³  FTP용 계정은 μ›Ή 도메인이 μžˆλŠ” ν΄λ”λ‘œ 접근이 λΆˆκ°€ν–ˆμŠ΅λ‹ˆλ‹€.

μ™ΈλΆ€ 라이브러리 μ‚¬μš©μ΄λ‚˜ μŠ€μΌ€μ€„λ§ μž‘μ—…(crontab)을 μ‚¬μš© λͺ»ν•˜λ‹ˆ "κ°œλ°œμžλ“€μ΄ 직접 μ›Ή 도메인에 μ ‘κ·Ό κ°€λŠ₯ν•œ 계정을 λ°œκΈ‰ λ°›μ•„ 직접 μ„œλ²„μ— μ ‘μ†ν•΄μ„œ μˆ˜λ™ 배포λ₯Ό μ§„ν–‰ν•˜λŠ” 방식"으둜 μ§„ν–‰ν•˜κ²Œ 된 κ²ƒμœΌλ‘œ μΆ”μΈ‘ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

"κ·Έλ ‡λ‹€λ©΄ μ£Όμ–΄μ§„ λ¦¬λˆ…μŠ€ μˆœμ •(Native) κΈ°λŠ₯만으둜 μš°νšŒν•΄μ„œ ν•΄κ²°ν•  μˆ˜λŠ” μ—†μ„κΉŒ?" κ²°κ΅­ μ™ΈλΆ€ μ˜μ‘΄μ„±μ„ μ™„μ „νžˆ λ°°μ œν•˜κ³ , Jenkinsκ°€ λ„˜κ²¨μ£ΌλŠ” 파일과 λ¦¬λˆ…μŠ€μ˜ κΈ°λ³Έ μœ ν‹Έλ¦¬ν‹°(nohup, shell script)λ§Œμ„ μ‘°ν•©ν•˜μ—¬ 직접 μŠ€μΌ€μ€„λ§(Watcher) κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ°λ‘œ κ²°λ‘  λ‚΄λ ΈμŠ΅λ‹ˆλ‹€.


β–  κ³ λ―Ό: 폴링(Polling) 방식, κ³Όμ—° μ•ˆμ „ν•œκ°€?

μ €λŠ” watcher κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ jenkinsκ°€ μ†ŒμŠ€ 파일이 μ••μΆ•λœ νŒŒμΌμ„ μ „λ‹¬ν•œ ν›„ job 정보λ₯Ό 담은 txt νŒŒμΌμ„ μΆ”κ°€λ‘œ μ „λ‹¬ν•˜λŠ” executeλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

 

νƒ€κ²Ÿ μ„œλ²„μ—μ„œλŠ” txt 파일(μ΄ν•˜ flag 파일)이 μ„œλ²„μ— λ„μ°©ν–ˆλŠ”μ§€ κ°μ§€ν•˜κΈ° μœ„ν•΄, νŠΉμ • 경둜λ₯Ό 주기적으둜 ν™•μΈν•˜λŠ” 폴링(Polling) λ°©μ‹μ˜ μ‰˜ 슀크립트λ₯Ό μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ 두 번째 고민이 μ‹œμž‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

"λ¬΄ν•œ 루프λ₯Ό 돌며 νŒŒμΌμ„ μ²΄ν¬ν•˜λŠ” 폴링 방식이 μ„œλ²„ CPU에 κ³ΌλΆ€ν•˜λ₯Ό μ£Όμ§€λŠ” μ•Šμ„κΉŒ?"

 

 

μ„Έλ ¨λœ 이벀트 기반(Event-driven) 감지 방식이 μ•„λ‹ˆμ—ˆκΈ°μ—, μ‹œμŠ€ν…œ μ•ˆμ •μ„±μ— λŒ€ν•œ 팩트 체크가 λ°˜λ“œμ‹œ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

  1. λΆ€ν•˜ ν…ŒμŠ€νŠΈ 및 검증: 슀크립트 μ‹€ν–‰ ν›„ λ¦¬λˆ…μŠ€ top λͺ…λ Ήμ–΄λ₯Ό 톡해 μ‹€μ‹œκ°„ λ¦¬μ†ŒμŠ€ μ μœ μœ¨μ„ λͺ¨λ‹ˆν„°λ§ν–ˆμŠ΅λ‹ˆλ‹€. 2초 주기둜 sleep을 μ£Όμ–΄ κ²€μ‚¬ν•œ κ²°κ³Ό, ν•΄λ‹Ή ν”„λ‘œμ„ΈμŠ€μ˜ CPU μ μœ μœ¨μ€ 0.1% 미만으둜 μ‹œμŠ€ν…œμ— λ―ΈμΉ˜λŠ” 영ν–₯이 사싀상 μ œλ‘œμ— κ°€κΉλ‹€λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.
  2. 리슀크 λ²”μœ„ ν•œμ •: λ§Œμ— ν•˜λ‚˜ λ°œμƒν•  수 μžˆλŠ” μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό κ³ λ €ν•˜μ—¬, λŒ€κ³ κ° μ„œλΉ„μŠ€κ°€ κ΅¬λ™λ˜λŠ” 운영(Prod) μ„œλ²„κ°€ μ•„λ‹Œ 개발(Dev) μ„œλ²„μ—λ§Œ μ„ μ œμ μœΌλ‘œ μ μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 검증 과정을 κ±°μΉ˜λ‹ˆ, νˆ¬λ°•ν•΄ 보이던 폴링 방식이 μ£Όμ–΄μ§„ μ œμ•½ μ†μ—μ„œλŠ” κ°€μž₯ μ•ˆμ „ν•˜κ³  합리적인 μ—”μ§€λ‹ˆμ–΄λ§ μ„ νƒμ΄λΌλŠ” 확신이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.


β–  κ΅¬ν˜„ κ³Όμ •

jenkins μŠ€ν¬λ¦½νŠΈμ—μ„œ ν”Œλž˜κ·Έ(Flag) 파일 생성

λΉŒλ“œλœ μ†ŒμŠ€ 파일(.jar λ“±)이 μ„œλ²„λ‘œ λ„˜μ–΄μ˜¬ λ•Œ, ν•΄λ‹Ή λΉŒλ“œμ˜ 메타 데이터λ₯Ό 담은 ν…μŠ€νŠΈ νŒŒμΌμ„ ν•¨κ»˜ μ „λ‹¬ν•©λ‹ˆλ‹€. μ—¬λŸ¬ Job을 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ ν™˜κ²½λ³€μˆ˜λ₯Ό ν™œμš©ν–ˆμŠ΅λ‹ˆλ‹€.

# Jenkins λΉŒλ“œ ν›„ 처리 λ‹¨κ³„μ—μ„œ μ‹€ν–‰
$ echo ${JOB_NAME} > deploy_flag.txt

 

배포 μ‰˜ 및 와쳐(Watcher) λ§Œλ“€κΈ°

νƒ€κ²Ÿ μ„œλ²„μ—μ„œλŠ” νŠΉμ • μœ„μΉ˜μ— ν”Œλž˜κ·Έ 파일이 μžˆλŠ”μ§€ 2μ΄ˆλ§ˆλ‹€ ν™•μΈν•©λ‹ˆλ‹€. 파일이 κ°μ§€λ˜λ©΄ λ‚΄λΆ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³  ν”Œλž˜κ·Έ νŒŒμΌμ„ μ‚­μ œν•©λ‹ˆλ‹€. 이 μŠ€ν¬λ¦½νŠΈκ°€ μ„Έμ…˜ μ’…λ£Œ 후에도 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 계속 돌 수 μžˆλ„λ‘ nohup을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

# λ°±κ·ΈλΌμš΄λ“œμ—μ„œ 와쳐 슀크립트 μ‹€ν–‰
$ nohup sh /watcher.sh &

λͺ…λ Ήμ–΄ μ‹€ν–‰ μ‹œ μƒμ„±λ˜λŠ” nohup.out νŒŒμΌμ— echo λͺ…λ Ήμ–΄λ‘œ 배포 μ§„ν–‰ 상황을 좜λ ₯ν•˜λ„λ‘ κ΅¬μ„±ν•˜μ—¬, ν•„μš”μ‹œ 배포 둜그λ₯Ό μ‰½κ²Œ νŠΈλž˜ν‚Ήν•  수 있게 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

λ°±κ·ΈλΌμš΄λ“œ ν”„λ‘œμ„ΈμŠ€ 확인 및 μ’…λ£Œ

슀크립트λ₯Ό μˆ˜μ •ν•˜κ±°λ‚˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ‚΄λ €μ•Ό ν•  λ•ŒλŠ” μ•„λž˜μ™€ 같이 PIDλ₯Ό μ°Ύμ•„ κΉ”λ”ν•˜κ²Œ μ’…λ£Œν•©λ‹ˆλ‹€.

# μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€ ID 확인
$ ps -ef | grep deploy

# ν”„λ‘œμ„ΈμŠ€ κ°•μ œ μ’…λ£Œ
$ kill -9 [processId]

 

β–  κ²°κ³Ό 및 회고

μ΅œμ’… 배포 ν”„λ‘œμ„ΈμŠ€(μœ„: κ³Όκ±° / μ•„λž˜: ν˜„μž¬)

 

  1. 80% νš¨μœ¨μ„± ν–₯상: μˆ˜λ™μœΌλ‘œ μ§„ν–‰ν•˜λ˜ 5단계 배포가 Jenkins λΉŒλ“œ λ²„νŠΌ 클릭 ν•œ 번(1단계)으둜 λ‹¨μΆ•λ˜μ—ˆμŠ΅λ‹ˆλ‹€. νŒ€μ›λ“€μ΄ 인프라 μž‘μ—…μ— 쏟던 μ‹œκ°„μ„ μ˜¨μ „νžˆ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ°œλ°œμ— 집쀑할 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  2. μ•ˆμ •μ„± 및 λ³΄μ•ˆ κ°•ν™”: μ‚¬λžŒμ΄ 직접 μ„œλ²„μ— μ ‘μ†ν•΄μ„œ λͺ…λ Ήμ–΄λ₯Ό μΉ˜λŠ” 과정이 μ‚¬λΌμ§€λ‹ˆ 휴먼 μ—λŸ¬κ°€ μ™„μ „νžˆ μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€. λ”λΆˆμ–΄ λΆˆν•„μš”ν•œ SSH 원격 접속을 μ°¨λ‹¨ν•˜μ—¬ 사내 λ³΄μ•ˆ 정책도 μžμ—°μŠ€λŸ½κ²Œ μ€€μˆ˜ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ΅œμ‹  기술과 ν™”λ €ν•œ νˆ΄μ„ λ„μž…ν•˜λŠ” κ²ƒλ§Œμ΄ 정닡은 μ•„λ‹ˆλΌκ³  μƒκ°ν•©λ‹ˆλ‹€. λ•Œλ‘œλŠ” κ°•λ ₯ν•œ μ œμ•½ 쑰건 μ†μ—μ„œλ„ 'μ™œ 이 κΈ°μˆ μ΄μ–΄μ•Ό ν•˜λŠ”κ°€?'λ₯Ό κ³ λ―Όν•˜κ³ , 기본기에 μΆ©μ‹€ν•œ λŒ€μ•ˆμ„ μ°Ύμ•„λ‚΄μ–΄ λ™λ£Œλ“€μ˜ λΆˆνŽΈν•¨μ„ ν•΄μ†Œν•˜λŠ” κ³Όμ • μžμ²΄κ°€ κ°œλ°œμžλ‘œμ„œ 큰 μ„±μž₯이 λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λΉ„μŠ·ν•œ 폐쇄망 ν™˜κ²½μ—μ„œ λ ˆκ±°μ‹œ μ‹œμŠ€ν…œμœΌλ‘œ 고톡받고 계신 λΆ„λ“€κ»˜ 이 μž‘μ€ κ°œμ„ κΈ°κ°€ 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•