Automated changelog generation from GitLab group milestones with Slack integration.
Gitlab LogLady automates the process of generating changelogs from GitLab group milestones and publishing them to Slack. When a sprint milestone is completed, it collects all closed issues from configured repositories, organizes them by product based on repository URLs, and sends formatted changelogs to your team's Slack channels.
- Python 3.9+
- GitLab account with API access
- Slack workspace with webhook configured
- Clone the repository:
cd /path/to/local_repository- Create and activate virtual environment:
python3 -m venv venv
source venv/bin/activate- Install dependencies:
pip install -r requirements.txt- Configure the application:
cp config.ini.example config.ini
# Edit config.ini with your GitLab URL, tokens, and Slack webhook# Dry run (preview without publishing to Slack)
python generate_changelog.py --milestone "09/10/2025" --dry-run
# Generate and publish to Slack (default behavior)
python generate_changelog.py --milestone "09/10/2025"When you run the command:
- Fetches closed issues from the GitLab group milestone
- Extracts the year from milestone dates (e.g., 2025)
- Appends to year file
changelog_archive/2025.md:- If milestone doesn't exist → adds it at the top
- If milestone already exists → replaces the existing entry (no duplicates)
- Generates temporary file
changelog.mdfor Slack - Publishes to Slack (unless
--dry-runis specified)
python generate_changelog.py --milestone "09/10/2025" --publish-onlypython generate_changelog.py --milestone "09/10/2025" --output my_changelog.md**Changelog - 09/10/2025** (2025-09-26 → 2025-10-16)
**Product1** (3 issues)
* Issue / lorem ipsum (repository#123) (label1, label2)
* Issue / lorem ipsum (repository#1) (label1, label2)
* Issue / lorem ipsum (repository#2) (label1, label2)
**Product2** (1 issue)
* Issue / lorem ipsum (repository#123) (label1, label2)
---
Total: 4 issues closed | Estimated: 42.0h (6d)Format details:
- Issues sorted alphabetically within each product
- Format:
* Title (repository#123) (label1, label2) - Shows repository name with issue number
- No alias labels (labels starting with @)
- Time shown in both hours and working days (8h = 1d)
-
Create .env
# Edit with your GitLab token and Slack webhook LOGLADY_GITLAB_TOKEN = ... SLACK_WEBHOOK_URL = ... -
Create Group Milestone
- Go to your gitlab > group > then milestone.
- Click "New milestone"
- Create milestone (e.g., "09/10/2025", "Sprint 42")
-
Test Configuration
python generate_changelog.py --milestone "Your Milestone" --dry-run -
Deploy
- Use manually via command line
- Or set up GitLab CI/CD pipeline (see
.gitlab-ci.yml)
The project includes a .gitlab-ci.yml file for automated execution.