Skip to content

jira-subtask-assigned #52

jira-subtask-assigned

jira-subtask-assigned #52

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