Skip to content

jira-subtask-assigned #51

jira-subtask-assigned

jira-subtask-assigned #51

name: Create GitHub Issue from Jira Subtask
on:
repository_dispatch:
types: [jira-subtask-assigned]
permissions:
issues: write
contents: read
jobs:
create-github-issue:
runs-on: ubuntu-latest
steps:
- name: Extract Jira Data
id: extract-data
run: |
echo "=== Jira Webhook Data ==="
echo "Issue Key: ${{ github.event.client_payload.issue_key }}"
echo "Summary: ${{ github.event.client_payload.summary }}"
echo "Assignee: ${{ github.event.client_payload.assignee }}"
echo "Parent Key: ${{ github.event.client_payload.parent_key }}"
echo "Description: (처리 쀑...)"
echo "=========================="
# 데이터 정리 - base64 μΈμ½”λ”©μœΌλ‘œ μ•ˆμ „ν•˜κ²Œ 처리
JIRA_KEY="${{ github.event.client_payload.issue_key }}"
TITLE="${{ github.event.client_payload.summary }}"
ASSIGNEE="${{ github.event.client_payload.assignee }}"
PARENT="${{ github.event.client_payload.parent_key }}"
# Description을 base64둜 μΈμ½”λ”©ν•˜μ—¬ μ•ˆμ „ν•˜κ²Œ 처리
DESC_RAW="${{ github.event.client_payload.description }}"
if [ -n "$DESC_RAW" ]; then
DESC_B64=$(echo -n "$DESC_RAW" | base64 -w 0)
else
DESC_B64=""
fi
echo "JIRA_KEY=$JIRA_KEY" >> $GITHUB_OUTPUT
echo "TITLE=$TITLE" >> $GITHUB_OUTPUT
echo "ASSIGNEE=$ASSIGNEE" >> $GITHUB_OUTPUT
echo "PARENT=$PARENT" >> $GITHUB_OUTPUT
echo "DESC_B64=$DESC_B64" >> $GITHUB_OUTPUT
- name: Check if assigned to me
id: check-assignee
run: |
ASSIGNEE="${{ steps.extract-data.outputs.ASSIGNEE }}"
MY_JIRA_EMAIL="${{ secrets.JIRA_USER_EMAIL }}"
if [[ "$ASSIGNEE" == "$MY_JIRA_EMAIL" ]]; then
echo "βœ… λ‚˜μ—κ²Œ ν• λ‹Ήλœ μž‘μ—…μž…λ‹ˆλ‹€"
echo "CREATE_ISSUE=true" >> $GITHUB_OUTPUT
else
echo "❌ λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ ν• λ‹Ήλœ μž‘μ—…μž…λ‹ˆλ‹€: $ASSIGNEE"
echo "CREATE_ISSUE=false" >> $GITHUB_OUTPUT
fi
- name: Create GitHub Issue
if: steps.check-assignee.outputs.CREATE_ISSUE == 'true'
id: create-issue
run: |
# base64 λ””μ½”λ”©ν•˜μ—¬ description 볡원
if [ -n "${{ steps.extract-data.outputs.DESC_B64 }}" ]; then
DESC_RAW=$(echo "${{ steps.extract-data.outputs.DESC_B64 }}" | base64 -d)
# Jira 이미지 λ§ˆν¬μ—… 제거 (!image.ext|...! ν˜•νƒœ)
DESC_DECODED=$(echo "$DESC_RAW" | sed 's/!image-[^!]*\.png[^!]*!//g' | sed 's/!image-[^!]*\.jpg[^!]*!//g' | sed 's/!image-[^!]*\.jpeg[^!]*!//g' | sed 's/!image-[^!]*\.gif[^!]*!//g')
else
DESC_DECODED="(μ„€λͺ… μ—†μŒ)"
fi
# GitHub 이슈 생성을 μœ„ν•œ JSON νŽ˜μ΄λ‘œλ“œ μ€€λΉ„
ISSUE_TITLE="[${{ steps.extract-data.outputs.JIRA_KEY }}] ${{ steps.extract-data.outputs.TITLE }}"
ISSUE_BODY=$(cat <<EOF
## πŸ“Œ Jira 정보
**🎟️ 이슈 ν‹°μΌ“**: [${{ steps.extract-data.outputs.JIRA_KEY }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.extract-data.outputs.JIRA_KEY }})
**πŸ“ μƒμœ„ ν‹°μΌ“**: [${{ steps.extract-data.outputs.PARENT }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.extract-data.outputs.PARENT }})
## πŸ“ μž‘μ—… μ„€λͺ…
${DESC_DECODED}
---
> πŸ’‘ 이 μ΄μŠˆλŠ” Jira μž‘μ—…κ³Ό μ—°λ™λ˜μ–΄ μžλ™ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
EOF
)
# GitHub APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 이슈 생성 (ν• λ‹Ήμž 포함)
RESPONSE=$(curl -s -X POST \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/${{ github.repository }}/issues" \
-d "{
\"title\": $(echo "$ISSUE_TITLE" | jq -R .),
\"body\": $(echo "$ISSUE_BODY" | jq -Rs .),
\"assignees\": [\"InKyungWoo\"]
}")
ISSUE_NUMBER=$(echo "$RESPONSE" | jq -r '.number')
ISSUE_ID=$(echo "$RESPONSE" | jq -r '.id')
echo "ISSUE_NUMBER=$ISSUE_NUMBER" >> $GITHUB_OUTPUT
echo "ISSUE_ID=$ISSUE_ID" >> $GITHUB_OUTPUT
echo "βœ… GitHub 이슈 #$ISSUE_NUMBER 생성 μ™„λ£Œ"
- name: Add to Organization Project
if: steps.check-assignee.outputs.CREATE_ISSUE == 'true'
env:
GH_TOKEN: ${{ secrets.PROJECT_TOKEN }}
run: |
ISSUE_NUMBER="${{ steps.create-issue.outputs.ISSUE_NUMBER }}"
# GitHub CLIλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ νŠΈμ— μΆ”κ°€
gh project item-add 2 --owner RunChuck --url "https://github.com/${{ github.repository }}/issues/${ISSUE_NUMBER}"
echo "βœ… 이슈 #${ISSUE_NUMBER}λ₯Ό ν”„λ‘œμ νŠΈμ— μΆ”κ°€ μ™„λ£Œ"
- name: Set Active Milestone
if: steps.check-assignee.outputs.CREATE_ISSUE == 'true'
run: |
ISSUE_NUMBER="${{ steps.create-issue.outputs.ISSUE_NUMBER }}"
# ν™œμ„± milestone μ°ΎκΈ° (open μƒνƒœμΈ 것듀)
MILESTONES=$(curl -s \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/${{ github.repository }}/milestones?state=open")
MILESTONE_COUNT=$(echo "$MILESTONES" | jq 'length')
if [ "$MILESTONE_COUNT" -eq 1 ]; then
# ν™œμ„± milestone이 μ •ν™•νžˆ ν•˜λ‚˜μΌ λ•Œλ§Œ μ„€μ •
MILESTONE_NUMBER=$(echo "$MILESTONES" | jq -r '.[0].number')
# μ΄μŠˆμ— milestone μ„€μ •
curl -s -X PATCH \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/${{ github.repository }}/issues/${ISSUE_NUMBER}" \
-d "{
\"milestone\": $MILESTONE_NUMBER
}"
echo "βœ… 이슈 #${ISSUE_NUMBER}에 milestone #${MILESTONE_NUMBER} μ„€μ • μ™„λ£Œ"
elif [ "$MILESTONE_COUNT" -eq 0 ]; then
echo "ℹ️ ν™œμ„± milestone이 μ—†μ–΄ μ„€μ •ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€"
else
echo "ℹ️ ν™œμ„± milestone이 ${MILESTONE_COUNT}개 μžˆμ–΄ μ„€μ •ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€"
fi