jgf

Jira-GitHub Flow CLI tool for seamless project management


Keywords
jira, github, cli, workflow, productivity, github-actions, jira-rest-api, rust
License
MIT
Install
npm install jgf@0.1.5

Documentation

JGF (Jira Git Flow) πŸš€

Jira와 Git을 μ—°λ™ν•˜λŠ” μ›Œν¬ν”Œλ‘œμš° μžλ™ν™” CLI 도ꡬ

πŸ“Œ 문제 상황

κ°œλ°œνŒ€μ—μ„œ 반볡적으둜 κ²ͺλŠ” λ¬Έμ œλ“€:

  • PM이 Jira ν‹°μΌ“ ν• λ‹Ή β†’ κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ ν‹°μΌ“ 확인
  • ν‹°μΌ“ 번호둜 브랜치 생성 β†’ μˆ˜λ™μœΌλ‘œ Jira μƒνƒœ λ³€κ²½
  • PR 생성 μ‹œ Jira 링크 볡사/λΆ™μ—¬λ„£κΈ°
  • PR λ¨Έμ§€ ν›„ Jira μƒνƒœ μˆ˜λ™ μ—…λ°μ΄νŠΈ
  • 둜컬 브랜치 정리

이 λͺ¨λ“  과정이 μ‹œκ°„μ΄ 많이 μ†Œμš”λ©λ‹ˆλ‹€.

✨ JGFκ°€ ν•΄κ²°ν•˜λŠ” 것

  1. μžλ™ 브랜치 생성: Jira ν‹°μΌ“ 번호둜 μžλ™ 브랜치 생성
  2. μžλ™ μƒνƒœ 동기화: μž‘μ—… μ‹œμž‘/PR/λ¨Έμ§€ μ‹œ Jira μƒνƒœ μžλ™ μ—…λ°μ΄νŠΈ
  3. PR ν…œν”Œλ¦Ώ μžλ™ν™”: Jira 링크와 ν‹°μΌ“ 정보 μžλ™ 포함
  4. 브랜치 μžλ™ 정리: λ¨Έμ§€λœ 브랜치 μžλ™ 감지 및 μ‚­μ œ

πŸ”„ μ›Œν¬ν”Œλ‘œμš°

전체 ν”Œλ‘œμš°

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μ—μ„œ μ„€μΉ˜
cargo install jgf

# λ˜λŠ” μ†ŒμŠ€μ—μ„œ λΉŒλ“œ
git clone https://github.com/jaehafe/jgf.git
cd jgf
cargo install --path .

Option 2: λ°”μ΄λ„ˆλ¦¬ 직접 λ‹€μš΄λ‘œλ“œ (Rust λΆˆν•„μš”)

# macOS (Apple Silicon)
curl -L https://github.com/jaehafe/jgf/releases/latest/download/jgf-darwin-aarch64 -o jgf
chmod +x jgf
sudo mv jgf /usr/local/bin/

# macOS (Intel)
curl -L https://github.com/jaehafe/jgf/releases/latest/download/jgf-darwin-x64 -o jgf
chmod +x jgf
sudo mv jgf /usr/local/bin/

# Linux
curl -L https://github.com/jaehafe/jgf/releases/latest/download/jgf-linux-x64 -o jgf
chmod +x jgf
sudo mv jgf /usr/local/bin/

βš™οΈ 초기 μ„€μ •

ν”„λ‘œμ νŠΈλ³„ μ„€μ • (ꢌμž₯)

각 ν”„λ‘œμ νŠΈ λ£¨νŠΈμ—μ„œ μ‹€ν–‰:

jgf init

이 λͺ…령은 두 개의 νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€:

1. jgf.json - ν”„λ‘œμ νŠΈ μ„€μ • (Git에 컀밋 κ°€λŠ₯)

{
  "project": "your-project-name",
  "jira": {
    "url": "https://your-company.atlassian.net",
    "project": "EM",
    "username": "your-email@company.com"  // Optional
  },
  "github": {
    "owner": "YourOrg",
    "repo": "your-repo"
  },
  "defaultBranch": "develop",
  "prTemplate": {  // Optional
    "path": "custom/pr_template.md"  // λ˜λŠ”
    // "content": "직접 ν…œν”Œλ¦Ώ λ‚΄μš©..."
  }
}

