Quick Overview
This workflow runs daily (or on demand) to analyze GitHub Actions re-runs for a specific workflow and branch, identify flaky jobs by comparing pass/fail history across attempts, summarize likely causes with OpenAI, post a report to Slack, file GitHub issues for confirmed flakes, and store rates in an n8n Data Table.
How it works
- Runs every morning on a schedule or manually to start the analysis.
- Fetches recent completed GitHub Actions runs for the configured repository and branch, then keeps only the target workflow’s successful and failed runs and includes earlier attempts when a run was re-run.
- Retrieves all GitHub Actions jobs for each run attempt, paging through results so matrix workflows are fully captured.
- Aggregates job outcomes by job name to classify jobs as flaky, confirmed flaky (failed then passed on the same commit via re-run), broken, or one-off, and calculates flake rates and common failing step names.
- Compares current flake rates against the historical
flaky_jobs n8n Data Table to report only new or significantly worse flaky jobs.
- Uses OpenAI to group the reported flaky jobs by likely intermittent cause based on the failing step names, then posts a formatted summary to the configured Slack channel.
- Creates GitHub issues (up to the configured limit) for confirmed flaky jobs and upserts the latest per-job flake rates and verdicts into the
flaky_jobs Data Table.
Setup
- Create an HTTP Header Auth credential for GitHub with header name
Authorization and value Bearer <your_token> that has permission to read Actions, and add a GitHub credential that can create issues in the target repository.
- Configure the Settings values for
owner, repo, workflow_name (exactly as shown in GitHub Actions), branch, and optional thresholds like runs_to_read, min_observations, and report_when_worse_by.
- Create an n8n Data Table named
flaky_jobs with columns job_key, job_name, flake_rate, failures, runs_seen, verdict, and last_seen.
- Add an OpenAI credential for the chat model used to summarize groups of flakes.
- Add a Slack credential and set the target channel name in
slack_channel (for example #ci).