π‘ λ³Έ λ¬Έμλ 'κΈ°μ μ CI/CDκ° νμν 10κ°μ§ μ΄μ 'λΌλ κΈμ λ΄μ©μ΄ μ’μ μ€ν¬λ© ν΄μ¨ κΈμ λλ€.
ν΄λΉ λ΄μ©μ κΈ°μ μμ CI/CDλ₯Ό μ¬μ©νλ μ΄μ λ° μ₯μ μ λν΄ μ 리λμ΄ μμΌλ μ°Έκ³ νμκΈ° λ°λλλ€.
μ΄μ λ κΈ°μ μ΄ μ 곡νλ λͺ¨λ μ ν, μλΉμ€μμ μννΈμ¨μ΄λ₯Ό λΆλ¦¬ν μ μλ μλμ΄λ€. κ²½μμ 체μ κ³ κ°λ€, ν¬μμ λ° μ§μλ€ λͺ¨λ νμ¬μμ λ§λ μ νμ μ κΈ°μ μΌλ‘ μ λ°μ΄νΈλλ μννΈμ¨μ΄λ₯Ό μꡬνκ³ μλ€.
λ°λΌμ μ΄λ¬ν νμ€(λ° λ°λΈμ΅μ€(DevOps))μ μ§μνκ³ , κ°λ₯ν κ°μ₯ ν¨μ¨μ μΈ μ§μμ μΈ ν΅ν© λ° μ 곡 νμ΄νλΌμΈμ λ§λλ λ° ν¬μν΄μΌ νλ€. μ΄λ¬ν μ λ΅μ κ²½μμ§μκ² μ΄λ»κ² μ€λν΄μΌ ν κΉ? λ¨Όμ κ²½μμ¬λ₯Ό μΈκΈνλ κ²μΌλ‘ μμν μ μλ€. κ²½μμ¬λ€μ μ΄λ―Έ μ§μμ μΈ ν΅ν© λ° μ§μμ μΈ μ 곡(CI/CD: Continuous Integration/Continous Delivery)μ νμ©νκ³ μμ κ°λ₯μ±μ΄ λλ€. λ§μ½ κ·Έλλ λ ꡬ체μ μΌλ‘ μ€λν μ΄μ κ° νμνλ€λ©΄, κΈ°μ μ CI/CDκ° νμν 10κ°μ§ μ΄μ λ₯Ό μ μνλ©΄ λλ€.
1. CI/CDλ 무μμΈκ°?
CI/CDλ μλν κΈ°λ₯μ μ¬μ©νμ¬ μ½λ κ°λ° λ° μ 곡μ νκΈ°μ μΌλ‘ κ°μνν μ μλ 2λ¨κ³μ νλ‘μΈμ€λ€. λ¨Όμ CIλ μμ€ μ½λ ν΅ν© λ° λ²μ κ΄λ¦¬ λ±μ κ°λ°μ μμ μ λ³΄λ€ ν¨μ¨μ μΌλ‘ μνν μ μλλ‘ ν¨μΌλ‘μ¨ μννΈμ¨μ΄λ₯Ό λ³΄λ€ μ μνκ² μ΄μνκ²½μ λ°°μΉν μ μλλ‘ ν΄μ£Όλ μ¬μ λ¨κ³λ€. μ¬λ¬ κ°λ°μκ° λμμ μ ν리μΌμ΄μ κ°λ° κ΄λ ¨ μ½λ©μ νλλΌλ, μλ‘μ΄ μ½λ λ³κ²½ μ¬νλ€μ΄ λΉλ(μ»΄νμΌ) λ° ν μ€νΈλμ΄ μ κΈ°μ μΌλ‘ 곡μ 리ν¬μ§ν 리(μ 보 μ μ₯μ)μ ν΅ν©λλ€. λ°λΌμ λͺ¨λ κ°λ°μ΄ μ’ λ£λ μμ λΆν° μ½λ νμ§ κ΄λ¦¬λ₯Ό μμνλ κΈ°μ‘΄ λ°©μμ λ¨μ (ν μ€νΈ μ μμμΉ λͺ»ν μΆ©λ λ°μ)μ΄ ν΄μλλ€.
CIμ λ€μ μμ μΌλ‘ CDλ μννΈμ¨μ΄ ν μ€νΈ λ° λ°°ν¬λ₯Ό μλννλ€. μλ°ν ꡬλΆνλ©΄ μ΄ CDλ 2κ°μ§λ‘ λλλ€. λ¨Όμ μ§μμ μΈ μ 곡(Continuous Delivery)μ ν΅ν΄ CIμμ μ ν¨μ± κ²μ¦μ΄ λλ μ½λλ€μ μ μ₯μμ μλμΌλ‘ λ¦΄λ¦¬μ€ νλ€. μ΄λ₯Ό ν΅ν΄ μ΄μνμ λ³κ²½λ μ½λλ€μ μ μ₯μμμ κ°μ Έμμ μ ν리μΌμ΄μ (νλ‘λμ νκ²½)μ μλμΌλ‘ λ°°ν¬ν μ μκ² λλ€. κ°λ°νκ³Ό μ΄μν μ¬μ΄μ μμ¬μν΅μ΄ μ’ λ μνν΄μ§λ κ²μ΄ μ₯μ μ΄λ€.
μ΅μ’ λ¨κ³λ μ§μμ μΈ λ°°ν¬(Continuous Deployment)λ€. μ¦, μννΈμ¨μ΄μ λ³κ²½ μ¬νμ΄ ν μ€νΈλ₯Ό ν΅κ³Όνμλ§μ μλμΌλ‘ μ΅μ’ μ¬μ©μμκ² λ°°ν¬λλ€. λ°λΌμ μ¬μ©μμ νΌλλ°±λ μ¦κ° λ°μνκΈ° μ¬μμ§λ€.
νλλ‘ μ΄μ΄μ§ CI/CD νμ΄νλΌμΈμ μμνλ©΄ μ½λ€. κ°λ°μλ€μ΄ μ½λλ₯Ό μ§μμ μΌλ‘ λΉλ λ° ν μ€νΈλ₯Ό νλ©°, κ²μ¦λ μμ€λ μ¦μ μ ν리μΌμ΄μ μΌλ‘ μ¬μ©μμκ² λ°°ν¬κ° λλ κ²μ΄λ€. μ΄μ²λΌ CI/CDκ° κ²°ν©λλ©΄, κ°λ ₯ν μ΅μ μννΈμ¨μ΄ κ°λ° μμ§μ΄ λλ©°, μ΄λ κΈ°μ λ€μκ² μμ²λ μ΄μ μ μ 곡νλ€.
2. CI/CDλ λΉμ¦λμ€μ μ΄λ ν μ΄μ μ μ 곡νλκ°?
CI/CDλ λΉμ¦λμ€μ μλ§μ μ΄μ μ μ 곡νλ€. CI/CDλ₯Ό μ±νν΄μΌ νλ 10κ°μ§ μ΄μ λ λ€μκ³Ό κ°λ€.
νμν μ½λ νμ§ λ³΄μ₯
κΉλ©μ 2021λ κΈλ‘λ² λ°λΈμΉμ΅μ€ μ€λ¬Έμ‘°μ¬(Global DevSecOps Survey) μ°Έκ°μλ€μ λ°λΈμ΅μ€λ₯Ό μνν΄μΌ νλ κ°μ₯ ν° μ΄μ λ μ½λ νμ§μ μν κ²μ΄λ©°, λ°λΈμ΅μ€λ₯Ό μν΄ νμ κ°μ₯ νμν νλ‘μΈμ€λ CI/CDλΌκ³ μλ΅νλ€. CI/CD νμ΄νλΌμΈμ ν μ€νΈ μλνλ₯Ό μ 곡νκΈ° λλ¬Έμ κ°λ°μλ€μ κ±°μ μ€μκ°μΌλ‘ μ½λ λ¬Έμ λ₯Ό νμ ν μ μλ€. μ΄λ¬ν ‘μ μν μ€λ₯ ν΄κ²°(Failing Fast)’ κ°λ μ ν΅ν΄ νμ λ²κ·Έκ° μλ μ½λλ‘ μΈν΄ μκ°μ΄λ μμμ λλΉνμ§ μμλ λκ³ , κ°λ°μλ λ€λ₯Έ νλ‘μ νΈλ₯Ό ꡬλν λ λμλ ‘μμ ’ μμ²μ μλ¬λ¦¬μ§ μμλ λλ€. μκ°κ³Ό λΉμ©μ μ μ½ν μ μμΌλ©°, μ€λ‘μ§ μ½λ©μλ§ μ§μ€ν μ μλ€.
λ¦΄λ¦¬μ€ μλλ₯Ό λ¨μΆνμ¬ λ μ μνκ² μ 곡
CI/CD μ΄μ μ λν΄ λ κΆκΈν μ¬λμ΄λΌλ©΄ κΈλ‘λ² κΈμ΅νμ¬μΈ 골λλ§μμ€(Goldman Sachs)μ μ±κ³΅μ¬λ‘λ₯Ό μ΄ν΄λ³΄λ κ²μ΄ μ’λ€. μ΄ νμ¬μ κΈ°μ λΆμλ 2μ£Ό λ§λ€ 1κ°μ μ½λλ₯Ό λΉλνμ§λ§, μ΄ν ν루 1,000κ° μ΄μμΌλ‘ λμ΄λ¬λ€. ν΅ν© CI/CD νμ΄νλΌμΈμ μννΈμ¨μ΄ λ¦΄λ¦¬μ€ μλλ₯Ό λμ΄λ λ° μμ΄ ν°λ³΄ μμ§κ³Όλ κ°λ€. μ½λλ₯Ό λ 빨리 릴리μ€νκ³ , λ λ§μ μλ‘μ΄ μ½λλ₯Ό κ°λ°ν μ μκ² λ¨μ λ°λΌ λμμ΄ λ¦΄λ¦¬μ€κ° κ°λ₯νλ€. μ±κ³΅μ μΌλ‘ CI/CD νμ΄νλΌμΈμ΄ μλνλ©΄, κ²°κ΅ κΈ°μ μ°¨μμμλ κ³ λΉμ©μ κ°λ°μ 리μμ€λ₯Ό μ΅λν νμ©ν μ μμ΄ μ΄λμ μ»μ μ μλ€.
CI/CD νμ΄νλΌμΈ: μλνλ‘ λΉμ© μ κ°
μννΈμ¨μ΄ κ°λ° νλ‘μΈμ€μ μ¬λμ κ°μ μ΄ νμ μκ² λλ©΄, μκ°κ³Ό λΉμ©μ μ κ°ν μ μλ€. μ΄λ¬ν μ΄μ λ‘ μ±κ³΅μ μΈ λ°λΈμ΅μ€ μνμ¬λ‘μ ν λλ λ°λ‘ μλνλ€. CI/CDλ νΈλμ€ν(μμ μ λ³κ²½: κ°λ° νμ μ€ μ΄λ€ μ¬λμ΄ λ€λ₯Έ λλ£μκ² λ€μν μ 무 κ΄λ ¨ μ 보 λλ μ± μμ μ΄μ νλ κ². μλ₯Ό λ€μ΄, κ³ κ°μ΄ μμ μ¬μμκ² λμ¦λ₯Ό μ νν μΈκΈνλ€. μμ μ¬μμ μ΄λ₯Ό κ°λ°μμκ², κ°λ°μλ ν μ€ν°μκ², ν μ€ν°λ μ΄μνμκ² μλ¦¬κ² λλ λ° κ° λ¨κ³λ§λ€ μλμ μ λ³΄κ° μμ€λλ€.), μμ€ μ½λ κ΄λ¦¬, λ²μ μ μ΄ μμ€ν λ° λ°°ν¬ λ©μ»€λμ¦μ λ¬Όλ‘ , λ§μ ν μ€νΈ κΈ°λ₯μ μλννλ€.
μ΄ μ€μμλ ν μ€νΈκ° κ°μ₯ μ€μνλ€. 2021λ κΉλ© μ€λ¬Έμ‘°μ¬μ λ°λ₯΄λ©΄, ν μ€νΈκ° λ¦΄λ¦¬μ€ μ§μ°μ κ°μ₯ ν° μμΈμΌλ‘ νμΈλμλ€. μ§μ°λ 릴리μ€λ λΉμ©κ³Ό λΈλλ©, ν보 λ° νν λ±μ μΈ‘λ©΄μμ λΉμ¦λμ€μ μν₯μ λ―ΈμΉ λΏλ§ μλλΌ μ μν μμ₯ μΆμμ μμ‘΄νλ κΈ°μ μκ²λ μΉλͺ μ μ΄λ€. μ ν΅μ μΌλ‘ μννΈμ¨μ΄ ν μ€νΈλ μλμΌλ‘ μ§νλμκ³ , μμ²λκ² λ§μ μκ°μ΄ μμλμκΈ° λλ¬Έμ κΈ°μ λ€μ 1λ μ νλ λ² μ λλ§ μλ‘μ΄ μ½λλ₯Ό λ¦΄λ¦¬μ€ νλ κ²½μ°κ° λ§μλ€. λ°λ©΄ μ€λλ κΈ°μ λ€μ μμ 릴리μ€κ° κ°λ₯ν΄μΌ νλ©°, μ΄λ₯Ό μν΄μλ μλνλ μννΈμ¨μ΄ ν μ€νΈκ° λ§€μ° μ€μνλ€.
μ€λ₯ 격리
μννΈμ¨μ΄ κ°λ° λΆμΌμμ λ°λΈμ΅μ€ λ° CI/CDκ° μ£Όλͺ©λ°κΈ° μ μλ, κ°λ°νμ΄ μ½λμ λ¬Έμ κ° μλ€λ κ²μ μμλ λ¬Έμ κ° λ°μν μ νν μμΉλ₯Ό νμ νλ λ°λ μ΄λ €μμ κ²ͺμλ€. κ·Έλ°λ° CI/CDμ μλνλ ν μ€νΈλ‘ μΈν΄ μν©μ΄ λ¬λΌμ‘λ€. κ°λ°μλ μ½λ μ€λ₯λ₯Ό μ½κ² μλ³ν λ€μ, μ΄λ₯Ό 격리ν¨μΌλ‘μ¨ μμ°μ±μ ν¬κ² ν₯μμν¬ μ μκ² λμλ€.
κ°μνλ λ‘€λ°±(μ΄μ λ²μ λλ리기)
κ°λ°μλ CI/CD νμ΄νλΌμΈμ ν΅ν΄ μ€λ₯λ₯Ό μ μνκ² ν΄κ²°νκ³ , ν¨μ¬ λ λΉ λ₯΄κ² 볡ꡬν μ μλ€. μ΄λ μ½λλ₯Ό μ΄μνκ²½μΌλ‘ μ ννκ³ , λ¬Έμ κ° μμΌλ©΄ λ‘€λ°±νλ©΄ λλ κ°λ¨ν νλ‘μΈμ€μ΄λ€. μ½λλ₯Ό μ½κ² λ‘€λ°±ν μ μλ κΈ°λ₯μ νμ μκ°κ³Ό μλμ§, 리μμ€λ₯Ό μ μ½νκ³ , λ¬Έμ κ° μλ μ½λλ₯Ό λ³΄λ€ μ μνκ² μμ ν μ μλλ‘ ν΄μ€λ€.
μ§μμ μΈ νΌλλ°±
λ°λΈμ΅μ€ νλ«νΌμ μΌλΆλ‘ λμνλ ν΅ν© CI/CD νλ‘μΈμ€λ λΉμ¦λμ€ μ΄ν΄κ΄κ³μλ€μ λΉλ‘―ν΄ νμ λͺ¨λ μ¬λλ€μ΄ λ¬΄μ¨ μΌμ΄ μΌμ΄λκ³ , μ΄λμμ μΌμ΄λλμ§, κ·Έλ¦¬κ³ λ¬΄μμ΄ μλͺ»λμλμ§ νμΈν μ μλ λ°©λ²μ μ 곡νλ€. μ΄κ²μ λ¨μν κ²μ²λΌ λ€λ¦΄ μ μμ§λ§, μ€μ λ‘ μννΈμ¨μ΄ κ°λ°μμμ μ±κΈ μλμ°(νν©μ ν κ³³μμ νμ νλ λ°©μ)λ κ±°μ νμ μ μ΄λΌ ν μ μλ€.
κ³Όκ±°μλ μ¬μ©νλ ν΄μ΄ λ무 λ§μκΈ° λλ¬Έμ νλ‘μ νΈ κ΄λ¦¬μκ° μ¬λ¬ λΆλΆλ€μ μ΄ν΄λ΄μΌ νκ³ , μ¬λ¬ μ¬λλ€μκ² μν μ λ°μ΄νΈλ₯Ό μμ²ν΄μΌ νλ€. μ΄λ¬ν μν©μμ κ°λ°μμ μ΄μ μ λ¬Έκ°λ€μ λ λμ κ²°κ³Όλ₯Ό μ»μ§ λͺ»νκ³ , νΉν λ¬Έμ κ° λ°μνλ©΄, μ΄λ μκ°κ³Ό 리μμ€ λλΉλ₯Ό μ΄λνλ€.
μ΅μ μ ν¬λͺ μ±κ³Ό μ± μμ±
CI/CD νμ΄νλΌμΈμ μ§μμ μΈ νΌλλ°±μ ν΅ν΄ μ 체 μννΈμ¨μ΄ κ°λ° νλ‘μΈμ€λ₯Ό λΉμ¦λμ€ μΈ‘λ©΄μμ μμ ν ν¬λͺ νκ² μ²λ¦¬νλ€. μ ν κ΄λ¦¬μλ νλ‘μ νΈ μνλ₯Ό ν λμ νμΈνκ³ , νμμ λ°λΌ μ± μ μμ¬λ₯Ό μΆμ ν μ μλ€.
MTTR(Mean Time to Resolution, νκ· ν΄κ²° μκ°) κ°μ
CI/CD νμ΄νλΌμΈμ΄ μ 곡νλ κ°μμ± λλΆμ λ°λΈμ΅μ€ νμ λ¬Έμ λ₯Ό μ μνκ² νμ νκ³ , λΉ λ₯΄κ² ν΄κ²°ν μ μλ€. λ¬Έμ λ₯Ό μ μνκ² ν΄κ²°νλ λ₯λ ₯μ ν΅μ¬ κ°λ° μ§νμΈ MTTR(Mean Time to Resolution)μ μ£Όμ μμμ΄λ€. MTTRμ΄ μ’μμλ‘ λ°λΈμ΅μ€ νμ λμ± ν¨μ¨μ μΌλ‘ μμ νκ³ , λ 빨리 μννΈμ¨μ΄λ₯Ό μΆμν μ μμΌλ©°, μ΄λ¬ν MTTRμ λΉμ¦λμ€ μμ΅μ μ§μ μ μΈ μν₯μ λ―ΈμΉλ€.
Metrics(μ§ν) λ°μ΄ν° λͺ¨λν°λ§
νκ³Ό λΉμ¦λμ€ μΈ‘λ©΄μμλ μ½λκ° μ€μ νκ²½μμ μ΄λ»κ² λμνλμ§ μμμΌ νμ§λ§, κΈ°μ‘΄ μννΈμ¨μ΄ κ°λ° μνμ¬λ‘μμλ μ΄λ₯Ό λͺ¨λν°λ§ν λ§ν ν΅κ³ μ§νκ° μλ κ²½μ°κ° λ§μλ€.(μλ₯Ό λ€μ΄ λ°λΈμ΅μ€ νν©μ νμ νλ λ° λμμ μ£Όλ μ§νμλ 리λ νμ, λ°°ν¬ λΉλ, λ³κ²½ μ€ν¨μ¨, νκ· λ³΅κ΅¬ μκ° λ±μ΄ μλ€.) μ΄μμ μΈ νκ²½μ΄λΌλ©΄ νμ΄ λ¨Όμ μ½λ λ¬Έμ λ₯Ό νμ νκ³ , μ΅μ’ μ¬μ©μκ° μ΄λ₯Ό μΈμνκΈ° ν¨μ¬ μ μ λ‘€λ°±ν μ μμ΄μΌ νλ€. CI/CD νμ΄νλΌμΈμ λ€μν μ§νμ λν μ§μμ μΈ νΌλλ°±μ μ 곡νμ¬ μ΄μμ μΈ νκ²½μ μ€νν μ μλ€. μ λλ‘ λμνμ§ μλ λ²κ·Έκ° λ§μ μ½λ λ° μ ν리μΌμ΄μ μ μνλ κΈ°μ μ μκΈ° λλ¬Έμ μ΄λ¬ν μ§ν λ°μ΄ν°μ λν μ‘μΈμ€λ λ¨μν μκ°λ§ μ μ½νλλ° κ·ΈμΉμ§ μλλ€.
λ°±λ‘κ·Έμ μ€μνμ§ μμ κ²°ν¨ κ°μ
CI/CDλ μκ°κ³Ό λΉμ©μ μ κ°μμΌμ€λ€. μ΄μ κ°λ°μλ μκ°μ΄ λΆμ‘±νμ¬ κ·Έλμ μμ ν μ μμλ μ€λλ μ½λλ€μ λ λͺ ννκ³ ν¨μ¨μ μΌλ‘ λ§λλ μμ μ΄ κ°λ₯νκ² λλ€. μ¦ κ°λ°μλ€μ΄ κΈ°μ‘΄μ μ²λ¦¬νκΈ° κ³€λνλ λ°±λ‘κ·Έ(κ²°κ΅ λκ° μκ°μ λ°λ‘ λΌ μ μλ κ°μ μ΄μ λ‘ λ°±λ‘κ·ΈλΌκ³ λΆλ₯Έλ€.) λ° μ¬μν κ²°ν¨μ λν΄μλ μμ ν μ μλ€λ μμ΄λμ΄λ λ°λΈμ΅μ€μ CI/CDκ° νμ κ°μ Έμ¨ κ²μ 체μΈμ μ΄λ€.
IT κΈ°μ κ³ κ°μ¬μ κ²½μμ§λ€μ΄ λ§μ΄λ€ κΆκΈν΄νλ λΆλΆ μ€ νλκ° λ°λ‘ CI/CDμ μ€μμ±μ΄λ€. CI/CDλ₯Ό λμ νκ² λλ©΄ κ°λ°λΆν° μ ν리μΌμ΄μ λ°°ν¬κΉμ§μ κ³Όμ μ΄ μ μνλ€. μ½λ λΉλμ νμλ λ§μ λ° λμμ 보μ ν μ€ν κ³Ό μ¬μ©μμ νΌλλ°±κΉμ§ λ°μλλ€.
λλ€λ₯Έ μ₯μ λ μκ°νλ©° μ΄ κΈμ λ§μΉκ³ μ νλ€. μ΅κ·Ό javaμ λΉνμ λ Έλ €μ Log4jλΌλ μ»΄ν¨ν° μμ¬μ μ΅μ μ μ·¨μ½μ κ³΅κ²©μ΄ λ°μν μ μ΄ μλ€. CI/CD νμ΄νλΌμΈμ΄ μλ κΈ°μ λ€μ ‘μ΄λ μ§μ ’μ΄ κ³΅κ²© λΉνλ μ§ νμ νκΈ°λ μ½μ§ μμλ λ°λ©΄μ, 미리 ꡬμΆνλ κΈ°μ λ€μ κ²½μ° μ μνκ² νμ ν, μ’ μμ±(Dependency) νλͺ©μ μ·¨μ½μ μ λΉ λ₯΄κ² λμμ΄ κ°λ₯νλ€. μ μμ μΈ κ°λ° μ¬μ΄ν΄μ΄ νμ μ μ§κ° κ°λ₯νλ€.
μ°Έκ³
- [Blog] κΈ°μ μ CI/CDκ° νμν 10κ°μ§ μ΄μ : https://it.donga.com/101955/