발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
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 → Done

GitHub 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 클릭
{
  "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"
}
← 이전 레시피☰ 목차다음 레시피 →