본문 바로가기
TIP

GitHub 릴리즈 노트 자동화

by Coarti 2026. 2. 16.

일의 효율을 늘리고자 릴리즈 노트 자동배포 스킬을 만들었다.

프로젝트의 구현 과정 문서화와 Commit 기록 요약과 문서 작성 시간을 줄이기 위함이다.

 

아래는 2단계로 진행된다.

  1. CLI 명령어 설치
  2. Skill 마크다운 파일

결과로는 GitHub Release에 임시파일(Draft)로 자동 배포가 되어 확인 후에 정식 배포(Publish)를 전환하면 된다.

수정, 삭제까지 모두 프롬프트로 제어가 가능하다.

 

사용할 Commit 기록 확인과 배포 문서 작성에만 30분이 넘게 걸렸는데 5분만에 정리가 되어 개발에 더 집중할 수 있게 되었다.


GitHub CLI 설치

Window 11
winget install --id GitHub.cli

winpty gh auth login

 

Skill 등록

Antigravity 기준으로 .agent 안쪽 폴더 위치는 원하는 위치에 보관하면 된다.

./agent/scripts/create-github-release.sh

더보기

#!/usr/bin/env bash

# GitHub Release 생성 헬퍼 스크립트
# 이 스크립트는 GitHub CLI를 사용하여 릴리즈를 생성합니다.

set -e  # 에러 발생 시 즉시 종료

# 색상 정의
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 기본값 설정
DRAFT_MODE=false
PRERELEASE=false
LATEST=true
TARGET_BRANCH="main"
VERSION=""
TITLE=""
NOTES_FILE=""
ATTACH_FILES=""

# 함수: 사용법 출력
usage() {
    echo "Usage: $0 [OPTIONS]"
    echo ""
    echo "Options:"
    echo "  -v, --version VERSION        릴리즈 버전 (예: 0.2.0, 필수)"
    echo "  -t, --title TITLE           릴리즈 제목 (필수)"
    echo "  -n, --notes-file FILE       릴리즈 노트 파일 경로 (필수)"
    echo "  -b, --target BRANCH         타겟 브랜치 (기본값: main)"
    echo "  -d, --draft                 Draft 모드로 생성"
    echo "  -p, --prerelease            Pre-release로 표시"
    echo "  --no-latest                 최신 릴리즈로 설정하지 않음"
    echo "  -a, --attach FILES          첨부할 바이너리 파일들 (쉼표로 구분)"
    echo "  -h, --help                  도움말 표시"
    echo ""
    echo "예시:"
    echo "  $0 -v 0.2.0 -t \"v0.2.0 - New Features\" -n release-notes.md"
    echo "  $0 -v 1.0.0-beta -t \"v1.0.0-beta\" -n notes.md -p -d"
    exit 1
}

# 인자 파싱
while [[ $# -gt 0 ]]; do
    case $1 in
        -v|--version)
            VERSION="$2"
            shift 2
            ;;
        -t|--title)
            TITLE="$2"
            shift 2
            ;;
        -n|--notes-file)
            NOTES_FILE="$2"
            shift 2
            ;;
        -b|--target)
            TARGET_BRANCH="$2"
            shift 2
            ;;
        -d|--draft)
            DRAFT_MODE=true
            shift
            ;;
        -p|--prerelease)
            PRERELEASE=true
            shift
            ;;
        --no-latest)
            LATEST=false
            shift
            ;;
        -a|--attach)
            ATTACH_FILES="$2"
            shift 2
            ;;
        -h|--help)
            usage
            ;;
        *)
            echo -e "${RED}Error: Unknown option: $1${NC}"
            usage
            ;;
    esac
done

# 필수 인자 확인
if [[ -z "$VERSION" ]]; then
    echo -e "${RED}Error: Version is required${NC}"
    usage
fi

if [[ -z "$TITLE" ]]; then
    echo -e "${RED}Error: Title is required${NC}"
    usage
fi

if [[ -z "$NOTES_FILE" ]]; then
    echo -e "${RED}Error: Notes file is required${NC}"
    usage
fi

# 릴리즈 노트 파일 존재 확인
if [[ ! -f "$NOTES_FILE" ]]; then
    echo -e "${RED}Error: Release notes file not found: $NOTES_FILE${NC}"
    exit 1
