
μ λ² μ€κΈ νλ‘μ νΈμ μ΄μ΄μ μ΄λ² κ³ κΈ νλ‘μ νΈμμλ
Github Actions(κΉν μ‘μ )λ₯Ό μ¬μ©νκΈ°λ‘ νλ€. μ λ² νλ‘μ νΈμμλ νμμ΄ μ μ©ν μ½λ κ·Έλλ‘ μ½κ³ λμ΄κ°μ§λ§, μ΄λ²μλ κΉν μ‘μ μ΄ λ¬΄μμΈμ§ μ νν μ§κ³ λμ΄κ°λ©΄ μ’μ κ² κ°μμ 곡λΆν΄λ΄€λ€!
GitHub Actionsλ λΉλ, ν
μ€νΈ λ° λ°°ν¬ νμ΄νλΌμΈμ μλνν μ μλ CI/CD(μ§μμ ν΅ν© λ° μ§μμ μ λ¬) νλ«νΌμ
λλ€. λ ν¬μ§ν 리μ λν λͺ¨λ ν μμ²μ λΉλ λ° ν
μ€νΈνκ±°λ λ³ν©λ ν μμ²μ νλ‘λμ
μ λ°°ν¬νλ μν¬νλ‘μ°λ₯Ό μμ±ν μ μλ€.
GitHubλ μν¬νλ‘μ°λ₯Ό μ€ννκΈ° μν Linux, Windows λ° macOS κ°μ λ¨Έμ μ μ 곡νλ©°, μ체 λ°μ΄ν° μΌν° λλ ν΄λΌμ°λ μΈνλΌμμ μ체 νΈμ€ν
μ€νκΈ°λ₯Ό νΈμ€ν
ν μλ μλ€.
https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions#overview
μ¬λ¬ κ°μ JobμΌλ‘ ꡬμ±λκ³ , Eventμ μν΄ νΈλ¦¬κ±°λ μ μλ μλνλ νλ‘μΈμ€λ₯Ό λ§νλ€.
Workflows(μν¬νλ‘μ°)λ μ μ₯μμgithub/workflows μ YAML, YML νμΌλ‘ μμ±λκ³ , κ°κ° μλ‘ λ€λ₯Έ μμ
μ μννλ μ¬λ¬ κ°μ μν¬νλ‘μ°κ° μμ μ μλ€.
μν¬νλ‘μ°λ₯Ό νΈλ¦¬κ±°νλ μ μ₯μμ νΉμ νλμ΄λ κ·μΉμ λ§νλ€.
(ex. pr μμ±, μ΄μ μμ±, μ»€λ° νΈμ λ±)
λμΌν runnerμμ μ€νλλ μν¬νλ‘μ°μ μΌλ ¨μ λ¨κ³(steps)λ€μ λ§νλ€.
κ° λ¨κ³λ μ€νλ μ μ€ν¬λ¦½νΈμ΄κ±°λ μ€νλ actionλ€μ΄λ€. stepsλ μμλλ‘ μ€νλλ©° μλ‘ μ’
μλλ€.
(ex. μ ν리μΌμ΄μ
μ λΉλνλ λ¨κ³, λΉλλ μ ν리μΌμ΄μ
μ ν
μ€νΈνλ λ¨κ³ λ±)
κΈ°λ³Έμ μΌλ‘ Jobμ μλ‘ λ³λ ¬λ‘ μ€νλμ§λ§, μ’
μμ μΌλ‘ μ€ννκ² κ΅¬μ±ν μ μλ€.
볡μ‘νμ§λ§ μμ£Ό λ°λ³΅λλ μμ
μ μννλ κΉν μ‘μ
νλ«νΌμ© μ¬μ©μ μ§μ μ ν리μΌμ΄μ
μ λ§νλ€. Actionsλ₯Ό μ¬μ©νλ©΄ μν¬νλ‘μ° νμΌμ μμ±λλ λ°λ³΅μ μΈ μ½λμ μμ μ€μ΄λλ° λμμ΄ λλ€.
μν¬νλ‘μ°κ° νΈλ¦¬κ±°λ λ μν¬νλ‘μ°λ₯Ό μ€ννλ μλ²λ₯Ό λ§νλ€. κ°κ°μ runnerλ ν λ²μ νλμ jobμ μ€νν μ μλ€. κΉνμ μν¬νλ‘μ°λ₯Ό μ€ννκΈ° μν Ubuntu Linux, Microsoft Windows λ° macOS μ€νκΈ°λ₯Ό μ 곡νλ€.
name: ci
on: [push, pull_request]
jobs:
run-lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Cache node modules
uses: actions/cache@v3
id: cache
with:
path: node_modules
key: npm-packages-${{ hashFiles('**/package-lock.json') }}
- name: Install the project dependencies
if: steps.cache.outputs.cache-hit == false
run: npm ci
- name: Build
run: npm run build
- name: action-discord
uses: sarisia/actions-status-discord@v1
if: failure()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
content: '<@&1192747539124977736> ${{ github.actor }} νμΈν΄μ£ΌμΈμ! ( γ£ β’βαβ’β )γ'
title: βοΈ failed βοΈ
color: FF0000
username: GitHub Actions
- run: echo '${{github.actor}}λ μλ¬ νμΈ νμΈν΄μ£ΌμΈμ ( γ£ β’βαβ’β )γ'
κΉν λ νμ§ν 리μ Actions νμ νμλ μν¬νλ‘μ° μ΄λ¦μ΄λ€.
name: ci
μ΄ μν¬νλ‘μ°μ λν νΈλ¦¬κ±°λ₯Ό μ§μ νλ€. μ°λ¦¬λ νΈμμ prμ μ¬λ¦΄ λ μν¬νλ‘μ° μ€νμ΄ νΈλ¦¬κ±° λ μ μλλ‘ μ€μ νλ€.
on: [push, pull_request]
run-lint -> ν΄λΉ jobμ μ΄λ¦
runs-on: ubuntu-latest
-> Jobμ΄ μ΅μ λ²μ μ Ubuntu Linux μ€νκΈ°μμ μ€νν μ μλλ‘ μ€μ νλ€.
jobs:
run-lint:
runs-on: ubuntu-latest
steps:
- ...
- ...
Gitμ 체ν¬μμμ κΉν μ‘μ
μ
μ₯μμ λ°λΌλ³΄λ©΄ κΉνμ μ½λ λ νμ§ν 리μ μ¬λ €λ μ½λλ₯Ό CI μλ²λ‘ λ΄λ €λ°μ νμ νΉμ λΈλμΉλ‘ μ ννλ νμλΌκ³ ν μ μλ€.
κΉν μ‘μ
μμ μ²λ¦¬λλ λͺ¨λ μμ
μ μ΄ checkout λ¨κ³λΆν° μμνλ―λ‘ κΉνμμλ μ΄ κ³Όμ μ λ¬Άμ΄μ μ‘μ
μΌλ‘ μ 곡νκ³ μλ€.
steps:
- name: Checkout
uses: actions/checkout@v3
μ΄ λ¨κ³μμλ νΉμ Node.js λ²μ μ μ€μΉν μ μλλ‘ νλ actionμ μ 곡νλ€.
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
-> μ°λ¦¬λ .nvmrc νμΌμ μ¬μ©νκΈ° λλ¬Έμ μλμ κ°μ΄ λ°κΏ μ μμ κ² κ°λ€
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
cache: npm
npm ν¨ν€μ§λ μ΅μ΄μ ν λ²λ§ μ€μΉνλ©΄ λμ§λ§, νμ μλ‘κ² μ
μ
λλ CI μλ²μμλ λͺ¨λ npm ν¨ν€μ§λ₯Ό λ§€λ² μ€μΉν΄μΌ νλ λΉν¨μ¨μ΄ λ°μνλ€. κΉνμμλ μΊμ±μ μ§μνκΈ° λλ¬Έμ CI μλ²μμ npm ν¨ν€μ§λ₯Ό μ€μΉν λ μ±λ₯μ ν₯μμν¬ μ μλ€.actions/setup-node@v4 μ‘μ
μ cache μ΅μ
μ ν΅ν΄ ν΄λΉ νλ‘μ νΈμμ μ°κ³ μλ ν¨ν€μ§ λ§€λμ λ₯Ό λκΈΈ μ μλ€.npmμ μ¬μ©νλ―λ‘ package.json νμΌμ κΈ°μ€μΌλ‘ μΊμ±νλλ‘ cache μ΅μ
μ npmμ λκ²Όλ€. κΉνμ΄ μ 곡νλ μΊμ(cache) μ‘μ
μ μ¬μ©νλ©΄ κΉν μ‘μ
μμ μν¬νλ‘μ°κ° μ€νλ λ νμν νμΌ μ€μμ κ±°μ μ λ°λμ§ μλ νμΌλ€μ κΉν μΊμμ μ¬λ €λκ³ CI μλ²λ‘ λ΄λ €λ°μ μ μλ€.
μ€μΉν΄μΌ ν νμΌμ΄ λ§μ νλ‘μ νΈμ κ²½μ°, μΊμλ₯Ό νμ©νλ©΄ λ§€λ² μ€μΉν νμ μμ΄ workflowsμ μ±λ₯μ μ΅μ ννλλ° λμμ΄ λλ€.
usesλ₯Ό μ¬μ©ν΄ μ‘μ
μ κ°μ Έμ€κ³ , μ‘μ
μ νμν μΈμλ₯Ό with ν€μλλ‘ λκ²¨μ€ μ μλ€.
- name: Cache node modules
uses: actions/cache@v3
id: cache
with:
path: node_modules
key: npm-packages-${{ hashFiles('**/package-lock.json') }}
path: cacheμ λμμ μ νλ€. key: μΊμλ₯Ό μ μ₯ν λ μμ±λλ ν€λ₯Ό λ§νλ€. μΊμ±λ λ°μ΄ν°λ₯Ό μ°Ύμ λ μ΄ keyλ₯Ό μ¬μ©νλ€.- uses: actions/cache@v3
id: npm-cache
with:
path: ${{ steps.npm-cache-dir.outputs.dir }}
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
restore-keys: keyκ° μΌμΉνμ§ μμ κ²½μ°λ₯Ό λλΉν΄ μ¬λ¬ keyλ₯Ό μ§μ ν μ μλ€. μ΄λ λͺ©λ‘μ μμ±λ μμλλ‘ νμμ μ§ννλ€. - uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
μ΄ λΆλΆμ λμ€μ λ°λ‘ λ 곡λΆλ₯Ό ν νμκ° μλ κ² κ°λ€;;
(μ°Έκ³ : https://www.daleseo.com/github-actions-cache/)
runμ μ€νκΈ°μμ λͺ
λ Ήμ μ€ννλλ‘ jobμ μ§μνλ λͺ
λ Ήμ΄λ₯Ό λ§νλ€.
- name: Install the project dependencies
if: steps.cache.outputs.cache-hit == false
run: npm ci
if: steps.cache.outputs.cache-hit == false -> μΆκ°μ μΈ κ³΅λΆ νμ;;
- name: Build
run: npm run build
λ μ°λ¦¬λ λμ€μ½λ μΉν
μ μ°κ²°ν΄μ μ€λ₯ λ°μ μ λμ€μ½λμ ν΄λΉ λ©μμ§λ₯Ό λμΈ μ μκ² μ€μ νλ€.
- name: action-discord
uses: sarisia/actions-status-discord@v1
if: failure()
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
content: '<@&1192747539124977736> ${{ github.actor }} νμΈν΄μ£ΌμΈμ! ( γ£ β’βαβ’β )γ'
title: βοΈ failed βοΈ
color: FF0000
username: GitHub Actions
- run: echo '${{github.actor}}λ μλ¬ νμΈ νμΈν΄μ£ΌμΈμ ( γ£ β’βαβ’β )γ'
μ΄λ² 곡λΆλ₯Ό ν΅ν΄μ CI/CD μλ²μ λν΄μ λ°°μΈ μ μμκ³ κ²°κ΅ μλνκ° μ€μνλ€λ κ²μ κΉ¨λ¬μλ€. μμ§ μΊμ± κ³Όμ μ λν΄μλ μ΄ν΄κ° λΆμ‘±ν΄μ νλ‘μ νΈκ° λλκ³ λλ©΄ μΆκ°μ μΈ κ³΅λΆκ° νμνλ€!
λΉλ‘ μ€μ κ³Όμ μ μ΄λ €μλ νλ² μ€μ νλ©΄ μ€μμ λ°λ³΅μ μ€μΌ μ μμ΄μ μ λλ‘ κ³΅λΆνλ©΄ λμ± μ’μ κ² κ°λ€.
https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions
https://www.daleseo.com/github-actions-cache/
https://pozafly.github.io/dev-ops/cache-and-restore-keys-in-github-actions/
https://github.com/actions/cache/blob/main/examples.md#node---npm
https://www.daleseo.com/github-actions-setup-node/
https://blog.banksalad.com/tech/github-action-npm-cache/
https://roseline.oopy.io/dev/github-action-cahce
https://www.daleseo.com/github-actions-basics/