03.1.Git Doc - yojulab/learn_DevOps GitHub Wiki

Git λ©”μ‹œμ§€ 기반 개발 λ¬Έμ„œ μžλ™ 생성 κ°€μ΄λ“œ

λ³Έ λ¬Έμ„œλŠ” Git 컀밋 λ©”μ‹œμ§€λ₯Ό λΆ„μ„ν•˜μ—¬ CHANGELOG.md λ˜λŠ” DEVELOPMENT_DOC.md와 같은 개발 λ¬Έμ„œλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 방법.


1. κ°œμš” (Introduction)

개발 생산성을 높이기 μœ„ν•΄μ„œλŠ” λ³€κ²½ 사항을 λ¬Έμ„œν™”ν•˜λŠ” 과정이 ν•„μˆ˜μ μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μˆ˜λ™μœΌλ‘œ λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 번거둭고 μ‹€μˆ˜κ°€ λ°œμƒν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

ν•΄κ²°μ±…: Git 컀밋 λ©”μ‹œμ§€λ₯Ό κ΅¬μ‘°ν™”ν•˜κ³ , 이λ₯Ό 기반으둜 λ¬Έμ„œλ₯Ό μžλ™ μƒμ„±ν•˜λŠ” 도ꡬλ₯Ό λ„μž…ν•©λ‹ˆλ‹€.

μ™œ git-cliff 인가?

  • 속도: Rust둜 μž‘μ„±λ˜μ–΄ 맀우 λΉ λ¦…λ‹ˆλ‹€.
  • μœ μ—°μ„±: cliff.toml νŒŒμΌμ„ 톡해 좜λ ₯ ν˜•μ‹μ„ μ™„λ²½ν•˜κ²Œ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ²”μš©μ„±: GitHub Actions와 같은 CI/CD 도ꡬ와 μ‰½κ²Œ ν†΅ν•©λ©λ‹ˆλ‹€.

2. μ „μ œ 쑰건: Conventional Commits

μžλ™ 생성을 μœ„ν•΄μ„œλŠ” 컀밋 λ©”μ‹œμ§€κ°€ μΌμ •ν•œ κ·œμΉ™μ„ 따라야 ν•©λ‹ˆλ‹€. κ°€μž₯ 널리 μ“°μ΄λŠ” κ·œμΉ™μ€ Conventional Commitsμž…λ‹ˆλ‹€.

기본 ꡬ쑰:

<type>(<scope>): <description>

[optional body]

[optional footer(s)]

자주 μ‚¬μš©ν•˜λŠ” Type:

  • feat: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
  • fix: 버그 μˆ˜μ •
  • update: μ½”λ“œ λ³€κ²½ λ˜λŠ” μœ μ§€λ³΄μˆ˜ (μ‚¬μš©μž μ •μ˜)
  • docs: λ¬Έμ„œ μˆ˜μ •
  • style: μ½”λ“œ ν¬λ§·νŒ…, μ„Έλ―Έμ½œλ‘  λˆ„λ½ λ“± (μ½”λ“œ λ³€κ²½ μ—†μŒ)
  • refactor: μ½”λ“œ λ¦¬νŒ©ν† λ§
  • test: ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€/μˆ˜μ •

3. 핡심 κ΅¬ν˜„ μ˜ˆμ‹œ (git-cliff + GitHub Actions)

단계 1: cliff.toml μ„€μ •

ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— cliff.toml νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ λ¬Έμ„œμ˜ μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€.

[changelog]
header = "# Development Documentation\n"
body = """
{% if version %}## [{{ version }}] - {{ timestamp | date(format='%Y-%m-%d') }}{% else %}## [Unreleased]{% endif %}
{% for group, commits in commits | group_by(attribute='group') %}
### {{ group }}
{% for commit in commits %}
- **[{{ commit.author.timestamp | date(format="%Y-%m-%d") }}]** {{ commit.message }} (by {{ commit.author.name }})
{% endfor %}
{% endfor %}
"""

[git]
conventional_commits = true
commit_parsers = [
  { message = "^feat", group = "Features" },
  { message = "^fix", group = "Fixes" },
  { message = "^update", group = "Updates" },
  # ... 기타 μ„€μ •
]

단계 2: GitHub Actions μ›Œν¬ν”Œλ‘œμš° μ„€μ •

