-
Notifications
You must be signed in to change notification settings - Fork 0
151 lines (125 loc) · 6.25 KB
/
jira-to-github.yml
File metadata and controls
151 lines (125 loc) · 6.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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