fi

# GitHub CLI 설치 확인 및 경로 설정
GH_CLI=""
if command -v gh &> /dev/null; then
    GH_CLI="gh"
elif [[ -f "/c/Program Files/GitHub CLI/gh" ]]; then
    GH_CLI="/c/Program Files/GitHub CLI/gh"
elif [[ -f "/c/Program Files/GitHub CLI/gh.exe" ]]; then
    GH_CLI="/c/Program Files/GitHub CLI/gh.exe"
else
    echo -e "${RED}Error: GitHub CLI (gh) is not installed${NC}"
    echo -e "${YELLOW}Please install it with: winget install --id GitHub.cli${NC}"
    exit 1
fi

# GitHub CLI 인증 확인
if ! "$GH_CLI" auth status &> /dev/null; then
    echo -e "${RED}Error: GitHub CLI is not authenticated${NC}"
    echo -e "${YELLOW}Please run: gh auth login${NC}"
    exit 1
fi

# 버전 태그 생성 (v 접두사 추가)
TAG="v$VERSION"

echo -e "${BLUE}===========================================${NC}"
echo -e "${BLUE}GitHub Release 생성${NC}"
echo -e "${BLUE}===========================================${NC}"
echo -e "Tag:          ${GREEN}$TAG${NC}"
echo -e "Title:        ${GREEN}$TITLE${NC}"
echo -e "Target:       ${GREEN}$TARGET_BRANCH${NC}"
echo -e "Notes File:   ${GREEN}$NOTES_FILE${NC}"
echo -e "Draft:        ${GREEN}$DRAFT_MODE${NC}"
echo -e "Pre-release:  ${GREEN}$PRERELEASE${NC}"
echo -e "Latest:       ${GREEN}$LATEST${NC}"
if [[ -n "$ATTACH_FILES" ]]; then
    echo -e "Attachments:  ${GREEN}$ATTACH_FILES${NC}"
fi
echo -e "${BLUE}===========================================${NC}"
echo ""

# gh release create 명령 구성
GH_CMD="\"$GH_CLI\" release create \"$TAG\""
GH_CMD="$GH_CMD --title \"$TITLE\""
GH_CMD="$GH_CMD --notes-file \"$NOTES_FILE\""
GH_CMD="$GH_CMD --target \"$TARGET_BRANCH\""

if [[ "$DRAFT_MODE" == true ]]; then
    GH_CMD="$GH_CMD --draft"
fi

if [[ "$PRERELEASE" == true ]]; then
    GH_CMD="$GH_CMD --prerelease"
fi

if [[ "$LATEST" == false ]]; then
    GH_CMD="$GH_CMD --latest=false"
fi

# 첨부 파일이 있는 경우 추가
if [[ -n "$ATTACH_FILES" ]]; then
    IFS=',' read -ra FILES <<< "$ATTACH_FILES"
    for file in "${FILES[@]}"; do
        file=$(echo "$file" | xargs)  # trim whitespace
        if [[ -f "$file" ]]; then
            GH_CMD="$GH_CMD \"$file\""
        else
            echo -e "${YELLOW}Warning: Attachment file not found: $file (skipping)${NC}"
        fi
    done
fi

echo -e "${YELLOW}Executing command:${NC}"
echo -e "${BLUE}$GH_CMD${NC}"
echo ""

# 릴리즈 생성 실행
if eval "$GH_CMD"; then
    echo ""
    echo -e "${GREEN}✓ Release created successfully!${NC}"
    
    # 릴리즈 URL 출력
    REPO=$("$GH_CLI" repo view --json nameWithOwner -q .nameWithOwner)
    if [[ "$DRAFT_MODE" == true ]]; then
        echo -e "${YELLOW}Draft Release URL:${NC} https://github.com/$REPO/releases"
    else
        echo -e "${GREEN}Release URL:${NC} https://github.com/$REPO/releases/tag/$TAG"
    fi
    
    exit 0
else
    echo ""
    echo -e "${RED}✗ Failed to create release${NC}"
    echo -e "${YELLOW}Possible reasons:${NC}"
    echo -e "  - Tag '$TAG' already exists"
    echo -e "  - No permission to create releases"
    echo -e "  - Network issues"
    exit 1
