πŸ“‰ Github Actions CI ν”„λ‘œμ„ΈμŠ€ κ°œμ„ 

thumb_hyeokΒ·2022λ…„ 10μ›” 31일
2

πŸ”₯ WoowaCourse

λͺ©λ‘ 보기
9/10

πŸ€” λ¬Έμ œκ°€ 뭐야?

μ €λ²ˆμ— 레벨둜그의 νƒ€μž…μŠ€ν¬λ¦½νŠΈ -컴파일 μ „λž΅- μ—μ„œ 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 κ°œμ„ ν•˜κΈ°

일단 ν”„λ‘ νŠΈμ—”λ“œ CI에 μžˆλŠ” λ¬Έμ œλ“€λΆ€ν„° ν•΄κ²°ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

Dev Build, Prod Build

κΈ°μ‘΄μ—λŠ” ν”„λ‘ νŠΈμ˜ λͺ¨λ“  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ν•  수 μžˆλ„λ‘ ν–ˆλ‹€!


🏘️ λ°±μ—”λ“œ, ν”„λ‘ νŠΈμ—”λ“œ CI 뢄리

ν”„λ‘ νŠΈμ—”λ“œ 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이 μ˜¬λΌμ™”μ„ λ•Œλ₯Ό μ‚΄νŽ΄λ³΄μž!

λͺ¨λ“  μž‘μ—…μ΄ 끝났닀. μœ„μ—μ„œ 가지고 μžˆμ—ˆλ˜ λ¬Έμ œλ“€μ„ λͺ¨λ‘ ν•΄κ²°ν–ˆλ‹€!

  • λ°±μ—”λ“œ, ν”„λ‘ νŠΈμ—”λ“œ ꡬ뢄 없이 workflow κ°€ λͺ¨λ‘ νŠΈλ¦¬κ±°λ˜μ–΄ μ‹€ν–‰λœλ‹€.
  • λͺ¨λ“  PR에 Dev Build 와 Prod Build λ₯Ό μ‹€ν–‰ν•œλ‹€.
  • μ˜μ‘΄μ„±μ„ λ‹€μš΄λ‘œλ“œν•˜λŠ” μ‹œκ°„μ΄ 맀우 κΈΈλ‹€
  • CI κ³Όμ •μ—μ„œ ν…ŒμŠ€νŠΈ 없이 λΉŒλ“œλ§Œ ν•œλ‹€
  • μ μ ˆν•˜μ§€ μ•Šμ€ Required Status Checks

πŸ“– μ°Έκ³  자료

profile
μš°μ•„ν•œν…Œν¬μ½”μŠ€ 4κΈ° μ›Ή ν”„λ‘ νŠΈμ—”λ“œ

0개의 λŒ“κΈ€