2. .env - 토큰 정보

JIRA_TOKEN=your-jira-api-token
GITHUB_TOKEN=ghp_your_github_token

API 토큰 λ°œκΈ‰ 방법

Jira API Token:

  1. Atlassian Account Settings 접속
  2. "Create API token" 클릭
  3. 토큰 이름 μž…λ ₯ ν›„ 생성
  4. 토큰 λ³΅μ‚¬ν•˜μ—¬ .env에 μ €μž₯

GitHub Personal Access Token:

  1. GitHub Settings β†’ Developer settings β†’ Personal access tokens
  2. "Generate new token (classic)" 클릭
  3. κΆŒν•œ 선택: repo (전체)
  4. 토큰 생성 및 볡사

πŸ“š μ‚¬μš©λ²•

1. ν• λ‹Ήλœ ν‹°μΌ“ 쑰회 및 μž‘μ—… μ‹œμž‘

# ν• λ‹Ήλœ λͺ¨λ“  ν‹°μΌ“ 쑰회
jgf tickets

# μƒνƒœλ³„ 필터링
jgf tickets --status "In Progress"

# μ΅œλŒ€ 개수 μ œν•œ
jgf tickets --limit 10

μΈν„°λž™ν‹°λΈŒ λͺ¨λ“œ:

  • ν‹°μΌ“ λͺ©λ‘μ—μ„œ 선택
  • "브랜치 생성 및 In Progress둜 λ³€κ²½" 선택
  • μžλ™μœΌλ‘œ 브랜치 생성 및 Jira μƒνƒœ μ—…λ°μ΄νŠΈ

2. νŠΉμ • ν‹°μΌ“μœΌλ‘œ μž‘μ—… μ‹œμž‘

jgf start EM-100

μžλ™ μˆ˜ν–‰ μž‘μ—…:

  • βœ… develop λΈŒλžœμΉ˜μ—μ„œ μ΅œμ‹  변경사항 pull
  • βœ… EM-100 브랜치 생성 및 체크아웃
  • βœ… Jira 티켓을 "In Progress"둜 λ³€κ²½

3. PR 생성

jgf pr

μžλ™ μˆ˜ν–‰ μž‘μ—…:

  • βœ… ν˜„μž¬ λΈŒλžœμΉ˜μ—μ„œ develop으둜 PR 생성
  • βœ… PR 제λͺ©: [EM-100] ν‹°μΌ“ 제λͺ©
  • βœ… ν”„λ‘œμ νŠΈμ˜ PR ν…œν”Œλ¦Ώ μžλ™ 탐색 및 적용
  • βœ… PR 본문에 Jira 링크 및 ν‹°μΌ“ 정보 μžλ™ μ‚½μž…
  • βœ… PR이 이미 μ‘΄μž¬ν•˜λ©΄ 링크 μ•ˆλ‚΄

4. λ¨Έμ§€ ν›„ 동기화

jgf sync

μžλ™ μˆ˜ν–‰ μž‘μ—…:

  • βœ… develop 브랜치둜 μ „ν™˜ 및 μ΅œμ‹  pull
  • βœ… λ¨Έμ§€λœ 브랜치 감지
  • βœ… ν•΄λ‹Ή Jira 티켓을 "Done"으둜 λ³€κ²½
  • βœ… 둜컬 브랜치 μ‚­μ œ

🎯 μ‹€μ œ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€

μ‹œλ‚˜λ¦¬μ˜€ 1: μƒˆ κΈ°λŠ₯ 개발

# 1. ν• λ‹Ήλœ ν‹°μΌ“ 확인
$ jgf tickets
🎫 [1] EM-120 μ‚¬μš©μž ν”„λ‘œν•„ κΈ°λŠ₯ μΆ”κ°€
   μƒνƒœ: To Do | λ‹΄λ‹Ήμž: κΉ€κ°œλ°œ | μš°μ„ μˆœμœ„: High