fi

./agent/workflows/release-automation.md

더보기

---
description: GitHub Release Automation Workflow - From Release Note Generation to Deployment
---

# GitHub Release Automation Workflow

This workflow performs Git log analysis, release note generation, and automatic GitHub Release deployment after user approval.

## Prerequisites

1. **GitHub CLI Installation Check**

   ```bash
   gh --version
   ```

   If not installed:

   ```bash
   winget install --id GitHub.cli
   ```

2. **GitHub CLI Authentication**
   ```bash
   gh auth login
   ```

## Workflow Steps

### 1. Git Log Analysis and Release Note Generation

Analyze Git logs to generate date-based release notes:

```bash
git log --pretty=format:"%H|%ad|%s|%an" --date=short --all > /tmp/git-log.txt
```

AI analyzes these logs to automatically generate release notes.

### 2. Check Current Version from package.json

// turbo

```bash
cat package.json | grep version
```

Check current version and determine next release version.

### 3. Generate Release Title

Summarize major changes from Git logs to create release title.

Format: `v{version} - {Summary of major features}`

Examples:

- `v0.2.0 - Factory Method Pattern & Performance Improvements`
- `v1.0.0 - Major Architecture Refactoring`
- `v0.3.0-beta - New Animation System (Beta)`

### 4. Save Release Notes Artifact

Save generated release notes to:

- `C:\Users\Lee\.gemini\antigravity\brain\{conversation-id}\release-notes.md`

### 5. Request User Approval

Request user to review release notes via `notify_user()`.

**User Verification Checklist:**

- [ ] Are the release notes accurate?
- [ ] Is the version number appropriate?
- [ ] Are there any missing changes?
- [ ] Should it be marked as Pre-release?

### 6. Determine GitHub Release Creation Options

After user approval, determine the following options:

| Option         | Description                          | Default                     |
| :------------- | :----------------------------------- | :-------------------------- |
| `--draft`      | Create in Draft mode (not published) | false (publish immediately) |
| `--prerelease` | Mark as Pre-release (beta/alpha)     | false                       |
| `--target`     | Target branch                        | main                        |
| `--no-latest`  | Don't set as latest release          | false (set as latest)       |

### 7. Create GitHub Release

Create release using helper script:

**Basic Release (Immediate Publishing):**

```bash
bash .agents/scripts/create-github-release.sh \
  --version "0.2.0" \
  --title "v0.2.0 - Factory Method Pattern & Performance Improvements" \
  --notes-file "C:\Users\Lee\.gemini\antigravity\brain\{conversation-id}\release-notes.md" \
  --target "main"
```

**Draft Release (Manual Publishing After Review):**

```bash
bash .agents/scripts/create-github-release.sh \
  --version "0.2.0" \
  --title "v0.2.0 - New Features" \
  --notes-file "release-notes.md" \
  --draft
```

**Pre-release (Beta/Alpha Version):**

```bash
bash .agents/scripts/create-github-release.sh \
  --version "1.0.0-beta.1" \
  --title "v1.0.0-beta.1 - Beta Release" \
  --notes-file "release-notes.md" \
  --prerelease
```

**Attach Binary Files:**

```bash
bash .agents/scripts/create-github-release.sh \
  --version "0.2.0" \
  --title "v0.2.0 - Release" \
  --notes-file "release-notes.md" \
  --attach "dist/bundle.zip,dist/app.exe"
```

### 8. Verify Results

After successful release creation:

1. **Check Release URL**
   - Published release: `https://github.com/{owner}/{repo}/releases/tag/v{version}`
   - Draft release: `https://github.com/{owner}/{repo}/releases`

2. **Verify Git Tag**

   ```bash
   git tag -l
   ```

3. **Check on GitHub Web**
   - Visit releases page
   - Review release notes content
   - Edit or delete if needed

## Troubleshooting

### GitHub CLI Authentication Error

```bash
gh auth login
```

Log in with your GitHub account in browser

### Tag Already Exists

```bash
# Delete existing tag (use with caution)
git tag -d v0.2.0
git push origin :refs/tags/v0.2.0
```