.github/workflows/changelog.yml νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ μžλ™ν™”λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

name: Generate Changelog

on:
  push:
    branches: [master, main]

jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # λͺ¨λ“  컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό 가져와야 함

      - name: Generate a changelog
        uses: orhun/git-cliff-action@v4
        with:
          config: cliff.toml
        env:
          OUTPUT: DEVELOPMENT_DOC.md # κ²°κ³Όκ°€ μ €μž₯될 파일λͺ…

      - name: Commit and push changes
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add DEVELOPMENT_DOC.md
          git commit -m "docs: update DEVELOPMENT_DOC.md [skip ci]" || echo "No changes"
          git push

4. μ‹€μŠ΅ 및 ν™œμš© (Best Practices)

  1. 컀밋 λ©”μ‹œμ§€ μž‘μ„± μ‹œ μ£Όμ˜μ‚¬ν•­: feat:, fix: 접두사λ₯Ό μ—„κ²©νžˆ μ§€ν‚΅λ‹ˆλ‹€.
  2. 둜컬 ν…ŒμŠ€νŠΈ: GitHub Actions에 올리기 μ „ λ‘œμ»¬μ— git-cliffλ₯Ό μ„€μΉ˜ν•˜μ—¬ git cliff -o DEVELOPMENT_DOC.md λͺ…λ Ήμ–΄λ‘œ 미리 확인해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. νƒœκ·Έ ν™œμš©: git tag -a v1.0.0 -m "Release v1.0.0"와 git push origin v1.0.0와 같이 νƒœκ·Έλ₯Ό μƒμ„±ν•˜λ©΄ λ²„μ „λ³„λ‘œ μ •λ¦¬λœ λ¬Έμ„œλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ νƒœκ·Έ 이름은 v둜 μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

5. κ²°λ‘ 

Git λ©”μ‹œμ§€ 기반의 λ¬Έμ„œ μžλ™ν™”λŠ” **"μ½”λ“œμ™€ λ¬Έμ„œμ˜ 동기화"**λ₯Ό 보μž₯ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ½”λ“œ μž‘μ„±μ—λ§Œ 집쀑할 수 있으며, ν”„λ‘œμ νŠΈμ˜ νžˆμŠ€ν† λ¦¬λ₯Ό 투λͺ…ν•˜κ²Œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

Git λ©”μ‹œμ§€ 기반 개발 λ¬Έμ„œ μžλ™ 생성 κ°€μ΄λ“œ

λ³Έ λ¬Έμ„œλŠ” Git 컀밋 λ©”μ‹œμ§€λ₯Ό λΆ„μ„ν•˜μ—¬ CHANGELOG.md λ˜λŠ” DEVELOPMENT_DOC.md와 같은 개발 λ¬Έμ„œλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 방법에 λŒ€ν•œ κ°•μ˜ μžλ£Œμž…λ‹ˆλ‹€.


1. κ°œμš” (Introduction)

개발 생산성을 높이기 μœ„ν•΄μ„œλŠ” λ³€κ²½ 사항을 λ¬Έμ„œν™”ν•˜λŠ” 과정이 ν•„μˆ˜μ μž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μˆ˜λ™μœΌλ‘œ λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜λŠ” 것은 번거둭고 μ‹€μˆ˜κ°€ λ°œμƒν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.

ν•΄κ²°μ±…: Git 컀밋 λ©”μ‹œμ§€λ₯Ό κ΅¬μ‘°ν™”ν•˜κ³ , 이λ₯Ό 기반으둜 λ¬Έμ„œλ₯Ό μžλ™ μƒμ„±ν•˜λŠ” 도ꡬλ₯Ό λ„μž…ν•©λ‹ˆλ‹€.

μ™œ git-cliff 인가?

  • 속도: Rust둜 μž‘μ„±λ˜μ–΄ 맀우 λΉ λ¦…λ‹ˆλ‹€.
  • μœ μ—°μ„±: cliff.toml νŒŒμΌμ„ 톡해 좜λ ₯ ν˜•μ‹μ„ μ™„λ²½ν•˜κ²Œ μ»€μŠ€ν„°λ§ˆμ΄μ§•ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ²”μš©μ„±: GitHub Actions와 같은 CI/CD 도ꡬ와 μ‰½κ²Œ ν†΅ν•©λ©λ‹ˆλ‹€.

