Adding the workflows after I broke #802

This commit is contained in:
Aaron Powell
2026-02-26 10:54:16 +11:00
parent 85a538b92b
commit 1f2afa4336
5 changed files with 603 additions and 0 deletions

View File

@@ -0,0 +1,140 @@
---
name: 'OSPO Contributors Report'
description: 'Monthly contributor activity metrics across an organization''s repositories.'
labels: ['ospo', 'reporting', 'contributors']
on:
schedule:
- cron: "3 2 1 * *"
workflow_dispatch:
inputs:
organization:
description: "GitHub organization to analyze (e.g. github)"
required: false
type: string
repositories:
description: "Comma-separated list of repos to analyze (e.g. owner/repo1,owner/repo2)"
required: false
type: string
start_date:
description: "Start date for the report period (YYYY-MM-DD)"
required: false
type: string
end_date:
description: "End date for the report period (YYYY-MM-DD)"
required: false
type: string
sponsor_info:
description: "Include GitHub Sponsors information for contributors"
required: false
type: boolean
default: false
permissions:
contents: read
issues: read
pull-requests: read
engine: copilot
tools:
github:
toolsets:
- repos
- issues
- pull_requests
- orgs
- users
bash: true
safe-outputs:
create-issue:
max: 1
title-prefix: "[Contributors Report] "
timeout-minutes: 60
---
# Contributors Report
Generate a contributors report for the specified organization or repositories.
## Step 1: Validate Configuration
Check the workflow inputs. Either `organization` or `repositories` must be provided.
- If **both** are empty and this is a **scheduled run**, default to analyzing all public repositories in the organization that owns the current repository. Determine the org from the `GITHUB_REPOSITORY` environment variable (the part before the `/`).
- If **both** are empty and this is a **manual dispatch**, fail with a clear error message: "You must provide either an organization or a comma-separated list of repositories."
- If **both** are provided, prefer `repositories` and ignore `organization`.
## Step 2: Determine Date Range
- If `start_date` and `end_date` are provided, use them.
- Otherwise, default to the **previous calendar month**. For example, if today is 2025-03-15, the range is 2025-02-01 to 2025-02-28.
- Use bash to compute the dates if needed. Store them as `START_DATE` and `END_DATE`.
## Step 3: Enumerate Repositories
- If `repositories` input was provided, split the comma-separated string into a list. Each entry should be in `owner/repo` format.
- If `organization` input was provided (or defaulted from Step 1), list all **public, non-archived, non-fork** repositories in the organization using the GitHub API. Collect their `owner/repo` identifiers.
## Step 4: Collect Contributors from Commit History
For each repository in scope:
1. Use the GitHub API to list commits between `START_DATE` and `END_DATE` (use the `since` and `until` parameters on the commits endpoint).
2. For each commit, extract the **author login** (from `author.login` on the commit object).
3. **Exclude bot accounts**: skip any contributor whose username contains `[bot]` or whose `type` field is `"Bot"`.
4. Track per-contributor:
- Total number of commits across all repos.
- The set of repos they contributed to.
Use bash to aggregate and deduplicate the contributor data across all repositories.
## Step 5: Determine New vs Returning Contributors
For each contributor found in Step 4, check whether they have **any commits before `START_DATE`** in any of the in-scope repositories.
- If a contributor has **no commits before `START_DATE`**, mark them as a **New Contributor**.
- Otherwise, mark them as a **Returning Contributor**.
## Step 6: Collect Sponsor Information (Optional)
If the `sponsor_info` input is `true`:
1. For each contributor, check whether they have a GitHub Sponsors profile by querying the user's profile via the GitHub API.
2. If the user has sponsorship enabled, record their sponsor URL as `https://github.com/sponsors/<username>`.
3. If not, leave the sponsor field empty.
## Step 7: Generate Markdown Report
Build a markdown report with the following structure:
### Summary Table
| Metric | Value |
|---|---|
| Total Contributors | count |
| Total Contributions (Commits) | count |
| New Contributors | count |
| Returning Contributors | count |
| % New Contributors | percentage |
### Contributors Detail Table
Sort contributors by commit count descending.
| # | Username | Contribution Count | New Contributor | Sponsor URL | Commits |
|---|---|---|---|---|---|
| 1 | @username | 42 | Yes | [Sponsor](url) | [View](commits-url) |
- The **Username** column should link to the contributor's GitHub profile.
- The **Sponsor URL** column should show "N/A" if `sponsor_info` is false or the user has no Sponsors page.
- The **Commits** column should link to a filtered commits view.
## Step 8: Create Issue with Report
Create an issue in the **current repository** with:
- **Title:** `[Contributors Report] <ORG_OR_REPO_SCOPE> — START_DATE to END_DATE`
- **Body:** The full markdown report from Step 7.
- **Labels:** Add the label `contributors-report` if it exists; do not fail if it does not.