๐ ํธ์ถ ์ ๋ฉ์์ง: ์ด Skill์ด ํธ์ถ๋๋ฉด ๋ฐ๋์
[SEMO] Skill: trigger-deploy์์คํ ๋ฉ์์ง๋ฅผ ์ฒซ ์ค์ ์ถ๋ ฅํ์ธ์.
trigger-deploy Skill
GitHub Actions ๊ธฐ๋ฐ ํ๋ก์ ํธ ๋ณ์นญ ๊ธฐ๋ฐ ๋ฐฐํฌ ๋ฐ ์ํ ์กฐํ
โ ๏ธ deploy-service์ ํผ๋ ์ฃผ์: Docker/SSH ์ง์ ๋ฐฐํฌ๊ฐ ํ์ํ๋ฉด
deploy-service์ฌ์ฉ
๐ด trigger-deploy vs deploy-service ์ ํ ๊ธฐ์ค
| ์กฐ๊ฑด | ์ ํ ์คํฌ | ์ด์ |
|------|----------|------|
| ํ๋ก์ ํธ ๋ณ์นญ ์ฌ์ฉ (๋๋, ์คํผ์ค ๋ฑ) | deployer | projects.md์ ๋ณ์นญ ๋ฑ๋ก |
| "Milestone", "๋ฆด๋ฆฌ์ฆ" ์ธ๊ธ | deployer | GitHub ๋ฆด๋ฆฌ์ฆ ์ํฌํ๋ก์ฐ |
| GitHub Actions ๊ธฐ๋ฐ ๋ฐฐํฌ | deployer | CI/CD ์๋ ํธ๋ฆฌ๊ฑฐ |
| "Docker ๋น๋", "PM2" ์ธ๊ธ | deploy-service | SSH ์ง์ ์ ์ด |
| SSH ์ ๊ทผ ํ์ํ ์ง์ ๋ฐฐํฌ | deploy-service | ์๊ฒฉ ์๋ฒ ์ง์ ์ ๊ทผ |
| ms-* ๋ง์ดํฌ๋ก์๋น์ค ๋ฐฐํฌ | deploy-service | Docker + PM2 ๋ฐฉ์ |
Semicolon ๋ธ๋์น ์ ๋ต
| ํ๊ฒฝ | ๋ธ๋์น/ํ๊ทธ | ํธ๋ฆฌ๊ฑฐ | ์ค๋ช
|
|------|-------------|--------|------|
| DEV | dev | push | ๊ฐ๋ฐ ํ๊ฒฝ (๊ธฐ๋ณธ ๋ธ๋์น) |
| STG | release-x.x.x | Milestone Close | ๋ง์ผ์คํค ๊ธฐ๋ฐ ๋ฆด๋ฆฌ์ฆ ๋ธ๋์น |
| PRD | vx.x.x ํ๊ทธ | Production Tagging | ๋ฆด๋ฆฌ์ฆ ํ๊ทธ |
ํ๋ก์ ํธ ๋ณ์นญ ์ฐธ์กฐ
๋ฐ๋์ ๋จผ์ ์ฝ์ ํ์ผ: .claude/memory/projects.md
์ด ํ์ผ์์ ํ๋ก์ ํธ ๋ณ์นญ๊ณผ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ ํ์ธํฉ๋๋ค.
Workflow
1. ํ๋ก์ ํธ ์๋ณ
์
๋ ฅ: "๋๋ stg ๋ฐฐํฌํด์ค"
1. .claude/memory/projects.md ์ฝ๊ธฐ
2. "๋๋" โ semicolon-devteam/cm-land ๋งคํ
3. "stg" โ Milestone close ๋ฐฉ์ ํ์ธ
2. ํ๊ฒฝ๋ณ ๋ฐฐํฌ ์ ์ฐจ
DEV ๋ฐฐํฌ
# dev ๋ธ๋์น ์ํ ํ์ธ ๋ฐ push
gh api repos/{owner}/{repo}/branches/dev
STG ๋ฐฐํฌ
# 1. ์ด๋ฆฐ Milestone ๋ชฉ๋ก ์กฐํ
gh api repos/{owner}/{repo}/milestones --jq '.[] | select(.state=="open")'
# 2. ์ฌ์ฉ์์๊ฒ Milestone ์ ํ ์์ฒญ
# 3. Milestone Close
gh api repos/{owner}/{repo}/milestones/{number} -X PATCH -f state=closed
PRD ๋ฐฐํฌ
# 1. ์ด๋ฆฐ Milestone ์กฐํ
gh api repos/{owner}/{repo}/milestones --jq '.[] | select(.state=="open")'
# 2. source-tag ๋ผ๋ฒจ ํ์ธ/์ถ๊ฐ
gh api repos/{owner}/{repo}/labels --jq '.[].name' | grep source-tag
# 3. Milestone์ ๋ผ๋ฒจ์ด ์ฐ๊ฒฐ๋ ์ด์๊ฐ ์๋์ง ํ์ธ ํ Close
gh api repos/{owner}/{repo}/milestones/{number} -X PATCH -f state=closed
์ถ๋ ฅ ํฌ๋งท
[SEMO] deployer: ํ๋ก์ ํธ ์๋ณ ์๋ฃ
- ํ๋ก์ ํธ: cm-land (semicolon-devteam/cm-land)
- ํ๊ฒฝ: STG
- ๋ฐฉ๋ฒ: Milestone Close
[SEMO] deployer: Milestone ๋ชฉ๋ก ์กฐํ
1. v1.2.0 (์ด์ 5๊ฐ, PR 3๊ฐ)
2. v1.3.0 (์ด์ 2๊ฐ, PR 1๊ฐ)
๋ฐฐํฌํ Milestone์ ์ ํํด์ฃผ์ธ์: ___
[SEMO] deployer: Milestone 'v1.2.0' Close ์๋ฃ
โ STG ๋ฐฐํฌ๊ฐ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
โ GitHub Actions: https://github.com/semicolon-devteam/cm-land/actions
์ํ ์กฐํ Workflow
STG ํ์ฌ ๋ฐฐํฌ ๋ฒ์ ํ์ธ
# ์ต๊ทผ close๋ Milestone ์กฐํ (= STG์ ๋ฐฐํฌ๋ ๋ฒ์ )
gh api repos/{owner}/{repo}/milestones?state=closed --jq '.[0] | "v\(.title) - \(.closed_at | split("T")[0]) ๋ฐฐํฌ"'
# release- ๋ธ๋์น ๋ชฉ๋ก ์กฐํ
gh api repos/{owner}/{repo}/branches --jq '.[] | select(.name | startswith("release-")) | .name'
PRD ์ต์ ๋ฒ์ ํ์ธ
# ์ต์ ๋ฆด๋ฆฌ์ฆ ํ๊ทธ ์กฐํ
gh api repos/{owner}/{repo}/releases/latest --jq '"v\(.tag_name) - \(.published_at | split("T")[0]) ๋ฆด๋ฆฌ์ฆ"'
# ๋๋ ํ๊ทธ ๋ชฉ๋ก์์ ์กฐํ
gh api repos/{owner}/{repo}/tags --jq '.[0].name'
STG ๋ฐ์ ๋๊ธฐ ํญ๋ชฉ ์กฐํ
# Open ์ํ Milestone + ์ฐ๊ฒฐ๋ ์ด์/PR ์กฐํ
gh api repos/{owner}/{repo}/milestones?state=open --jq '.[] | {title, open_issues, html_url}'
# ํน์ Milestone์ ์ด์ ๋ชฉ๋ก
gh api "repos/{owner}/{repo}/issues?milestone={number}&state=all" --jq '.[] | "- #\(.number) \(.title) [\(.state)]"'
์ํ ์กฐํ ์ถ๋ ฅ ํฌ๋งท
[SEMO] deployer: ๋ฐฐํฌ ์ํ ์กฐํ
๐ฆ cm-land (semicolon-devteam/cm-land)
๐ข PRD: v1.2.2 (2025-12-10 ๋ฆด๋ฆฌ์ฆ)
๐ก STG: release-1.2.3 (2025-12-15 ๋ฐฐํฌ)
๐ต DEV: dev ๋ธ๋์น
๐ STG ๋ฐ์ ๋๊ธฐ:
- release-1.3.0 (Milestone Open)
- #45 [Feature] ์ ๊ธฐ๋ฅ ์ถ๊ฐ [open]
- #46 [Bug] ๋ฒ๊ทธ ์์ [closed]
์ฃผ์์ฌํญ
- PRD ๋ฐฐํฌ ์ ๋ฐ๋์ STG ๊ฒ์ฆ ์ฌ๋ถ ํ์ธ
- Milestone Close ์ ์ฐ๊ฒฐ๋ ์ด์/PR ์ํ ํ์ธ
- ๋ฐฐํฌ ์คํจ ์ GitHub Actions ๋ก๊ทธ ํ์ธ ์๋ด
References
- Milestones:
https://github.com/{owner}/{repo}/milestones - Releases:
https://github.com/{owner}/{repo}/releases - Actions:
https://github.com/{owner}/{repo}/actions