RECIPE 062
Jira 이슈 → GitHub PR 자동 연동
- ▸Jira 이슈 상태 변경 시 연관 GitHub PR 자동 업데이트
- ▸PR 머지 시 Jira 이슈를 자동으로 완료 처리
- ▸일일 미해결 이슈 현황을 Slack에 자동 요약
✅사전 준비
- □Jira API 토큰 발급 (https://id.atlassian.com/manage-profile/security/api-tokens)
- □GitHub Personal Access Token 발급 (repo, issues 권한)
- □Jira 프로젝트 키 확인 (예: PROJ)
- □GitHub 웹훅 등록 (Settings → Webhooks)
Jira 이슈 상태 업데이트 (Transition)
Node: HTTP Request
Method: POST
URL: https://YOUR_DOMAIN.atlassian.net/rest/api/3/issue/{{ $json.issue.key }}/transitions
Authentication: Basic Auth
Username: YOUR_EMAIL
Password: YOUR_API_TOKEN
Body:
{
"transition": {
"id": "{{ $json.transition_id }}"
}
}
// 주요 Transition ID
// 11: To Do → In Progress
// 21: In Progress → DoneGitHub PR 머지 이벤트 수신
Node: Webhook
Path: /github-webhook
// PR 머지 감지 조건 (IF 노드)
Condition 1: {{ $json.action }} == 'closed'
Condition 2: {{ $json.pull_request.merged }} == true
// Jira 이슈 키 추출 (PR 제목에서)
const match = $json.pull_request.title.match(/[A-Z]+-[0-9]+/);
const issueKey = match ? match[0] : null;💡 TIPPR 제목 또는 브랜치명에 Jira 이슈 키(예: PROJ-123)를 포함하는 팀 컨벤션을 정하면, 정규식으로 쉽게 연동할 수 있습니다.
⚡
워크플로우 JSON
아래 JSON을 복사해 n8n에 바로 임포트하세요
📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
"recipeId": "recipe062",
"title": "인보이스 PDF 자동 생성 & 고객 발송",
"chapter": 6,
"category": "재무 & 정산 자동화",
"difficulty": "⭐⭐⭐",
"estimatedTime": "50분",
"usedApps": [
"Google Sheets",
"Google Docs",
"Gmail"
],
"description": "구글 시트에 프로젝트명·금액·고객 이메일·결제 기한을 입력하면, Google Docs 인보이스 템플릿에 데이터를 자동으로 채워 새 문서를 생성하고, PDF로 변환해 고객에게 Gmail로 자동 발송합니다. 발송 완료 상태와 시간도 시트에 자동 기록됩니다.",
"nodes": [
{
"id": "node1",
"type": "n8n-nodes-base.googleSheetsTrigger",
"name": "새 인보이스 행 감지",
"parameters": {
"spreadsheetId": "={{$env.INVOICE_SHEET_ID}}",
"sheetName": "인보이스목록",
"triggerOn": "rowAdded"
}
},
{
"id": "node2",
"type": "n8n-nodes-base.googleDocs",
"name": "인보이스 문서 생성",
"parameters": {
"operation": "create",
"title": "인보이스_{{$json['프로젝트명']}}_{{$now.format('YYYYMMDD')}}",
"templateId": "={{$env.INVOICE_TEMPLATE_DOC_ID}}",
"placeholders": {
"{{고객명}}": "={{$json['고객명']}}",
"{{프로젝트명}}": "={{$json['프로젝트명']}}",
"{{금액}}": "={{$json['금액']}}",
"{{결제기한}}": "={{$json['결제기한']}}",
"{{발행일}}": "={{$now.format('YYYY년 MM월 DD일')}}"
}
}
},
{
"id": "node3",
"type": "n8n-nodes-base.googleDrive",
"name": "PDF 변환",
"parameters": {
"operation": "download",
"fileId": "={{$json['documentId']}}",
"mimeType": "application/pdf"
}
},
{
"id": "node4",
"type": "n8n-nodes-base.gmail",
"name": "고객에게 인보이스 발송",
"parameters": {
"operation": "send",
"to": "={{$node['새 인보이스 행 감지'].json['고객이메일']}}",
"subject": "[인보이스] {{$node['새 인보이스 행 감지'].json['프로젝트명']}} 청구서 발송",
"message": "안녕하세요, {{$node['새 인보이스 행 감지'].json['고객명']}}님.\n\n{{$node['새 인보이스 행 감지'].json['프로젝트명']}}에 대한 인보이스를 첨부 파일로 보내드립니다.\n\n결제 기한: {{$node['새 인보이스 행 감지'].json['결제기한']}}\n청구 금액: ₩{{$node['새 인보이스 행 감지'].json['금액']}}\n\n문의 사항은 언제든지 연락 주세요.\n감사합니다.",
"attachments": "data"
}
},
{
"id": "node5",
"type": "n8n-nodes-base.googleSheets",
"name": "발송 완료 상태 기록",
"parameters": {
"operation": "update",
"spreadsheetId": "={{$env.INVOICE_SHEET_ID}}",
"sheetName": "인보이스목록",
"columns": {
"mappingMode": "defineBelow",
"value": {
"상태": "발송완료",
"발송시간": "={{$now.format('YYYY-MM-DD HH:mm')}}"
}
}
}
}
],
"envVariables": {
"INVOICE_SHEET_ID": "Google Sheets 인보이스 목록 시트 ID",
"INVOICE_TEMPLATE_DOC_ID": "Google Docs 인보이스 템플릿 문서 ID"
},
"tips": [
"Google Docs 템플릿에서 {{고객명}}, {{프로젝트명}} 등 자리표시자를 미리 만들어두면 노드에서 자동으로 치환됩니다.",
"내부 Slack에도 '인보이스 발송 완료' 알림 노드를 추가하면 팔로업 타이밍을 놓치지 않아요.",
"레시피 064(미수금 리마인더)와 연결하면 결제 기한 초과 시 자동으로 입금 독촉 이메일까지 발송됩니다."
],
"qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe062"
}