{"id":18810347,"url":"https://github.com/absaoss/generate-release-notes","last_synced_at":"2026-04-24T07:05:09.251Z","repository":{"id":213688504,"uuid":"734636309","full_name":"AbsaOSS/generate-release-notes","owner":"AbsaOSS","description":"Efficiently automate your release note generation with 'generate-release-notes'. This GH action scans your target GitHub repository's issues, sorting and organizing them into well-formatted release notes. Perfect for maintaining a streamlined and organized release process.","archived":false,"fork":false,"pushed_at":"2026-04-23T06:40:28.000Z","size":721,"stargazers_count":13,"open_issues_count":26,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-04-23T07:24:27.448Z","etag":null,"topics":["actions"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AbsaOSS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-12-22T07:46:29.000Z","updated_at":"2026-04-19T20:33:24.000Z","dependencies_parsed_at":"2024-01-02T13:36:40.665Z","dependency_job_id":"d11f5c4f-06fc-4d6f-81d4-4de6cd7f85a6","html_url":"https://github.com/AbsaOSS/generate-release-notes","commit_stats":null,"previous_names":["absaoss/generate-release-notes"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/AbsaOSS/generate-release-notes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbsaOSS%2Fgenerate-release-notes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbsaOSS%2Fgenerate-release-notes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbsaOSS%2Fgenerate-release-notes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbsaOSS%2Fgenerate-release-notes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AbsaOSS","download_url":"https://codeload.github.com/AbsaOSS/generate-release-notes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbsaOSS%2Fgenerate-release-notes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32212813,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T03:15:14.334Z","status":"ssl_error","status_checked_at":"2026-04-24T03:15:11.608Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actions"],"created_at":"2024-11-07T23:19:54.845Z","updated_at":"2026-04-24T07:05:09.245Z","avatar_url":"https://github.com/AbsaOSS.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Release Notes Scrapper Action\n\nAutomatically generate **structured release notes** directly from your GitHub issues and pull requests.  \nCategorize changes, highlight contributors, and maintain consistent release documentation — all fully automated.\n\n[![Version](https://img.shields.io/github/v/release/AbsaOSS/generate-release-notes)](https://github.com/AbsaOSS/generate-release-notes/releases)\n[![GitHub Marketplace](https://img.shields.io/badge/Marketplace-Release%20Notes%20Scrapper-blue)](https://github.com/marketplace/actions/release-notes-scrapper)\n\n- [Overview](#overview)\n- [Motivation](#motivation)\n- [Quick Start](#quick-start)\n- [How Release Notes Are Recognized](#how-release-notes-are-recognized)\n- [Requirements](#requirements)\n- [Configuration](#configuration)\n- [Example Workflow](#example-workflow)\n- [Feature Tutorials](#feature-tutorials)\n- [Troubleshooting](#troubleshooting)\n- [Developer \u0026 Contribution Guide](#developer--contribution-guide)\n- [License \u0026 Support](#license--support)\n\n## Overview\n\n**Release Notes Scrapper Action** scans issues, pull requests, and commits to create categorized release notes for your project releases.  \nIt groups changes by labels (e.g., “Bugfixes 🛠”, “New Features 🎉”) and extracts relevant content from PR descriptions or CodeRabbit summaries.\n\n### Key Benefits\n- Fully automated release note generation\n- Categorization by labels or issue hierarchy\n- Built-in “Service Chapters” to detect missing or incomplete release notes\n- Configurable templates and icons\n- Smart duplicate detection\n\n## Motivation\n\nGood documentation isn’t optional — it’s your project’s memory.  \nThis Action was created to make structured release documentation effortless and consistent across teams.\n\n👉 For the full background and design principles, see [docs/motivation.md](/docs/motivation.md)\n\n## Quick Start\n\nAdd the following step to your workflow to start generating release notes.\n\n```yaml\n- name: Generate Release Notes\n  id: release_notes_scrapper\n  uses: AbsaOSS/generate-release-notes@v1\n  env:\n    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n  with:\n    tag-name: \"v1.2.0\"\n    chapters: |\n      - {\"title\": \"Breaking Changes 💥\", \"label\": \"breaking-change\"}          # legacy single-label form\n      - {\"title\": \"New Features 🎉\", \"labels\": \"feature, enhancement\"}        # multi-label form (comma separated)\n      - {\"title\": \"Bugfixes 🛠\", \"labels\": [\"bug\", \"error\"]}                  # multi-label form (YAML list)\n```\n\n**Example output snippet:**\n\n```markdown\n### New Features 🎉\n- #23 _Feature title_ author is @root assigned to @neo developed by @morpheus in #24\n  - Added support for multi-factor authentication.\n\n### Bugfixes 🛠\n- PR: #25 _Copy not allowed_ author is @dependabot[bot] assigned to @smith developed by @smith\n  - File copy operation has been implemented.\n\n#### Full Changelog\nhttps://github.com/org/repo/compare/v1.1.0...v1.2.0\n```\n\n**That’s it** — the Action will:\n\n1. Fetch all closed issues and PRs from latest till now.\n2. Categorize them by labels.\n3. Extract release note text and contributors.\n4. Output a Markdown section ready for publishing.\n\n## How Release Notes Are Recognized\n\nThe action looks for a section whose heading matches the first regex `[Rr]elease [Nn]otes:` (configurable via `release-notes-title`) in the **issue body**, then in each **linked PR body**. Every bullet line (`-`, `*`, or `+`) immediately below that heading becomes one release note entry.\n\n**Example — issue or PR body:**\n\n```markdown\nSome intro text\n\nRelease Notes:\n- Add user MFA enrollment flow\n- Improve cache invalidation logic\n\nOther commentary...\n```\n\nOnly the first matching section per body is used; content outside it is ignored. If no section is found in any linked PR body and [CodeRabbit Integration](docs/features/coderabbit_integration.md) is enabled, the AI-generated summary is used as a fallback.\n\nFor full details — including the configurable title regex, `skip-release-notes-labels`, and edge cases — see [Release Notes Extraction](docs/features/release_notes_extraction.md).\n\n## Requirements\n\nTo run this action successfully, make sure your environment meets the following requirements:\n\n| Requirement                | Description                                                                                                                     |\n|----------------------------|---------------------------------------------------------------------------------------------------------------------------------|\n| **GitHub Token**           | A GitHub token with permission to read issues, pull requests, and releases. Usually available as `${{ secrets.GITHUB_TOKEN }}`. |\n| **Python 3.14+**           | The action internally runs on Python 3.14 or higher. If you’re developing locally or testing, ensure this version is available. |\n| **Repository Permissions** | The action needs at least `read` access to issues and pull requests, and `write` access to create or update release drafts.     |\n| **YAML Chapters Config**   | Each chapter must have a `title`, and a `label` or `labels`. Example: `{\"title\": \"Bugfixes 🛠\", \"labels\": \"bug, fix\"}`.         |\n\n## Configuration\n\nOnly a few inputs are required to get started:\n\n| Name           | Description                                                                  | Required | Default |\n|----------------|------------------------------------------------------------------------------|----------|---------|\n| `GITHUB_TOKEN` | GitHub token for authentication                                              | Yes      | -       |\n| `tag-name`     | Target tag for the release                                                   | Yes      | -       |\n| `chapters`     | YAML multi-line list mapping titles to labels (supports `label` or `labels`) | No       | -       | \n| `verbose`      | Enable detailed logging                                                      | No       | false   |\n\nFor the full input and output reference, see [Configuration reference](docs/configuration_reference.md).  \nFor how label → chapter mapping and aggregation works, see [Custom Chapters Behavior](docs/configuration_reference.md#custom-chapters-behavior).\n\n\u003e **Important**: tag defined by `tag-name` must exist in the repository; otherwise, the action fails.\n\n## Example Workflow\n\nYou can integrate this Action with your release process.\n\n### Example — Manual Release Dispatch\n\n```yaml\nname: \"Create Release \u0026 Notes\"\non:\n  workflow_dispatch:\n    inputs:\n      tag-name:\n        description: 'Existing git tag to use for this draft release. Syntax: \"v[0-9]+.[0-9]+.[0-9]+\". Ensure the tag is created and pushed before running.'\n        required: true\n\njobs:\n  release:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Generate Release Notes\n        id: notes\n        uses: AbsaOSS/generate-release-notes@v1\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        with:\n          tag-name: ${{ github.event.inputs.tag-name }}\n          chapters: |\n            - {\"title\": \"New Features 🎉\", \"labels\": \"enhancement, feature\", \"order\": 10}\n            - {\"title\": \"Bugfixes 🛠\", \"labels\": \"error, bug\", \"order\": 20}\n            - {\"title\": \"Infrastructure 🚧\", \"label\": \"infrastructure\", \"order\": 30}\n            - {\"title\": \"Documentation 📚\", \"label\": \"documentation\"}\n            - {\"title\": \"Internal Notes 📝\", \"labels\": \"internal\", \"hidden\": true}\n            - {\"title\": \"Not Implemented ⏳\", \"labels\": \"wip\", \"hidden\": true}\n            \n      - name: Create Draft Release\n        uses: softprops/action-gh-release@v2\n        with:\n          name: ${{ github.event.inputs.tag-name }}\n          tag_name: ${{ github.event.inputs.tag-name }}\n          body: ${{ steps.notes.outputs.release_notes }}\n          draft: true\n```\n\nFor more complex automation scenarios, see the [examples](examples) folder.\n\n## Feature Tutorials\n\nEach feature is documented separately — click a name below to learn configuration, examples, and best practices.\n\n| Feature                                                               | Scope                     | Description                                                                                                    |\n|-----------------------------------------------------------------------|---------------------------|----------------------------------------------------------------------------------------------------------------|\n| [Release Notes Extraction](docs/features/release_notes_extraction.md) | Extraction                | Core logic that scans descriptions to extract structured release notes (and optionally CodeRabbit summaries).  |\n| [CodeRabbit Integration](docs/features/coderabbit_integration.md)     | Extraction                | Optional extension to Release Notes Extraction, enabling AI-generated summaries when PR notes are missing.     |\n| [Skip Labels](docs/features/skip_labels.md)                           | Filtering                 | Exclude issues/PRs carrying configured labels from all release notes.                                          |\n| [Service Chapters](docs/features/service_chapters.md)                 | Quality \u0026 Warnings        | Surfaces gaps: issues without PRs, unlabeled items, PRs without notes, etc.                                    |\n| [Duplicity Handling](docs/features/duplicity_handling.md)             | Quality \u0026 Warnings        | Marks duplicate lines when the same issue appears in multiple chapters.                                        |\n| [Tag Range Selection](docs/features/tag_range.md)                     | Time Range                | Chooses scope via `tag-name`/`from-tag-name`.                                                                  |\n| [Date Selection](docs/features/date_selection.md)                     | Time Range                | Chooses scope via timestamps (`published-at` vs `created-at`).                                                 |\n| [Custom Row Formats](docs/features/custom_row_formats.md)             | Formatting \u0026 Presentation | Controls row templates and placeholders (`{number}`, `{title}`, `{developers}`, …).                            |\n| [Custom Chapters](docs/features/custom_chapters.md)                   | Formatting \u0026 Presentation | Maps labels to chapter headings; aggregates multiple labels under one title.                                   |\n| [Issue Hierarchy Support](docs/features/issue_hierarchy_support.md)   | Formatting \u0026 Presentation | Displays issue → sub-issue relationships.                                                                      |\n| [Verbose Mode](docs/features/verbose_mode.md)                         | Diagnostics \u0026 Technical   | Adds detailed logs for debugging.                                                                              |\n\n_Category legend (keep it consistent across docs)_\n\n- **Extraction** – how notes are gathered (core behavior).\n- **Filtering** – what gets included/excluded.\n- **Quality \u0026 Warnings** – health checks that keep releases clean.\n- **Time Range** – how the release window is determined.\n- **Formatting \u0026 Presentation** – how lines look.\n- **Diagnostics \u0026 Technical** – tooling, logs, debug.\n\n## Troubleshooting\nCommon questions and quick pointers.\n\n| Symptom | Likely Cause | Where to Read More |\n|---------|--------------|--------------------|\n| Issue/PR missing from a chapter | Skip label applied | [Skip Labels](docs/features/skip_labels.md) |\n| Issue missing but its PR appears | No change increment detected for issue (no merged PR linkage) | [Release Notes Extraction](docs/features/release_notes_extraction.md) |\n| Chapter heading is empty | No qualifying records OR duplicates suppressed | [Custom Chapters](docs/features/custom_chapters.md#faq) |\n| Expected duplicate not shown | `duplicity-scope` excludes that chapter category | [Duplicity Handling](docs/features/duplicity_handling.md) |\n| CodeRabbit section ignored | Manual release notes section already present OR support disabled | [CodeRabbit Integration](docs/features/coderabbit_integration.md) |\n\nMore Q\u0026A: see the [Custom Chapters FAQ](docs/features/custom_chapters.md#faq).\n\n## Developer \u0026 Contribution Guide\n\nWe love community contributions!\n- [Developer Guide](DEVELOPER.md)\n- [Contributing Guide](CONTRIBUTING.md)\n\nTypical contributions include:\n- Fixing bugs or edge cases\n- Improving documentation or examples\n- Adding new configuration options\n\n## License \u0026 Support\n\nThis project is licensed under the **Apache License 2.0**.\nSee the [LICENSE](/LICENSE) file for full terms.\n\n### Support \u0026 Contact\n- [Issues](https://github.com/AbsaOSS/generate-release-notes/issues)\n- [Discussions](https://github.com/AbsaOSS/generate-release-notes/discussions)\n\n## Acknowledgements\n\nThanks to all contributors and teams who helped evolve this Action.\nYour feedback drives continuous improvement and automation quality.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabsaoss%2Fgenerate-release-notes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabsaoss%2Fgenerate-release-notes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabsaoss%2Fgenerate-release-notes/lists"}