### Recreate Release After Deletion

```bash
# Delete release
gh release delete v0.2.0 --yes

# Delete tag
git tag -d v0.2.0
git push origin :refs/tags/v0.2.0

# Recreate
bash .agents/scripts/create-github-release.sh ...
```

## Version Management Strategy

### Semantic Versioning (Recommended)

- **MAJOR.MINOR.PATCH** format (e.g., 1.2.3)
- **MAJOR**: Breaking changes
- **MINOR**: New features with backward compatibility
- **PATCH**: Bug fixes with backward compatibility

### Pre-release Versions

- **Alpha**: `1.0.0-alpha.1`, `1.0.0-alpha.2`
- **Beta**: `1.0.0-beta.1`, `1.0.0-beta.2`
- **RC (Release Candidate)**: `1.0.0-rc.1`, `1.0.0-rc.2`

## Automation Tips

1. **Auto-increment package.json Version**

   ```bash
   npm version patch  # 0.1.0 -> 0.1.1
   npm version minor  # 0.1.1 -> 0.2.0
   npm version major  # 0.2.0 -> 1.0.0
   ```

2. **Reuse Release Note Templates**
   - Generate new notes based on previous release notes
   - Auto-organize date-based sections

3. **Draft-First Strategy**
   - Create as Draft first
   - Final review on GitHub web
   - Manually publish

./agent/github/generate-release-note.md

더보기

---
name: generate_and_publish_release
description: Generates GitHub release notes from git log, requests user approval, and optionally publishes to GitHub Releases with full customization
disable-model-invocation: false
argument-hint: version (string, optional), prerelease (boolean), draft (boolean), target-branch (string)
---

# GitHub Release Automation Skill

This skill analyzes Git logs to generate release notes and automatically deploys GitHub Releases after user approval.

## 🎯 Objective

1. **Automatic Release Note Generation**: Analyze Git commit history by date to create professional release notes
2. **User Approval Process**: Users review and approve generated release notes
3. **Automatic GitHub Release Deployment**: Auto-generate releases via GitHub CLI after approval

## 📋 Prerequisites

### GitHub CLI Installation and Authentication

This skill uses GitHub CLI (`gh`):

```bash
# Check installation
gh --version

# Install on Windows (if not installed)
winget install --id GitHub.cli

# Authenticate
gh auth login
```

## 🔄 Execution Flow

### Phase 1: Release Note Generation

1. **Collect Git Logs**

   ```bash
   git log --pretty=format:"%H|%ad|%s|%an" --date=short --all
   ```

2. **Organize by Date**
   - Group commits by date
   - Categorize each commit (Features, Bug Fixes, Refactoring, etc.)

3. **Generate Release Title**
   - Format: `v{version} - {Summary of major changes}`
   - Example: `v0.2.0 - Factory Method Pattern & Performance Improvements`

4. **Write Release Notes**
   - Organize into date-based sections
   - Categorize each change
   - Output in Markdown format

### Phase 2: User Approval

Save generated release notes as artifact and request review via `notify_user()`:

**User Verification Items:**

- ✅ Are the release notes accurate?
- ✅ Is the version number appropriate?
- ✅ Are there any missing changes?
- ✅ Should it be created as Draft or published immediately?
- ✅ Should it be marked as Pre-release?

### Phase 3: GitHub Release Deployment

After user approval, execute the following steps:

1. **Verify GitHub CLI**

   ```bash
   gh --version
   gh auth status
   ```

2. **Extract Version Information**
   - Read current version from `package.json`
   - Use user-specified version (optional)

3. **Create Release**

   ```bash
   bash .agents/scripts/create-github-release.sh \
     --version "{version}" \
     --title "{release_title}" \
     --notes-file "release-notes.md" \
     --target "{branch}" \
     [--draft] [--prerelease]
   ```

4. **Return Results**
   - Provide Release URL
   - Output success/failure message

## 📝 Release Note Template

Generated release notes follow this format:

