π CI/CD μν¬νλ‘μ° μ΅μ ν: μμ‘΄μ± κ΄λ¦¬, ν μ€νΈ λ³λ ¬ μ€ν, λ€μ€ Node λ²μ μ§μ μμ μ 볡!
“CI/CDμμ ν¨ν€μ§ λ²μ κ³ μ μ μ νμν κΉ? ν μ€νΈ λ³λ ¬ μ€νμ νλ©΄ μλκ° μΌλ§λ λΉ¨λΌμ§κΉ? λ§€νΈλ¦μ€ μ λ΅μ μ΄λ»κ² νμ©ν κΉ?”
μ΅μ νλ CI/CD μν¬νλ‘μ°λ₯Ό ꡬμΆνλ ν΅μ¬ μ λ΅μ λͺ¨λ μ΄ν΄λ³΄μ!
π λͺ©μ°¨
1οΈβ£ ν¨ν€μ§ λ²μ κ³ μ (Dependency Management)
2οΈβ£ ν μ€νΈ λΆν (Sharding) & λ³λ ¬ μ€ν μ΅μ ν
3οΈβ£ λ€μ€ Node λ²μ μ§μ & λ§€νΈλ¦μ€ ν μ€νΈ μ λ΅
4οΈβ£ μ€μ μμ (GitHub Actions κΈ°λ°)
5οΈβ£ κ²°λ‘
1οΈβ£ ν¨ν€μ§ λ²μ κ³ μ (Dependency Management) ποΈ
π μ ν¨ν€μ§ λ²μ κ³ μ μ΄ νμν κΉ?
νλ‘ νΈμλ CI/CD νμ΄νλΌμΈμμ ν¨ν€μ§ λ²μ μ κ³ μ νλ κ²μ λ§€μ° μ€μν΄μ.
π¨ μ΄μ :
• CI/CD νκ²½μμ μ€ννλ μ½λκ° κ°λ° νκ²½κ³Ό λ€λ₯΄λ©΄ μκΈ°μΉ μμ μ€λ₯ λ°μ π¨
• μ’ μλ ν¨ν€μ§μ μ λ°μ΄νΈλ‘ μΈν΄ λΆμμ ν λΉλκ° μμ±λ μ μμ
• μ¬λ¬ κ°λ°μκ° κ°μ νλ‘μ νΈλ₯Ό λ€λ£° λ μΌκ΄λ μ€ν νκ²½ μ μ§
β ν΄κ²° λ°©λ²:
βοΈ lock νμΌμ μ μ§ (package-lock.json, yarn.lock)
βοΈ ν¨ν€μ§ λ²μ λͺ μμ μΌλ‘ κ³ μ (dependenciesμ devDependenciesμμ ^λ ~ μ κ±°)
βοΈ μμ‘΄μ± μΊμ± νμ© (cache: yarn μ€μ λ±)
π CI/CDμμ ν¨ν€μ§ λ²μ κ³ μ μμ (GitHub Actions)
jobs:
install:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Cache Node.js modules
uses: actions/cache@v3
with:
path: ~/.yarn/cache # Yarn Berry μ¬μ© μ
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install dependencies
run: yarn install --frozen-lockfile
π‘ yarn install --frozen-lockfile
• package.jsonκ³Ό yarn.lockμ΄ μΌμΉνμ§ μμΌλ©΄ μ€λ₯ λ°μ (μΌκ΄λ ν¨ν€μ§ νκ²½ μ μ§)
2οΈβ£ ν μ€νΈ λΆν (Sharding) & λ³λ ¬ μ€ν μ΅μ ν ποΈ
π Sharding (μ€λ©)μ΄λ?
π CI/CDμμ **Sharding(μ€λ©)**μ ν μ€νΈλ₯Ό μ¬λ¬ κ°μ μμ μ‘°κ°(Shard)μΌλ‘ λλ μ λ³λ ¬ μ€ννλ κΈ°λ²μ΄μμ.
μ¦, ν κ°μ λ¨Έμ μμ λͺ¨λ ν μ€νΈλ₯Ό μ€ννλ λμ , μ¬λ¬ λ¨Έμ μμ ν μ€νΈλ₯Ό λλ μ μ€ννλ©΄ μλκ° ν¨μ¬ λΉ¨λΌμ Έμ!
β Shardingμ μ₯μ
βοΈ ν μ€νΈ μλ κ·Ήλν (Build Time λ¨μΆ!)
βοΈ λ³λ ¬ μ€νμΌλ‘ μ€ν μκ° μ λ° μ΄νλ‘ κ°μ κ°λ₯
βοΈ ν° νλ‘μ νΈμμλ ν¨μ¨μ μΈ ν μ€νΈ μ€ν
π μμ : Cypress λ³λ ¬ ν μ€νΈ μ€ν (GitHub Actions)
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
shard: [1, 2, 3, 4] # 4κ°μ μ€λλ‘ λλ (ν
μ€νΈ λ³λ ¬ μ€ν)
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Run Cypress tests in parallel
run: npx cypress run --record --parallel --group shard-${{ matrix.shard }}
π‘ μ μ€μ μμ Cypress ν μ€νΈκ° **4κ°μ μ€λ(Shard)**λ‘ λΆν λμ΄ μ€νλ¨.
• --parallel: λ³λ ¬ μ€ν μ΅μ
• --group shard-${{ matrix.shard }}: μ€λ κ·Έλ£Ή μ€μ
3οΈβ£ λ€μ€ Node λ²μ μ§μ & λ§€νΈλ¦μ€ ν μ€νΈ μ λ΅
π λ€μ€ Node.js λ²μ μ§μ (Multi-Version Testing)
CI/CD νκ²½μμλ μ¬λ¬ Node.js λ²μ μμ ν μ€νΈλ₯Ό μννλ κ²μ΄ μ€μν΄μ.
π¨ μ΄μ λ?
1οΈβ£ ν λ΄ λ€μν Node.js λ²μ μ μ¬μ©νλ κ²½μ° λ²μ κ° νΈνμ± μ²΄ν¬ κ°λ₯
2οΈβ£ νλ‘μ νΈκ° Node.js μ΅μ λ²μ μμλ μ μ μλνλμ§ κ²μ¦
3οΈβ£ λΌμ΄λΈλ¬λ¦¬ μ λ°μ΄νΈ μ νΉμ λ²μ μμ λ°μν μ μλ λ¬Έμ μ¬μ λ°κ²¬
β ν΄κ²° λ°©λ²:
βοΈ GitHub Actionsμμ matrix μ λ΅μ νμ©νμ¬ μ¬λ¬ Node.js λ²μ μμ λ³λ ¬ ν μ€νΈ μ€ν
βοΈ μ΅μ μ§μ λ²μ κ³Ό μ΅μ λ²μ μμ μ€ννμ¬ λ¬Έμ λ°μ μ¬λΆ νμΈ
π λ€μ€ Node.js λ²μ ν μ€νΈ μμ (GitHub Actions)
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14, 16, 18] # μ§μν Node.js λ²μ μ§μ
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Run tests
run: yarn test
π‘ μ μ€μ μμ Node.js 14, 16, 18 λ²μ μμ ν μ€νΈ λ³λ ¬ μ€ν!
• matrix.node-versionμ νμ©νμ¬ μ¬λ¬ λ²μ ν μ€νΈ
• setup-node@v3 μ‘μ μΌλ‘ Node.js λ²μ μ€μ
4οΈβ£ μ€μ μμ (GitHub Actions κΈ°λ° CI/CD μ΅μ ν) π οΈ
name: CI/CD Workflow
on:
push:
branches:
- main
jobs:
install:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Cache dependencies
uses: actions/cache@v3
with:
path: ~/.yarn/cache
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
- name: Install dependencies
run: yarn install --frozen-lockfile
test:
needs: install
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14, 16, 18]
shard: [1, 2, 3, 4]
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Run tests in parallel
run: npx jest --shard=${{ matrix.shard }}
β μ΄ μν¬νλ‘μ°μμ νλ μΌ:
βοΈ yarn.lockμ νμ©ν ν¨ν€μ§ λ²μ κ³ μ
βοΈ λ³λ ¬ ν μ€νΈ μ€ν (Sharding)
βοΈ λ€μ€ Node.js λ²μ ν μ€νΈ (Matrix Strategy)
5οΈβ£ κ²°λ‘ : CI/CD μ±λ₯μ κ·Ήλννλ λ°©λ²!
β μμ‘΄μ± κ΄λ¦¬λ₯Ό ν΅ν΄ μΌκ΄λ μ€ν νκ²½ μ μ§!
β Shardingμ μ¬μ©ν΄ λ³λ ¬ ν μ€νΈλ‘ μλ μ΅μ ν!
β λ€μ€ Node.js λ²μ ν μ€νΈλ‘ νΈνμ± ν보!
π― CI/CDμ μλμ μμ μ±μ λͺ¨λ μ‘κ³ μΆμ κ°λ°μλΌλ©΄?
π μ λ°©λ²λ€μ μ μ©ν΄μ μ΅μ νλ λΉλ νμ΄νλΌμΈμ λ§λ€μ΄λ³΄μΈμ! π
π· μ μ€μ κ°λ°μκ° λμ΄λ΄ μλΉ! π· π
'Dev-ops' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π GitHub Actions μλ²½ κ°μ΄λ (0) | 2025.03.26 |
---|---|
π λνμ μΈ CI λꡬ μλ²½ λΉκ΅ (0) | 2025.03.25 |
π Yarn Berry μλ²½ μ 리: κ°λ λΆν° μΊμ κ΄λ¦¬κΉμ§! (0) | 2025.03.22 |
π CircleCI κ°λ λΆν° μ€μ κΉμ§ μλ²½ μ 리! (0) | 2025.03.21 |
π Next.js μν¬νλ‘μ° μμ μ 볡 (0) | 2025.03.20 |