Skip to content

[Feat] #91 - ๊ตฌ๋งคํŽ˜์ด์ง€ API ์—ฐ๋™ #49

[Feat] #91 - ๊ตฌ๋งคํŽ˜์ด์ง€ API ์—ฐ๋™

[Feat] #91 - ๊ตฌ๋งคํŽ˜์ด์ง€ API ์—ฐ๋™ #49

Workflow file for this run

name: Auto Create Branch
on:
issues:
types: [opened]
jobs:
create-branch:
runs-on: ubuntu-latest
permissions:
contents: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0
- name: Extract branch name from issue form
id: extract
run: |
# Issue body๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅ (ํŠน์ˆ˜๋ฌธ์ž ์ฒ˜๋ฆฌ)
cat << 'EOF' > issue_body.txt
${{ github.event.issue.body }}
EOF
# ์ด์Šˆ ์ œ๋ชฉ ์ €์žฅ
ISSUE_TITLE="${{ github.event.issue.title }}"
echo "ํ˜„์žฌ ์ด์Šˆ ์ œ๋ชฉ: $ISSUE_TITLE"
# ๋ธŒ๋žœ์น˜๋ช… ์ถ”์ถœ ("๋ธŒ๋žœ์น˜๋ช…" ๋˜๋Š” "Branch" ์„น์…˜)
BRANCH_NAME=$(grep -A 2 "๋ธŒ๋žœ์น˜๋ช…\|Branch" issue_body.txt | tail -1 | xargs)
# ๋ธŒ๋žœ์น˜๋ช… ์žฌ์ถ”์ถœ (๋นˆ ์ค„์ด๋‚˜ ํ—ค๋”๊ฐ€ ์ถ”์ถœ๋œ ๊ฒฝ์šฐ)
if [ -z "$BRANCH_NAME" ] || [[ "$BRANCH_NAME" == "###"* ]] || [[ "$BRANCH_NAME" == "๐ŸŒณ"* ]]; then
BRANCH_NAME=$(sed -n '/Branch/,/###/{/Branch/n; /###/!p;}' issue_body.txt | grep -v "^$" | head -1 | xargs)
fi
# ๋ธŒ๋žœ์น˜ ํƒ€์ž… ์ถ”์ถœ ("๋ธŒ๋žœ์น˜ ํƒ€์ž…" ๋˜๋Š” "branchType" ์„น์…˜)
BRANCH_TYPE=$(grep -A 2 "๋ธŒ๋žœ์น˜ ํƒ€์ž…\|branchType" issue_body.txt | tail -1 | xargs)
# ๋ธŒ๋žœ์น˜ ํƒ€์ž… ์žฌ์ถ”์ถœ (๋นˆ ์ค„์ด๋‚˜ ํ—ค๋”๊ฐ€ ์ถ”์ถœ๋œ ๊ฒฝ์šฐ)
if [ -z "$BRANCH_TYPE" ] || [[ "$BRANCH_TYPE" == "###"* ]] || [[ "$BRANCH_TYPE" == "๐Ÿ“‚"* ]]; then
BRANCH_TYPE=$(sed -n '/๋ธŒ๋žœ์น˜ ํƒ€์ž…/,/###/{/๋ธŒ๋žœ์น˜ ํƒ€์ž…/n; /###/!p;}' issue_body.txt | grep -v "^$" | head -1 | xargs)
fi
echo "์ถ”์ถœ๋œ ๋ธŒ๋žœ์น˜ ํƒ€์ž…: $BRANCH_TYPE"
# ์ด์Šˆ ์ œ๋ชฉ ์ƒ์„ฑ ([Type] #๋ฒˆํ˜ธ - ์ œ๋ชฉ ํ˜•์‹)
if [ -n "$BRANCH_TYPE" ] && [ -n "$ISSUE_TITLE" ]; then
if [[ ! "$ISSUE_TITLE" =~ ^\[.*\] ]]; then
# ํŒŒ์Šค์นผ์ผ€์ด์Šค ๋ณ€ํ™˜
BRANCH_TYPE_PASCAL=$(echo "$BRANCH_TYPE" | sed 's/\b\(.\)/\u\1/')
NEW_ISSUE_TITLE="[${BRANCH_TYPE_PASCAL}] #${{ github.event.issue.number }} - ${ISSUE_TITLE}"
echo "์ƒˆ๋กœ์šด ์ด์Šˆ ์ œ๋ชฉ: $NEW_ISSUE_TITLE"
else
NEW_ISSUE_TITLE="$ISSUE_TITLE"
echo "์ด์Šˆ ์ œ๋ชฉ์— ์ด๋ฏธ ํƒ€์ž…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค."
fi
else
NEW_ISSUE_TITLE="$ISSUE_TITLE"
fi
# ๋ธŒ๋žœ์น˜๋ช… ์ƒ์„ฑ
if [ -z "$BRANCH_NAME" ]; then
echo "๋ธŒ๋žœ์น˜๋ช…์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ."
BRANCH_NAME="issue-${{ github.event.issue.number }}"
else
# Git ๋ธŒ๋žœ์น˜๋ช… ๊ทœ์น™์— ๋งž๊ฒŒ ์ •์ œ (ํ•œ๊ธ€ ํ—ˆ์šฉ)
# 1. ๊ณต๋ฐฑ์„ ํ•˜์ดํ”ˆ์œผ๋กœ ๋ณ€๊ฒฝ
BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/ /-/g')
# 2. Git ๋น„ํ—ˆ์šฉ ํŠน์ˆ˜๋ฌธ์ž ์ œ๊ฑฐ (:, ^, ~, ?, *, [, \, .., @{)
BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/[:^~?*\[\\]//g; s/\.\.//g; s/@{//g')
# 3. ์—ฐ์†๋œ ํ•˜์ดํ”ˆ/์Šฌ๋ž˜์‹œ ์ œ๊ฑฐ
BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/--*/-/g; s/\/\/*\//\//g')
# 4. ์•ž๋’ค ํ•˜์ดํ”ˆ/์Šฌ๋ž˜์‹œ/์  ์ œ๊ฑฐ
BRANCH_NAME=$(echo "$BRANCH_NAME" | sed 's/^[-\/\.]*//; s/[-\/\.]*$//')
# 5. ๋นˆ ๋ฌธ์ž์—ด ๊ฒ€์ฆ
if [ -z "$BRANCH_NAME" ]; then
echo "์ •์ œ ํ›„ ๋ธŒ๋žœ์น˜๋ช…์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ."
BRANCH_NAME="issue-${{ github.event.issue.number }}"
else
# ๋ธŒ๋žœ์น˜ ํƒ€์ž… prefix ์ถ”๊ฐ€ (type/)
if [ -n "$BRANCH_TYPE" ]; then
if [[ ! "$BRANCH_NAME" =~ ^$BRANCH_TYPE/ ]]; then
BRANCH_NAME="${BRANCH_TYPE}/${BRANCH_NAME}"
fi
fi
# ์ด์Šˆ๋ฒˆํ˜ธ prefix ์ถ”๊ฐ€ (๋ฒˆํ˜ธ-)
BRANCH_NAME="${{ github.event.issue.number }}-$BRANCH_NAME"
fi
fi
echo "์ตœ์ข… ๋ธŒ๋žœ์น˜๋ช…: $BRANCH_NAME"
echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
echo "new_issue_title=$NEW_ISSUE_TITLE" >> $GITHUB_OUTPUT
echo "branch_type=$BRANCH_TYPE" >> $GITHUB_OUTPUT
# ์ž„์‹œ ํŒŒ์ผ ์ •๋ฆฌ
rm -f issue_body.txt
- name: Update issue title and labels
run: |
NEW_TITLE="${{ steps.extract.outputs.new_issue_title }}"
BRANCH_TYPE="${{ steps.extract.outputs.branch_type }}"
# ๋ธŒ๋žœ์น˜ ํƒ€์ž…๋ณ„ ์ด๋ชจ์ง€ ๋ผ๋ฒจ ๋งคํ•‘
case "$BRANCH_TYPE" in
"feat") LABEL="โœจFeature" ;;
"fix") LABEL="๐Ÿ›BugFix" ;;
"hotfix") LABEL="๐ŸšจHotfix" ;;
"refactor") LABEL="โ™ป๏ธRefactor" ;;
"test") LABEL="โœ…Test" ;;
"docs") LABEL="๐Ÿ“Docs" ;;
"chore") LABEL="๐Ÿ› ๏ธ Chore" ;;
*) LABEL="$BRANCH_TYPE" ;;
esac
# ์ด์Šˆ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ (์ œ๋ชฉ, ๋ผ๋ฒจ, ๋‹ด๋‹น์ž)
if [ -n "$NEW_TITLE" ] && [ -n "$LABEL" ]; then
curl -X PATCH \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }} \
-d "{\"title\":\"$NEW_TITLE\",\"labels\":[\"$LABEL\"],\"assignees\":[\"${{ github.event.issue.user.login }}\"]}"
echo "์ด์Šˆ ์ œ๋ชฉ ์—…๋ฐ์ดํŠธ: $NEW_TITLE"
echo "๋ผ๋ฒจ ์„ค์ •: $LABEL"
echo "๋‹ด๋‹น์ž ํ• ๋‹น: ${{ github.event.issue.user.login }}"
fi
- name: Create branch
run: |
BRANCH_NAME="${{ steps.extract.outputs.branch_name }}"
# Git ์„ค์ •
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
# Main ๋ธŒ๋žœ์น˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
git checkout main
git pull origin main
git checkout -b "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
echo "๋ธŒ๋žœ์น˜ '$BRANCH_NAME' ์ƒ์„ฑ ์™„๋ฃŒ"
- name: Add comment to issue
env:
BRANCH_NAME: ${{ steps.extract.outputs.branch_name }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# ์ด์Šˆ์— ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ์•Œ๋ฆผ ๋Œ“๊ธ€ ์ถ”๊ฐ€
COMMENT=$(cat <<EOF
๐ŸŒฟ ๋ธŒ๋žœ์น˜๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
\`\`\`
$BRANCH_NAME
\`\`\`
EOF
)
gh issue comment ${{ github.event.issue.number }} --body "$COMMENT"
echo "์ด์Šˆ์— ๋Œ“๊ธ€ ์ถ”๊ฐ€ ์™„๋ฃŒ"