# 2. μž‘μ—… μ‹œμž‘ (μΈν„°λž™ν‹°λΈŒ 선택 λ˜λŠ” 직접 λͺ…λ Ή)
$ jgf start EM-120
πŸš€ ν‹°μΌ“ EM-120 μž‘μ—…μ„ μ‹œμž‘ν•©λ‹ˆλ‹€
🌿 브랜치 'EM-120'κ°€ μƒμ„±λ˜κ³  μ²΄ν¬μ•„μ›ƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€
βœ… ν‹°μΌ“ μƒνƒœκ°€ 'In Progress'둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€

# 3. μ½”λ”© μž‘μ—…...

# 4. PR 생성
$ jgf pr
πŸš€ 브랜치 'EM-120'μ—μ„œ 'develop'으둜 PR 생성
βœ… PR이 μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! #123
πŸ’‘ PR 링크: https://github.com/YourOrg/your-repo/pull/123

# 5. 리뷰 & λ¨Έμ§€ ν›„
$ jgf sync
πŸ”„ λ¨Έμ§€λœ 브랜치 동기화 μ‹œμž‘
βœ… ν‹°μΌ“ EM-120 μƒνƒœκ°€ 'Done'으둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€
βœ… 브랜치 'EM-120'κ°€ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€
✨ 브랜치 동기화 μ™„λ£Œ!

μ‹œλ‚˜λ¦¬μ˜€ 2: μ—¬λŸ¬ ν‹°μΌ“ λ™μ‹œ μž‘μ—…

# μ—¬λŸ¬ λΈŒλžœμΉ˜μ—μ„œ μž‘μ—… ν›„ ν•œλ²ˆμ— 정리
$ jgf sync
πŸ”„ 3개의 ν‹°μΌ“ 브랜치λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€

🌿 브랜치 'EM-118' 확인 쀑...
βœ… 브랜치 'EM-118'κ°€ λ¨Έμ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€
> ν‹°μΌ“ EM-118λ₯Ό 'Done' μƒνƒœλ‘œ λ³€κ²½ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? Yes
> 둜컬 브랜치 'EM-118'λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? Yes

🌿 브랜치 'EM-119' 확인 쀑...
πŸ’‘ 브랜치 'EM-119'λŠ” 아직 λ¨Έμ§€λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€

🌿 브랜치 'EM-120' 확인 쀑...
βœ… 브랜치 'EM-120'κ°€ λ¨Έμ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€
...

🏒 νšŒμ‚¬λ³„ μ»€μŠ€ν„°λ§ˆμ΄μ§•

Jira μƒνƒœ λ§€ν•‘

기본적으둜 λ‹€μŒ μƒνƒœλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€:

  • To Do / ν•΄μ•Ό ν•  일
  • In Progress / μ§„ν–‰ 쀑
  • Done / μ™„λ£Œ

νšŒμ‚¬μ— "In Review" μƒνƒœκ°€ μ—†λŠ” 경우, PR 생성 μ‹œ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  λ¨Έμ§€ ν›„ Done으둜만 λ³€κ²½ν•©λ‹ˆλ‹€.

브랜치 넀이밍

  • κΈ°λ³Έ: {JIRA_TICKET_NUMBER} (예: EM-100)
  • μˆ˜μ • ν•„μš”μ‹œ src/config.rs의 format_branch_name() ν•¨μˆ˜ μˆ˜μ •

PR ν…œν”Œλ¦Ώ κΈ°λŠ₯

ν…œν”Œλ¦Ώ μš°μ„ μˆœμœ„

  1. ν”„λ‘œμ νŠΈμ˜ PR ν…œν”Œλ¦Ώ 파일 (μžλ™ 탐색)

    • .github/pull_request_template.md
    • .github/PULL_REQUEST_TEMPLATE.md
    • pull_request_template.md
    • docs/pull_request_template.md
    • .gitlab/merge_request_templates/default.md
  2. jgf.json에 μ •μ˜λœ ν…œν”Œλ¦Ώ

    • prTemplate.path: μ»€μŠ€ν…€ 경둜 μ§€μ •
    • prTemplate.content: 직접 ν…œν”Œλ¦Ώ λ‚΄μš© μž‘μ„±
  3. κΈ°λ³Έ λ‚΄μž₯ ν…œν”Œλ¦Ώ

