μ λ²μ λ 벨λ‘κ·Έμ νμ μ€ν¬λ¦½νΈ -μ»΄νμΌ μ λ΅- μμ devμ prodμ λΉλ μλλ₯Ό κ°μ νλ κ²°κ³Όλ₯Ό μ»μλ€. Github Actions CI prod build κΈ°μ€μΌλ‘ μ½ "32μ΄"μμ "14μ΄" μ λλ‘ κ°μ μ νμλ€.
νμ§λ§ μ΄κ±΄ λ 벨λ‘κ·Έμ CI build νμμ 보면 μμ£Ό μμ λΆλΆμ΄μκΈ° λλ¬Έμ λ€λ₯Έ λΆλΆλ€μ κ°μ μ΄ νμνλ€κ³ μκ°νλ€. μλ μ¬μ§μ 보μ
κ°μ νμλ, CI build νμμ 보면 μ½ "150s"μμ μ μ μλ€. μ΄λ€ λ¬Έμ μ λ€μ΄ μλμ§λ νλ νλ μλμμ λΆλ¦ΏμΌλ‘ μ΄ν΄λ³΄μ.
λ°±μλ, νλ‘ νΈμλ κ΅¬λΆ μμ΄ workflow
κ° λͺ¨λ νΈλ¦¬κ±°λμ΄ μ€νλλ€.
νλ‘ νΈμλ κ΄λ ¨ νμΌλ§ μμ λ νλ‘ νΈμλ PRμμ λ°±μλμ ν
μ€νΈμ μλνλΈ λΉλκ° μ€νλκ³ κ·Έ λ°λμ κ²½μ°μλ νλ‘ νΈμλμ λΉλκ° μ§νλμλ€. (μ¬κΈ°μ μκΈ°λ λΆμμ μΈ λ¬Έμ λ€λ κ½€ μμλ€.)
λͺ¨λ PRμ Dev Build
μ Prod Build
λ₯Ό μ€ννλ€.
κ°λ°μλ²μ λ°°ν¬λ develop λΈλμΉμ μ΄μμλ²μ λ°°ν¬λ main λΈλμΉμ PRμ κ°κ°μ buildλ§ μ€νλμ§ μκ³ , 무쑰건 λ κ°μ§ λΉλλ₯Ό λ€ νλ€.
μμ‘΄μ±μ λ€μ΄λ‘λνλ μκ°μ΄ λ§€μ° κΈΈλ€
μ 체 "150s" κ°λμμ "100s" μ λλ₯Ό μμ‘΄μ±μ λ€μ΄λ‘λνλλ° μ¬μ©νλ€.
CI κ³Όμ μμ λΉλλ§ νλ€
νλ‘ νΈμλ CI κ³Όμ μμ "λΉλ"λ§ νκ³ , μ΄λ―Έ νλ‘ νΈμλμμ μμ±ν "ν
μ€νΈ"λ€μ΄ μ ν ν¬ν¨μ΄ λμ΄μμ§ μμλ€.
μ μ νμ§ μμ Required Status Checks
μ§κΈκΉμ§ λΈλμΉ λ³΄νΈ κ·μΉ μ€ Required Status Checks
μλ "build", "test" λ§ ν¬ν¨λμ΄μμλ€. μ§κΈκΉμ§ λ°±μλλ μλνλΈ λΉλκ° μ€ν¨ν΄λ mergeκ° λ§νμμ§ μμμ νλ €κ³ νλ©΄ ν μ μμλ€.
μλμμ μ°¨λ‘λ‘ μ΄λ° λ¬Έμ λ€μ ν΄κ²°ν΄λ³΄μ!
μΌλ¨ νλ‘ νΈμλ CIμ μλ λ¬Έμ λ€λΆν° ν΄κ²°ν΄λ³΄κΈ°λ‘ νλ€.
κΈ°μ‘΄μλ νλ‘ νΈμ λͺ¨λ workflow
κ° frontBuild.yml
νμΌ νλμμ κ΄λ¦¬λκ³ μμλ€. μ΄λ€ λΈλμΉμ PRμ λ λ Έλμ λ°λΌ λ€λ₯Έ workflow
λ₯Ό νΈλ¦¬κ±°νλλ‘ νκΈ° μν΄μ front-dev.yml
, front-prod.yml
λ‘ λλ΄λ€.
"Github Actions"μ λμμ΄ κ°κ°μ λΈλμΉμ PRμ 보λμ λ μ΄λ€μ§λλ‘ yml νμΌλ μμ ν΄μ£Όμλ€. ν μ€νΈ κ²°κ³Ό, μνλ λμμ΄ μνλλ κ²μ νμΈν μ μμλ€.
λ€μμ μκ°μ΄ κ°μ₯ μ€λ걸리λ μμ‘΄μ± λ€μ΄λ‘λ μκ°μ μ€μ΄κΈ° μν΄ μμ‘΄μ±μ μΊμνκ³ , yarn install
μ μ€μ μ CI νκ²½μ λ§κ² λ°κΏμ£Όλ μμ
μ μ§ννλ€.
yarn install
yarn install --frozen-lockfile
yarn install
μ κΈ°λ³Έ λμμ yarn.lock
μ΄ μκ³ λͺ¨λ μ’
μμ±μ μΆ©μ‘±νκΈ°μ μΆ©λΆν κ²½μ°μ package.json
μ κΈ°λ‘λ μ νν λ²μ μ yarn.lock
μ΄ μ€μΉλκ³ , λ³κ²½λμ§ μλλ€.yarn.lock
μ΄ μκ±°λ, λͺ¨λ μ’
μμ±μ μΆ©μ‘±νκΈ°μ μΆ©λΆνμ§ μμ κ²½μ°, yarnμ package.json
μ μ μ½ μ‘°κ±΄μ μΆ©μ‘±νλ μ¬μ© κ°λ₯ν μ΅μ λ²μ μ μ°Ύκ³ , κ²°κ³Όλ₯Ό yarn.lock
νμΌμ κΈ°λ‘νλ€.yarn install --frozen-lockfile
μ λλ²μ§Έ μν©κ³Ό κ°μ κ²½μ° yarn.lock
νμΌμ μμ νμ§ μκ³ , μ
λ°μ΄νΈκ° νμν κ²½μ° μ€ν¨νλ€. κ΄λ ¨λ μ΄μμλ λμμμ§λ§ λ€λ₯Έ ν¨ν€μ§ 맀λμ βnpmβμ npm ci
μ κ°μ μν μ νλ€.
μ€μ λ‘ μ μ©ν΄λ³Έ κ²°κ³Ό jenkins λ° μ μ μλ μλ¬λ‘
frosen lockfile
μ€μ μ λΉμ₯μ μ¬μ©νκΈ° νλ κ² κ°λ€! μΌλ¨ λ€μ λλλ¦¬κ³ λ¬Έμ λ₯Ό μ°Ύμλ³Ό μμ μ΄λ€.
ν
μ€νΈ κ²°κ³Ό, μΊμλ μμ‘΄μ±μ μ¬μ©ν΄ Install Dependenies
κ³Όμ μ μλ΅ν΄μ λΉλ νμμ΄ "29s" κΉμ§ μ€μ΄λ κ²μ νμΈν μ μμλ€!
λ§μ§λ§μΌλ‘, jest
λ‘ μμ±ν μ λν
μ€νΈλ₯Ό CI κ³Όμ μ μΆκ°νλ€.
μλμ κ°μ΄ front-unit-test.yml
νμΌμ μμ±ν΄ λͺ¨λ λΈλμΉμμ PRμ΄ λ°μνλ©΄ νΈλ¦¬κ±°λμ΄ μ λν
μ€νΈ κ²°κ³Όκ° μ±κ³΅ν΄μΌλ§ mergeν μ μλλ‘ νλ€!
νλ‘ νΈμλ workflow
κ° μλ£λλ μκ°μ΄ "30s" κ°λμΌλ‘ λ§μ΄ μ€μμ§λ§, 무쑰건 λ°±μλ workflow
κ° κ°μ΄ μ€νλκΈ° λλ¬Έμ μΌμ° λλλ΄€μ μλ¬΄λ° μλ―Έκ° μμλ€. κ·Έλ¦¬κ³ μ μ΄μ νλ‘ νΈμλ PRμμ λ°±μλ workflow
κΉμ§ μ€νν μ΄μ κ° μλ€.
λ 벨λ‘κ·Έμ 리ν¬μ§ν 리μλ μ΅μλ¨μ frontend
, backend
ν΄λκ° μλ€.
μ΄λ€ ν΄λκ° μμ λλμ λ°λΌμ κ°μμ workflow
λ§ μ€ννλλ‘ μμ νλ€.
λ°±μλ, νλ‘ νΈμλμ CIλ₯Ό λΆλ¦¬νλκΉ μκΈ΄ λ¬Έμ λ λ 벨λ‘κ·Έ 리ν¬μ§ν 리μ λΈλμΉ λ³΄νΈ κ·μΉμ΄μλ€. λ 벨λ‘κ·Έμ Required Status Checks
μλ build
, test
κ° μμλ€
νμ§λ§ λ°±μλ workflow
μλ sonarqube-build
μ test
λΌλ jobsλ§ μμκΈ° λλ¬Έμ μμ§λ μμ build
λΌλ jobμ κΈ°λ€λ¦¬λλΌ mergeλ₯Ό ν μ μλ λ¬Έμ κ° λ°μνλ€. μ΄μ λν ν΄κ²°μ±
μ "Github Docs"μμ μ°Ύμ μ μμλ€.
ν΄λ΅μ λμΌν μ΄λ¦μ jobμ μΆκ°νκ³ , 무쑰건 μ±κ³΅νλλ‘ νλ κ²μ΄λ€.
μ¬μ€ λκ° μ‘°κΈ μ°μ°νμ§λ§, μμ§ λ€λ₯Έ λ°©λ²μ μ°Ύμ§λ λͺ»νλ€.
λ°±μλλ sonarqube-build
λ μ±κ³΅ν΄μΌνκΈ° λλ¬Έμ, Required Status Checks
μ μΆκ°ν΄μ£Όμλ€. νλ‘ νΈ workflow
μλ sonarqube-build
λΌλ jobμ΄ μκΈ° λλ¬Έμ μμ κ°μ μμ
μ λμΌνκ² ν΄μ€¬λ€.
μ, μ΄μ νλ‘ νΈ PRμ΄ μ¬λΌμμ λλ₯Ό μ΄ν΄λ³΄μ!
λͺ¨λ μμ μ΄ λλ¬λ€. μμμ κ°μ§κ³ μμλ λ¬Έμ λ€μ λͺ¨λ ν΄κ²°νλ€!