| μΌ | μ | ν | μ | λͺ© | κΈ | ν |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- python
- Kotlin
- μλ° μκ³ λ¦¬μ¦
- linux
- java μ½λ© ν μ€νΈ
- javascript
- GIT
- μλ°
- λ―Έκ΅λ°°λΉμ£Όν¬μ
- js
- μλ°μ€ν¬λ¦½νΈ
- μ½νλ¦°
- vue3
- kotlin algorithm
- λ°°λΉμ£Ό
- νλ‘κ·Έλλ¨Έμ€
- λ°±μ€ μ½νλ¦°
- kotlin μκ³ λ¦¬μ¦
- λ°±μ€
- μ½νλ¦° μ€ν
- Java
- pnpm
- CI/CD
- μκ³ λ¦¬μ¦
- μ½νλ¦° μκ³ λ¦¬μ¦
- λ―Έκ΅μ£Όμ
- Swift
- Vue.js
- νμ½ν
- νμ΄μ¬
- Today
- Total
π μ μ΄μ λ¨Έλ¦ΏμμΌλ‘
νμλ§ νκ²½μ λ κ±°μ CI/CD κ°μ κΈ°: μλ λ°°ν¬ 5λ¨κ³λ₯Ό 1λ¨κ³λ‘ μλννκΈ° λ³Έλ¬Έ
νμλ§ νκ²½μ λ κ±°μ CI/CD κ°μ κΈ°: μλ λ°°ν¬ 5λ¨κ³λ₯Ό 1λ¨κ³λ‘ μλννκΈ°
Space_Jin 2025. 1. 29. 13:14β λ°°κ²½: "μλ κ·Έλμ"
μ κ° μΌνκ³ μλ κΈμ΅ νμ¬μ ꡬνλμ΄ μλ κΈ°μ‘΄ 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) κ°μ§ λ°©μμ΄ μλμκΈ°μ, μμ€ν μμ μ±μ λν ν©νΈ 체ν¬κ° λ°λμ νμνμ΅λλ€.
- λΆν ν μ€νΈ λ° κ²μ¦: μ€ν¬λ¦½νΈ μ€ν ν 리λ μ€ top λͺ λ Ήμ΄λ₯Ό ν΅ν΄ μ€μκ° λ¦¬μμ€ μ μ μ¨μ λͺ¨λν°λ§νμ΅λλ€. 2μ΄ μ£ΌκΈ°λ‘ sleepμ μ£Όμ΄ κ²μ¬ν κ²°κ³Ό, ν΄λΉ νλ‘μΈμ€μ CPU μ μ μ¨μ 0.1% λ―Έλ§μΌλ‘ μμ€ν μ λ―ΈμΉλ μν₯μ΄ μ¬μ€μ μ λ‘μ κ°κΉλ€λ κ²μ νμΈνμ΅λλ€.
- 리μ€ν¬ λ²μ νμ : λ§μ νλ λ°μν μ μλ μ¬μ΄λ μ΄ννΈλ₯Ό κ³ λ €νμ¬, λκ³ κ° μλΉμ€κ° ꡬλλλ μ΄μ(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]
β κ²°κ³Ό λ° νκ³
μ΅μ’ λ°°ν¬ νλ‘μΈμ€(μ: κ³Όκ±° / μλ: νμ¬)

- 80% ν¨μ¨μ± ν₯μ: μλμΌλ‘ μ§ννλ 5λ¨κ³ λ°°ν¬κ° Jenkins λΉλ λ²νΌ ν΄λ¦ ν λ²(1λ¨κ³)μΌλ‘ λ¨μΆλμμ΅λλ€. νμλ€μ΄ μΈνλΌ μμ μ μλ μκ°μ μ¨μ ν λΉμ¦λμ€ λ‘μ§ κ°λ°μ μ§μ€ν μ μκ² λμμ΅λλ€.
- μμ μ± λ° λ³΄μ κ°ν: μ¬λμ΄ μ§μ μλ²μ μ μν΄μ λͺ λ Ήμ΄λ₯Ό μΉλ κ³Όμ μ΄ μ¬λΌμ§λ ν΄λ¨Ό μλ¬κ° μμ ν μ¬λΌμ‘μ΅λλ€. λλΆμ΄ λΆνμν SSH μ격 μ μμ μ°¨λ¨νμ¬ μ¬λ΄ 보μ μ μ± λ μμ°μ€λ½κ² μ€μνκ² λμμ΅λλ€.
μ΅μ κΈ°μ κ³Ό νλ €ν ν΄μ λμ νλ κ²λ§μ΄ μ λ΅μ μλλΌκ³ μκ°ν©λλ€. λλ‘λ κ°λ ₯ν μ μ½ μ‘°κ±΄ μμμλ 'μ μ΄ κΈ°μ μ΄μ΄μΌ νλκ°?'λ₯Ό κ³ λ―Όνκ³ , κΈ°λ³ΈκΈ°μ μΆ©μ€ν λμμ μ°Ύμλ΄μ΄ λλ£λ€μ λΆνΈν¨μ ν΄μνλ κ³Όμ μμ²΄κ° κ°λ°μλ‘μ ν° μ±μ₯μ΄ λλ κ² κ°μ΅λλ€.
λΉμ·ν νμλ§ νκ²½μμ λ κ±°μ μμ€ν μΌλ‘ κ³ ν΅λ°κ³ κ³μ λΆλ€κ» μ΄ μμ κ°μ κΈ°κ° λμμ΄ λκΈ°λ₯Ό λ°λλλ€.