ν…œν”Œλ¦Ώ λ³€μˆ˜

jgfλŠ” PR ν…œν”Œλ¦Ώμ—μ„œ λ‹€μŒ λ³€μˆ˜λ₯Ό μžλ™ μΉ˜ν™˜ν•©λ‹ˆλ‹€:

  • {{TICKET_KEY}} - Jira ν‹°μΌ“ 번호 (예: EM-100)
  • {{TICKET_URL}} - Jira ν‹°μΌ“ URL
  • {{TICKET_TITLE}} - Jira ν‹°μΌ“ 제λͺ©
  • {{BRANCH_NAME}} - ν˜„μž¬ 브랜치λͺ…

ν…œν”Œλ¦Ώ μ˜ˆμ‹œ

## 🎫 ν‹°μΌ“
{{TICKET_URL}}

## πŸ“ μž‘μ—… λ‚΄μš©
- 

## βœ… 체크리슀트
- [ ] ν…ŒμŠ€νŠΈ μž‘μ„±
- [ ] λ¬Έμ„œ μ—…λ°μ΄νŠΈ
- [ ] μ½”λ“œ 리뷰 μš”μ²­

μ—¬λŸ¬ ν”„λ‘œμ νŠΈ 관리

각 ν”„λ‘œμ νŠΈμ— 독립적인 jgf.json을 μƒμ„±ν•˜μ—¬ 관리:

# Frontend ν”„λ‘œμ νŠΈ
cd ~/projects/frontend
jgf init  # frontend용 jgf.json 생성

# Backend ν”„λ‘œμ νŠΈ
cd ~/projects/backend
jgf init  # backend용 jgf.json 생성

# 각 ν”„λ‘œμ νŠΈμ—μ„œ λ…λ¦½μ μœΌλ‘œ μž‘λ™
cd ~/projects/frontend && jgf tickets  # frontend μ„€μ • μ‚¬μš©
cd ~/projects/backend && jgf tickets   # backend μ„€μ • μ‚¬μš©

μ„€μ • 파일 μš°μ„ μˆœμœ„

  1. ν˜„μž¬ 디렉토리뢀터 μƒμœ„λ‘œ νƒμƒ‰ν•˜μ—¬ jgf.json μ°ΎκΈ°
  2. jgf.json이 있으면 ν•΄λ‹Ή μ„€μ • + 같은 μœ„μΉ˜μ˜ .env μ‚¬μš©
  3. μ—†μœΌλ©΄ μ „μ—­ .env 파일 μ‚¬μš© (λ ˆκ±°μ‹œ λͺ¨λ“œ)

πŸ“ 예제 파일

ν”„λ‘œμ νŠΈμ— ν¬ν•¨λœ 예제 파일:

  • jgf.json.example - ν”„λ‘œμ νŠΈ μ„€μ • 예제
  • .env.example - 토큰 μ„€μ • 예제

πŸ”§ 문제 ν•΄κ²°

SSH 인증 였λ₯˜

# SSH μ—μ΄μ „νŠΈ 확인
ssh-add -l

# SSH ν‚€ μΆ”κ°€
ssh-add ~/.ssh/id_ed25519

Jira API 였λ₯˜

  • API 토큰이 μ˜¬λ°”λ₯Έμ§€ 확인
  • Jira URL이 https://둜 μ‹œμž‘ν•˜λŠ”μ§€ 확인
  • ν”„λ‘œμ νŠΈ ν‚€(예: EM)κ°€ μ •ν™•ν•œμ§€ 확인

GitHub API 였λ₯˜

  • Personal Access Token κΆŒν•œ 확인 (repo κΆŒν•œ ν•„μš”)
  • Repository owner와 name이 μ •ν™•ν•œμ§€ 확인