2. μ „μ œ 쑰건: Conventional Commits

μžλ™ 생성을 μœ„ν•΄μ„œλŠ” 컀밋 λ©”μ‹œμ§€κ°€ μΌμ •ν•œ κ·œμΉ™μ„ 따라야 ν•©λ‹ˆλ‹€. κ°€μž₯ 널리 μ“°μ΄λŠ” κ·œμΉ™μ€ Conventional Commitsμž…λ‹ˆλ‹€.

기본 ꡬ쑰:

<type>(<scope>): <description>

[optional body]

[optional footer(s)]

자주 μ‚¬μš©ν•˜λŠ” Type:

  • feat: μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
  • fix: 버그 μˆ˜μ •
  • update: μ½”λ“œ λ³€κ²½ λ˜λŠ” μœ μ§€λ³΄μˆ˜ (μ‚¬μš©μž μ •μ˜)
  • docs: λ¬Έμ„œ μˆ˜μ •
  • style: μ½”λ“œ ν¬λ§·νŒ…, μ„Έλ―Έμ½œλ‘  λˆ„λ½ λ“± (μ½”λ“œ λ³€κ²½ μ—†μŒ)
  • refactor: μ½”λ“œ λ¦¬νŒ©ν† λ§
  • test: ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€/μˆ˜μ •

3. 핡심 κ΅¬ν˜„ μ˜ˆμ‹œ (git-cliff + GitHub Actions)

단계 1: cliff.toml μ„€μ •

ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— cliff.toml νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ λ¬Έμ„œμ˜ μŠ€νƒ€μΌμ„ μ •μ˜ν•©λ‹ˆλ‹€.

[changelog]
header = "# Development Documentation\n"
body = """
{% if version %}## [{{ version }}] - {{ timestamp | date(format='%Y-%m-%d') }}{% else %}## [Unreleased]{% endif %}
{% for group, commits in commits | group_by(attribute='group') %}
### {{ group }}
{% for commit in commits %}
- **[{{ commit.author.timestamp | date(format="%Y-%m-%d") }}]** {{ commit.message }} (by {{ commit.author.name }})
{% endfor %}
{% endfor %}
"""

[git]
conventional_commits = true
commit_parsers = [
  { message = "^feat", group = "Features" },
  { message = "^fix", group = "Fixes" },
  { message = "^update", group = "Updates" },
  # ... 기타 μ„€μ •
]

단계 2: GitHub Actions μ›Œν¬ν”Œλ‘œμš° μ„€μ •

.github/workflows/changelog.yml νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ μžλ™ν™”λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

name: Generate Changelog

on:
  push:
    branches: [master, main]

jobs:
  changelog:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # λͺ¨λ“  컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό 가져와야 함

      - name: Generate a changelog
        uses: orhun/git-cliff-action@v4
        with:
          config: cliff.toml
        env:
          OUTPUT: DEVELOPMENT_DOC.md # κ²°κ³Όκ°€ μ €μž₯될 파일λͺ…

      - name: Commit and push changes
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add DEVELOPMENT_DOC.md
          git commit -m "docs: update DEVELOPMENT_DOC.md [skip ci]" || echo "No changes"
          git push

4. μ‹€μŠ΅ 및 ν™œμš© (Best Practices)

  1. 컀밋 λ©”μ‹œμ§€ μž‘μ„± μ‹œ μ£Όμ˜μ‚¬ν•­: feat:, fix: 접두사λ₯Ό μ—„κ²©νžˆ μ§€ν‚΅λ‹ˆλ‹€.
  2. 둜컬 ν…ŒμŠ€νŠΈ: GitHub Actions에 올리기 μ „ λ‘œμ»¬μ— git-cliffλ₯Ό μ„€μΉ˜ν•˜μ—¬ git cliff -o DEVELOPMENT_DOC.md λͺ…λ Ήμ–΄λ‘œ 미리 확인해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. νƒœκ·Έ ν™œμš©: git tag -a v1.0.0 -m "Release v1.0.0"와 git push origin v1.0.0와 같이 νƒœκ·Έλ₯Ό μƒμ„±ν•˜λ©΄ λ²„μ „λ³„λ‘œ μ •λ¦¬λœ λ¬Έμ„œλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ νƒœκ·Έ 이름은 v둜 μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️