```markdown
# Release Notes

## YYYY-MM-DD

### ✨ Features

- **Feature Name**: Description ([`commit-hash`](link))

### 🐛 Bug Fixes

- **Fix Description**: Description ([`commit-hash`](link))

### 🔄 Refactoring

- **Refactoring Details**: Description ([`commit-hash`](link))

### 📝 Documentation

- **Documentation Update**: Description ([`commit-hash`](link))

---

## Summary of Key Changes

### 🎯 Core Features

- Major feature 1
- Major feature 2

### 🏗️ Architecture

- Architecture changes
```

## ⚙️ GitHub Release Options

### Basic Options

| Option    | Description                   | Default                   |
| :-------- | :---------------------------- | :------------------------ |
| `version` | Release version (e.g., 0.2.0) | version from package.json |
| `title`   | Release title                 | Auto-generated            |
| `target`  | Target branch                 | main                      |

### Advanced Options

| Option         | Description                 | When to Use                                             |
| :------------- | :-------------------------- | :------------------------------------------------------ |
| `--draft`      | Create in Draft mode        | When you want manual review before publishing on GitHub |
| `--prerelease` | Mark as Pre-release         | For beta/alpha versions                                 |
| `--no-latest`  | Don't set as latest release | When patching old versions                              |
| `--attach`     | Attach binary files         | When deploying build artifacts                          |

## 🏷️ Commit Classification Rules

Analyze Git commit messages and auto-categorize into:

| Category      | Keywords                              | Emoji |
| :------------ | :------------------------------------ | :---- |
| Features      | `feat`, `add`, `implement`, `new`     | ✨    |
| Bug Fixes     | `fix`, `resolve`, `patch`, `hotfix`   | 🐛    |
| Refactoring   | `refactor`, `clean`, `structure`      | 🔄    |
| Performance   | `optimize`, `speed`, `seo`, `perf`    | ⚡    |
| Documentation | `docs`, `readme`, `comment`           | 📝    |
| UI/UX         | `ui`, `design`, `style`, `component`  | 🎨    |
| DevOps        | `deploy`, `ci/cd`, `webhook`, `build` | ⚙️    |

## 📋 Usage Examples

### Example 1: Basic Release (Immediate Publishing)

**User Request:**

> "Generate v0.2.0 release notes and deploy to GitHub"

**AI Execution:**

1. Analyze Git logs
2. Generate release notes (organize changes by date)
3. Request user review
4. After approval:
   ```bash
   bash .agents/scripts/create-github-release.sh \
     --version "0.2.0" \
     --title "v0.2.0 - New Features & Improvements" \
     --notes-file "release-notes.md"
   ```

### Example 2: Draft Release (Manual Review Before Publishing)

**User Request:**

> "Create v1.0.0 release as Draft"

**AI Execution:**

1. Generate release notes
2. After user approval:
   ```bash
   bash .agents/scripts/create-github-release.sh \
     --version "1.0.0" \
     --title "v1.0.0 - Major Release" \
     --notes-file "release-notes.md" \
     --draft
   ```
3. Can be manually published on GitHub web

### Example 3: Pre-release (Beta Version)

**User Request:**

> "Create v2.0.0-beta.1 beta release"

**AI Execution:**

```bash
bash .agents/scripts/create-github-release.sh \
  --version "2.0.0-beta.1" \
  --title "v2.0.0-beta.1 - Beta Release" \
  --notes-file "release-notes.md" \
  --prerelease
```

## 🚫 Constraints

- Do not add features that are not in Git logs
- Maintain professional and clear tone in release notes
- Do not display category sections if they have no items
- Do not create GitHub Release without user approval

## 🔧 Troubleshooting

### GitHub CLI Not Installed

```
Error: GitHub CLI (gh) is not installed
Solution: winget install --id GitHub.cli
```

### Authentication Error

```
Error: GitHub CLI is not authenticated
Solution: gh auth login
```

### Tag Duplicate Error

```
Error: Tag already exists
Solution:
1. Delete existing release: gh release delete v0.2.0 --yes
2. Delete tag: git tag -d v0.2.0 && git push origin :refs/tags/v0.2.0
3. Recreate
```

## 📚 Related Files

- **Helper Script**: `.agents/scripts/create-github-release.sh`
- **Workflow Documentation**: `.agents/workflows/release-automation.md`
- **Release Notes Artifact**: `C:\Users\Lee\.gemini\antigravity\brain\{conversation-id}\release-notes.md`

 

728x90