Hummingbird MR Human Tracker
A CLI tool that detects human intervention on automation-opened GitLab merge requests (Renovate, Dependabot, etc.) and links them to a per-sprint Jira epic for tracking.
Features
- Bot MR Detection: Identifies MRs authored by bot accounts across multiple GitLab projects using configurable username patterns
- Human Activity Detection: Finds MRs where humans have commented or pushed commits (via GitLab system notes)
- Per-Sprint Jira Epic: Automatically finds or creates an epic per sprint to track automation fix work (e.g. “Automation MR fixes for sprint Hum S16”)
- Remote Link Tracking: Adds affected MR URLs as remote links on the Jira epic, with deduplication to avoid duplicates on repeated runs
- Merged/Closed MR Scanning:
--sinceflag catches MRs that were merged or closed before the next scheduled run - Dry Run: Preview what would be linked without making any changes
Prerequisites
- Python 3.11 or later
- GitLab API token with read access to target projects (including MR notes)
- Jira API token with permission to create epics and remote links in the HUM project
Installation
pip install -e hummingbird-mr-human-tracker
Usage
mr-human-tracker --jira-user user@redhat.com --dry-run -v
Common invocations
# Preview what would be linked (no changes made)
mr-human-tracker --jira-user user@redhat.com --dry-run -v
# Run for real, including MRs merged in the last 2 days
mr-human-tracker --jira-user user@redhat.com --since 2d
# Scan only specific projects
mr-human-tracker --jira-user user@redhat.com --projects redhat/hummingbird/tools
# Verbose output for debugging
mr-human-tracker --jira-user user@redhat.com --since 1w -v
Output
On completion, the tool prints a summary of linked MRs:
INFO hummingbird_mr_human_tracker.tracker: Active sprint: Hum S16 [June 11 - June 25] (id=68851)
INFO hummingbird_mr_human_tracker.tracker: Using epic HUM-2602
INFO hummingbird_mr_human_tracker.tracker: Linked 2 MR(s) to HUM-2602:
INFO hummingbird_mr_human_tracker.tracker: https://gitlab.com/redhat/hummingbird/rpms/-/merge_requests/2395
INFO hummingbird_mr_human_tracker.tracker: https://gitlab.com/redhat/hummingbird/containers/-/merge_requests/8476
Configuration
All configuration is via CLI arguments and environment variables.
CLI arguments
| Argument | Description | Default |
|---|---|---|
--gitlab-url |
GitLab instance URL | GITLAB_URL env |
--gitlab-token |
GitLab private token | GITLAB_TOKEN env |
--jira-url |
Jira base URL | JIRA_URL env |
--jira-token |
Jira API token | JIRA_TOKEN env |
--jira-user |
Jira email for Basic auth (omit for Bearer) | None |
--projects |
GitLab project paths to scan | tools, rpms, containers |
--board-id |
Jira board ID for sprint lookup | 1489 |
--sprint-prefix |
Sprint name prefix to match | Hum S |
--since |
Also scan merged/closed MRs updated within window | None (open MRs only) |
--dry-run |
Report without making changes | False |
-v, --verbose |
Enable debug logging | False |
Environment variables
| Variable | Description |
|---|---|
GITLAB_URL |
GitLab instance URL |
GITLAB_TOKEN |
GitLab private token |
JIRA_URL |
Jira base URL |
JIRA_TOKEN |
Jira API token |
Duration format for --since
The --since flag accepts a number followed by a unit:
| Unit | Meaning |
|---|---|
h |
Hours |
d |
Days |
w |
Weeks |
Examples: 12h, 2d, 1w
How it works
- Fetch active sprint from the Jira Agile API (board 1489, prefix “Hum S”)
- Find or create a Jira epic named “Automation MR fixes for sprint {sprint_name}” in the HUM project, assigned to the active sprint
- Scan GitLab projects for open MRs authored by bot accounts; if
--sinceis set, also scan recently merged/closed MRs - Detect human activity on each bot MR by checking:
- Non-bot, non-system comments
- System notes indicating a human pushed commits (“added N commit”)
- Reopen events by non-bot users
- Add remote links on the Jira epic for each human-touched MR (skipping URLs already linked)
Bot detection
A username is considered a bot if it matches any of:
- Contains
bot_orbot-(e.g.renovate_bot) - Ends with
_bot(e.g.some_bot) - Ends with
[bot](e.g.renovate[bot],dependabot[bot]) - Starts with
project_<digits>_botorgroup_<digits>_bot(GitLab service accounts)
Development
make setup # Install dependencies
make check # Lint code (ruff)
make fmt # Format code
make test # Run unit tests
make coverage # Run tests with coverage
License
This project is licensed under the GNU General Public License v3.0 or later - see the LICENSE file for details.