AutomationFlowsAI & RAG › Automate Github, Jira Release Notes with Google Gemini & Notification Over Email

Automate Github, Jira Release Notes with Google Gemini & Notification Over Email

ByIntuz @intuz on n8n.io

It connects to GitHub and JIRA to gather data from recent commits and completed tickets, using specific keywords or labels to identify key features for inclusion.

Event trigger★★★★☆ complexityAI-powered16 nodesGithub TriggerChain LlmGoogle Gemini ChatEmail SendJiraOutput Parser Structured
AI & RAG Trigger: Event Nodes: 16 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #6129 — we link there as the canonical source.

This workflow follows the Chainllm → Emailsend recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "B9XHO1B8oUR04nOu",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "My workflow 19",
  "tags": [],
  "nodes": [
    {
      "id": "d2cc9623-ab49-4a56-8c22-f8a014253179",
      "name": "Github Trigger",
      "type": "n8n-nodes-base.githubTrigger",
      "position": [
        -1100,
        240
      ],
      "parameters": {
        "owner": {
          "__rl": true,
          "mode": "name"
        },
        "events": [
          "push"
        ],
        "options": {
          "insecureSSL": false
        },
        "repository": {
          "__rl": true,
          "mode": "list",
          "cachedResultUrl": "Your_Github_URL",
          "cachedResultName": "Your_Repository_Name"
        }
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "id": "240e79d9-9a6d-4fc9-9f46-b681577c54aa",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        -880,
        240
      ],
      "parameters": {
        "jsCode": "const inputData = $input.all();\nconst commits = inputData[0].json.body.commits;\n\nreturn commits.map(commit => {\n  const message = commit.message;\n  const timestamp = commit.timestamp;\n\n  // Match something like \"ABC-123\", case-insensitive, from the beginning\n  const match = message.match(/([A-Z]+-\\d+)/i);\n\n  const jiraId = match ? match[0].toUpperCase() : null;\n\n  return {\n    json: {\n      message,\n      timestamp,\n      jira_id: jiraId\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "c4265d41-b0d6-480e-b287-f87fc0dd383f",
      "name": "Basic LLM Chain",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -180,
        160
      ],
      "parameters": {
        "text": "=",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "type": "HumanMessagePromptTemplate",
              "message": "=You are a professional technical release manager generating production release notes for CxOs and clients.\n\nGenerate a complete release note in **HTML format**, not plain text. The content is based on the following JIRA items, each having `jira_id`, `jira_summary`, `jira_description`, and `message`.\n\nOutput structure (as HTML):\n\n1. Title and Metadata\n   - H2 tag: \"Production Deployment \u2013 [Release Date]\"\n   - Bold lines: Version, Environment, Deployment Date\n\n2. Overview\n   - Short paragraph explaining the goal of this deployment\n\n3. Key Changes\n   - Bullet list (<ul>) with one <li> per JIRA item\n   - For each bullet: Summarize `jira_description` + `message` into a business-friendly sentence\n\nRules:\n- Output as clean HTML only\n- Do not wrap in a JSON object or Markdown\n- Use simple inline styles for readability\n\nHere is the input data:\n{{ JSON.stringify($json.items, null, 2) }}\n"
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "fc270e53-4599-4627-a492-d8beb3fef6f6",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -180,
        360
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-pro"
      },
      "typeVersion": 1
    },
    {
      "id": "aba9e0b0-56f3-412a-950b-3cf80e3cf79b",
      "name": "Send email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        300,
        160
      ],
      "parameters": {
        "html": "={{ $json.output.releasenote }}",
        "options": {},
        "subject": "Your_company_name | Location, Country \nYou\u2019re receiving this email because you are subscribed to release notifications.",
        "toEmail": "Your_receiver_email",
        "fromEmail": "Your_sender_email"
      },
      "typeVersion": 2.1,
      "alwaysOutputData": false
    },
    {
      "id": "48532ced-01bb-4e6e-b6ec-4c32f46b566c",
      "name": "Get an issue",
      "type": "n8n-nodes-base.jira",
      "position": [
        -600,
        -20
      ],
      "parameters": {
        "issueKey": "={{ $json.jira_id }}",
        "operation": "get",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "b34e967e-186b-4796-a271-c494062683a1",
      "name": "Code2",
      "type": "n8n-nodes-base.code",
      "position": [
        -400,
        -20
      ],
      "parameters": {
        "jsCode": "// Get all incoming items from the JIRA node.\nconst allItems = $input.all();\n\n// Use .map() to loop through each item and transform it.\nreturn allItems.map(item => {\n  // The full JIRA issue data for the current item in the loop\n  const issue = item.json;\n\n  // Extract the specific fields you need for this issue.\n  // Use optional chaining (?.) to prevent errors if a field is missing.\n  const jiraId = issue.key; // The JIRA ID (e.g., \"MS-6\")\n  const summary = issue.fields?.summary;\n  const description = issue.fields?.description;\n\n  // Return a new, clean object for this specific issue.\n  return {\n    json: {\n      jira_id: jiraId, // Added as requested\n      jira_summary: summary,\n      jira_description: description\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "e230523a-b901-4188-8fa0-5c1fe744de67",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        -600,
        340
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "19291761-fa9d-4b44-9adf-152d69a4fdc2",
      "name": "Code3",
      "type": "n8n-nodes-base.code",
      "position": [
        -400,
        340
      ],
      "parameters": {
        "jsCode": "// This will take all input items from previous loop and combine into one array\nreturn [{\n  json: {\n    items: items.map(i => i.json)\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "9439a656-766c-4461-ae0e-df4455a15c59",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -20,
        360
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"releasenote\": {\n\t\t\t\"type\": \"string\"\n\t\t}\n\t}\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "1a888040-0235-488f-b674-d12f4049342b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1240,
        -60
      ],
      "parameters": {
        "color": 3,
        "width": 380,
        "height": 220,
        "content": "*Generate & Email Professional Release Notes*\n\n*Before you get started, you'll need this:*\n\n*   GitHub\n*   Google Gemini (or another PaLM/LLM provider)\n*   JIRA (Software Cloud API)    \n*   Your SMTP email server"
      },
      "typeVersion": 1
    },
    {
      "id": "c9fddf05-bf10-40e8-8712-d472eb877418",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1260,
        400
      ],
      "parameters": {
        "width": 440,
        "height": 360,
        "content": "Configure the GitHub Trigger:\n-----------------------------------------------------------\n\n\n1.  Select the Github Trigger node.. \n\n2. In the Repository Owner field, enter your GitHub username or organization name.. \n\n3. In the Repository Name field, select the repository you want to monitor.\n\n4. A unique topic for the post generation will be generated and connect with content generator node. \n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "45eff7d7-4b65-4f9b-96b3-c5fe8cb0e481",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -780,
        -240
      ],
      "parameters": {
        "color": 6,
        "width": 620,
        "height": 380,
        "content": "Verify the JIRA Integration:\n-----------------------------------------------------------\n\n\n1.  Important: This workflow assumes your commit messages contain a JIRA key (e.g., \u201cPROJ-123: Fix login bug\u201d).\n\n2. Select the first Code node. It uses a regular expression ([A-Z]\u00b1\\d+)/i to find JIRA keys. Adjust this expression if your team uses a different format.. \n\n3. Select the Get an issue node and ensure your JIRA credentials are correctly configured.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bc9a6cc5-48c1-4dfe-80ad-a9af16760502",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -240,
        500
      ],
      "parameters": {
        "width": 460,
        "content": "Customize the AI Prompt:\n-----------------------------------------------------------\n\n\n1.  Select the Basic LLM Chain node. You can edit the prompt to change the tone, style, or structure of the generated HTML release note to match your company\u2019s standards.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "04ef71c5-356c-49fd-b107-bd780cd407fc",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        120,
        -60
      ],
      "parameters": {
        "color": 4,
        "width": 520,
        "height": 360,
        "content": "Configure Email Notifications:\n-----------------------------------------------------------\n\n\n1.  Select the Send email node.\n\n2. Update the To Email field with the recipient\u2019s email address (e.g., a team distribution list or a stakeholder\u2019s email).\n\n3. Customize the From Email and Subject line as needed. \n \n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "876e6044-75e6-4ad7-8c45-230adb40eb39",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1780,
        160
      ],
      "parameters": {
        "color": 5,
        "width": 576,
        "height": 300,
        "content": "# Need more help ?\n\n**We develop tailored workflow to save youe valuable time. Should you have any questions or wish to explore more custom automation solutions, we would be happy to connect.**\n\n### Email: hello.b@intuz.com\n### Website: https://www.intuz.com/"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "2df81f54-33ae-4201-9872-1dcc0dff8dd8",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Get an issue",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Code2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code3": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Code3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get an issue": {
      "main": [
        [
          {
            "node": "Code2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Github Trigger": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Send email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

It connects to GitHub and JIRA to gather data from recent commits and completed tickets, using specific keywords or labels to identify key features for inclusion.

Source: https://n8n.io/workflows/6129/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This n8n workflow automates the entire lead nurturing process from initial contact through a 3-email follow-up sequence, with intelligent reply detection and personalized AI-generated content. It's de

Telegram Trigger, Chain Llm, Google Gemini Chat +5
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 91 nodes.

Form Trigger, Chain Llm, Output Parser Structured +8
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.

Form Trigger, Chain Llm, Output Parser Structured +7
AI & RAG

This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.

Output Parser Structured, OpenAI Chat, Form Trigger +8
AI & RAG

How it Works

Memory Buffer Window, Agent, Output Parser Structured +9