mirror of
https://github.com/github/awesome-copilot.git
synced 2026-03-13 12:45:13 +00:00
Adding the workflows after I broke #802
This commit is contained in:
140
workflows/ospo-contributors-report.md
Normal file
140
workflows/ospo-contributors-report.md
Normal 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.
|
||||
Reference in New Issue
Block a user