JGF (Jira Git Flow) π
Jiraμ Gitμ μ°λνλ μν¬νλ‘μ° μλν CLI λꡬ
π λ¬Έμ μν©
κ°λ°νμμ λ°λ³΅μ μΌλ‘ κ²ͺλ λ¬Έμ λ€:
- PMμ΄ Jira ν°μΌ ν λΉ β κ°λ°μκ° μλμΌλ‘ ν°μΌ νμΈ
- ν°μΌ λ²νΈλ‘ λΈλμΉ μμ± β μλμΌλ‘ Jira μν λ³κ²½
- PR μμ± μ Jira λ§ν¬ 볡μ¬/λΆμ¬λ£κΈ°
- PR λ¨Έμ§ ν Jira μν μλ μ λ°μ΄νΈ
- λ‘컬 λΈλμΉ μ 리
μ΄ λͺ¨λ κ³Όμ μ΄ μκ°μ΄ λ§μ΄ μμλ©λλ€.
β¨ JGFκ° ν΄κ²°νλ κ²
- μλ λΈλμΉ μμ±: Jira ν°μΌ λ²νΈλ‘ μλ λΈλμΉ μμ±
- μλ μν λκΈ°ν: μμ μμ/PR/λ¨Έμ§ μ Jira μν μλ μ λ°μ΄νΈ
- PR ν νλ¦Ώ μλν: Jira λ§ν¬μ ν°μΌ μ 보 μλ ν¬ν¨
- λΈλμΉ μλ μ 리: λ¨Έμ§λ λΈλμΉ μλ κ°μ§ λ° μμ
π μν¬νλ‘μ°
μ 체 νλ‘μ°
1. PM/κ°λ°μ Jira ν°μΌ ν λΉ
β
2. κ°λ°μ: jgf tickets (ν°μΌ μ‘°ν)
β
3. κ°λ°μ: jgf start EM-XXX (λΈλμΉ μμ±)
β μλ: Git λΈλμΉ μμ±
β μλ: Jira μν "In Progress"λ‘ λ³κ²½
β
4. κ°λ°μ: μ½λ© μμ
β
5. κ°λ°μ: jgf pr (PR μμ±)
β μλ: PR μ λͺ©μ ν°μΌ λ²νΈ ν¬ν¨
β μλ: PR λ³Έλ¬Έμ Jira λ§ν¬ μΆκ°
β
6. ν: μ½λ 리뷰 & λ¨Έμ§
β
7. κ°λ°μ: jgf sync (λκΈ°ν)
β μλ: λ¨Έμ§λ λΈλμΉ κ°μ§
β μλ: Jira μν "Done"μΌλ‘ λ³κ²½
β μλ: λ‘컬 λΈλμΉ μμ
μν λ³ν
Jira μν: To Do β In Progress β Done
Git λΈλμΉ: μμ β EM-XXX μμ± β PR β λ¨Έμ§ β μμ
π μ€μΉ λ°©λ²
Prerequisites
- Git
- Jira κ³μ λ° API ν ν°
- GitHub κ³μ λ° Personal Access Token
μ€μΉ μ΅μ
Option 1: Cargoλ₯Ό ν΅ν μ€μΉ (Rust νμ)
# crates.ioμμ μ€μΉ (μμ )
# λλ μμ€μμ λΉλ
Option 2: λ°μ΄λ리 μ§μ λ€μ΄λ‘λ (Rust λΆνμ)
# macOS (Apple Silicon)
# macOS (Intel)
# Linux
βοΈ μ΄κΈ° μ€μ
νλ‘μ νΈλ³ μ€μ (κΆμ₯)
κ° νλ‘μ νΈ λ£¨νΈμμ μ€ν:
μ΄ λͺ λ Ήμ λ κ°μ νμΌμ μμ±ν©λλ€:
1. jgf.json - νλ‘μ νΈ μ€μ (Gitμ μ»€λ° κ°λ₯)
2. .env - ν ν° μ 보 (.gitignoreμ μΆκ° νμ)
# ν ν° μ 보λ .env νμΌμ μ μ₯ν©λλ€
JIRA_TOKEN=your-jira-api-token
GITHUB_TOKEN=ghp_your_github_token
# Optional: jgf.jsonμ usernameμ΄ μμ κ²½μ° μ¬μ©
# JIRA_USERNAME=your-email@company.com
β οΈ μ€μ: .env νμΌμ λ°λμ .gitignoreμ μΆκ°νμΈμ!
λ κ±°μ μ€μ (νμ νΈνμ±)
jgf.json μμ΄ .env νμΌλ§μΌλ‘λ μλν©λλ€:
JIRA_URL=https://your-company.atlassian.net
JIRA_PROJECT=EM
JIRA_USERNAME=your-email@company.com
JIRA_TOKEN=your-jira-api-token
GITHUB_TOKEN=ghp_your_github_token
REPO_OWNER=YourOrg
REPO_NAME=your-repo
DEFAULT_BRANCH=develop
PROJECT_NAME=your-project
API ν ν° λ°κΈ λ°©λ²
Jira API Token:
- Atlassian Account Settings μ μ
- "Create API token" ν΄λ¦
- ν ν° μ΄λ¦ μ λ ₯ ν μμ±
- ν ν° λ³΅μ¬νμ¬
.envμ μ μ₯
GitHub Personal Access Token:
- GitHub Settings β Developer settings β Personal access tokens
- "Generate new token (classic)" ν΄λ¦
- κΆν μ ν:
repo(μ 체) - ν ν° μμ± λ° λ³΅μ¬
π μ¬μ©λ²
1. ν λΉλ ν°μΌ μ‘°ν λ° μμ μμ
# ν λΉλ λͺ¨λ ν°μΌ μ‘°ν
# μνλ³ νν°λ§
# μ΅λ κ°μ μ ν
μΈν°λν°λΈ λͺ¨λ:
- ν°μΌ λͺ©λ‘μμ μ ν
- "λΈλμΉ μμ± λ° In Progressλ‘ λ³κ²½" μ ν
- μλμΌλ‘ λΈλμΉ μμ± λ° Jira μν μ λ°μ΄νΈ
2. νΉμ ν°μΌμΌλ‘ μμ μμ
μλ μν μμ :
- β develop λΈλμΉμμ μ΅μ λ³κ²½μ¬ν pull
- β
EM-100λΈλμΉ μμ± λ° μ²΄ν¬μμ - β Jira ν°μΌμ "In Progress"λ‘ λ³κ²½
3. PR μμ±
μλ μν μμ :
- β νμ¬ λΈλμΉμμ developμΌλ‘ PR μμ±
- β
PR μ λͺ©:
[EM-100] ν°μΌ μ λͺ© - β PR λ³Έλ¬Έμ Jira λ§ν¬ μλ ν¬ν¨
- β PRμ΄ μ΄λ―Έ μ‘΄μ¬νλ©΄ λ§ν¬ μλ΄
4. λ¨Έμ§ ν λκΈ°ν
μλ μν μμ :
- β develop λΈλμΉλ‘ μ ν λ° μ΅μ pull
- β λ¨Έμ§λ λΈλμΉ κ°μ§
- β ν΄λΉ Jira ν°μΌμ "Done"μΌλ‘ λ³κ²½
- β λ‘컬 λΈλμΉ μμ
π― μ€μ μ¬μ© μλ리μ€
μλλ¦¬μ€ 1: μ κΈ°λ₯ κ°λ°
# 1. ν λΉλ ν°μΌ νμΈ
| |
# 2. μμ
μμ (μΈν°λν°λΈ μ ν λλ μ§μ λͺ
λ Ή)
# 3. μ½λ© μμ
...
# 4. PR μμ±
# 5. 리뷰 & λ¨Έμ§ ν
μλλ¦¬μ€ 2: μ¬λ¬ ν°μΌ λμ μμ
# μ¬λ¬ λΈλμΉμμ μμ
ν νλ²μ μ 리
> ν°μΌ
> λ‘컬
π’ νμ¬λ³ 컀μ€ν°λ§μ΄μ§
Jira μν λ§€ν
κΈ°λ³Έμ μΌλ‘ λ€μ μνλ₯Ό μ§μν©λλ€:
To Do/ν΄μΌ ν μΌIn Progress/μ§ν μ€Done/μλ£
νμ¬μ "In Review" μνκ° μλ κ²½μ°, PR μμ± μ μνλ₯Ό λ³κ²½νμ§ μκ³ λ¨Έμ§ ν DoneμΌλ‘λ§ λ³κ²½ν©λλ€.
λΈλμΉ λ€μ΄λ°
- κΈ°λ³Έ:
{JIRA_TICKET_NUMBER}(μ:EM-100) - μμ νμμ
src/config.rsμformat_branch_name()ν¨μ μμ
PR ν νλ¦Ώ μλ νμ
jgfλ νλ‘μ νΈμ PR ν νλ¦Ώμ μλμΌλ‘ μ°Ύμ μ¬μ©ν©λλ€:
.github/pull_request_template.md.github/PULL_REQUEST_TEMPLATE.mdpull_request_template.mddocs/pull_request_template.md.gitlab/merge_request_templates/default.md
μ¬λ¬ νλ‘μ νΈ κ΄λ¦¬
κ° νλ‘μ νΈμ λ
립μ μΈ jgf.jsonμ μμ±νμ¬ κ΄λ¦¬:
# Frontend νλ‘μ νΈ
# Backend νλ‘μ νΈ
# κ° νλ‘μ νΈμμ λ
립μ μΌλ‘ μλ
&& &&
μ€μ νμΌ μ°μ μμ
- νμ¬ λλ ν 리λΆν° μμλ‘ νμνμ¬
jgf.jsonμ°ΎκΈ° jgf.jsonμ΄ μμΌλ©΄ ν΄λΉ μ€μ + κ°μ μμΉμ.envμ¬μ©- μμΌλ©΄ μ μ
.envνμΌ μ¬μ© (λ κ±°μ λͺ¨λ)
π μμ νμΌ
νλ‘μ νΈμ ν¬ν¨λ μμ νμΌ:
jgf.json.example- νλ‘μ νΈ μ€μ μμ .env.example- ν ν° μ€μ μμ
π§ λ¬Έμ ν΄κ²°
SSH μΈμ¦ μ€λ₯
# SSH μμ΄μ νΈ νμΈ
# SSH ν€ μΆκ°
Jira API μ€λ₯
- API ν ν°μ΄ μ¬λ°λ₯Έμ§ νμΈ
- Jira URLμ΄
https://λ‘ μμνλμ§ νμΈ - νλ‘μ νΈ ν€(μ: EM)κ° μ ννμ§ νμΈ
GitHub API μ€λ₯
- Personal Access Token κΆν νμΈ (repo κΆν νμ)
- Repository ownerμ nameμ΄ μ ννμ§ νμΈ