198 lines
7.0 KiB
YAML
198 lines
7.0 KiB
YAML
name: 'Generate Weekly Community Report 📊'
|
|
|
|
on:
|
|
schedule:
|
|
- cron: '0 12 * * 1' # Run at 12:00 UTC on Monday
|
|
workflow_dispatch:
|
|
inputs:
|
|
days:
|
|
description: 'Number of days to look back for the report'
|
|
required: true
|
|
default: '7'
|
|
|
|
jobs:
|
|
generate-report:
|
|
name: 'Generate Report 📝'
|
|
if: |-
|
|
${{ github.repository == 'google-gemini/gemini-cli' }}
|
|
runs-on: 'ubuntu-latest'
|
|
permissions:
|
|
issues: 'write'
|
|
pull-requests: 'read'
|
|
discussions: 'read'
|
|
contents: 'read'
|
|
id-token: 'write'
|
|
|
|
steps:
|
|
- name: 'Generate GitHub App Token 🔑'
|
|
id: 'generate_token'
|
|
uses: 'actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b' # ratchet:actions/create-github-app-token@v2
|
|
with:
|
|
app-id: '${{ secrets.APP_ID }}'
|
|
private-key: '${{ secrets.PRIVATE_KEY }}'
|
|
permission-issues: 'write'
|
|
permission-pull-requests: 'read'
|
|
permission-discussions: 'read'
|
|
permission-contents: 'read'
|
|
|
|
- name: 'Generate Report 📜'
|
|
id: 'report'
|
|
env:
|
|
GH_TOKEN: '${{ steps.generate_token.outputs.token }}'
|
|
REPO: '${{ github.repository }}'
|
|
DAYS: '${{ github.event.inputs.days || 7 }}'
|
|
run: |-
|
|
set -e
|
|
|
|
START_DATE="$(date -u -d "$DAYS days ago" +'%Y-%m-%d')"
|
|
END_DATE="$(date -u +'%Y-%m-%d')"
|
|
echo "⏳ Generating report for contributions from ${START_DATE} to ${END_DATE}..."
|
|
|
|
declare -A author_is_googler
|
|
check_googler_status() {
|
|
local author="$1"
|
|
if [[ "${author}" == *"[bot]" ]]; then
|
|
author_is_googler[${author}]=1
|
|
return 1
|
|
fi
|
|
if [[ -v "author_is_googler[${author}]" ]]; then
|
|
return "${author_is_googler[${author}]}"
|
|
fi
|
|
|
|
if gh api "orgs/googlers/members/${author}" --silent 2>/dev/null; then
|
|
echo "🧑💻 ${author} is a Googler."
|
|
author_is_googler[${author}]=0
|
|
else
|
|
echo "🌍 ${author} is a community contributor."
|
|
author_is_googler[${author}]=1
|
|
fi
|
|
return "${author_is_googler[${author}]}"
|
|
}
|
|
|
|
googler_issues=0
|
|
non_googler_issues=0
|
|
googler_prs=0
|
|
non_googler_prs=0
|
|
|
|
echo "🔎 Fetching issues and pull requests..."
|
|
ITEMS_JSON="$(gh search issues --repo "${REPO}" "created:>${START_DATE}" --json author,isPullRequest --limit 1000)"
|
|
|
|
for row in $(echo "${ITEMS_JSON}" | jq -r '.[] | @base64'); do
|
|
_jq() {
|
|
echo "${row}" | base64 --decode | jq -r "${1}"
|
|
}
|
|
author="$(_jq '.author.login')"
|
|
is_pr="$(_jq '.isPullRequest')"
|
|
|
|
if [[ -z "${author}" || "${author}" == "null" ]]; then
|
|
continue
|
|
fi
|
|
|
|
if check_googler_status "${author}"; then
|
|
if [[ "${is_pr}" == "true" ]]; then
|
|
((googler_prs++))
|
|
else
|
|
((googler_issues++))
|
|
fi
|
|
else
|
|
if [[ "${is_pr}" == "true" ]]; then
|
|
((non_googler_prs++))
|
|
else
|
|
((non_googler_issues++))
|
|
fi
|
|
fi
|
|
done
|
|
|
|
googler_discussions=0
|
|
non_googler_discussions=0
|
|
|
|
echo "🗣️ Fetching discussions..."
|
|
DISCUSSION_QUERY='''
|
|
query($q: String!) {
|
|
search(query: $q, type: DISCUSSION, first: 100) {
|
|
nodes {
|
|
... on Discussion {
|
|
author {
|
|
login
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}'''
|
|
DISCUSSIONS_JSON="$(gh api graphql -f q="repo:${REPO} created:>${START_DATE}" -f query="${DISCUSSION_QUERY}")"
|
|
|
|
for row in $(echo "${DISCUSSIONS_JSON}" | jq -r '.data.search.nodes[] | @base64'); do
|
|
_jq() {
|
|
echo "${row}" | base64 --decode | jq -r "${1}"
|
|
}
|
|
author="$(_jq '.author.login')"
|
|
|
|
if [[ -z "${author}" || "${author}" == "null" ]]; then
|
|
continue
|
|
fi
|
|
|
|
if check_googler_status "${author}"; then
|
|
((googler_discussions++))
|
|
else
|
|
((non_googler_discussions++))
|
|
fi
|
|
done
|
|
|
|
echo "✍️ Generating report content..."
|
|
TOTAL_ISSUES=$((googler_issues + non_googler_issues))
|
|
TOTAL_PRS=$((googler_prs + non_googler_prs))
|
|
TOTAL_DISCUSSIONS=$((googler_discussions + non_googler_discussions))
|
|
|
|
REPORT_BODY=$(cat <<EOF
|
|
### 💖 Community Contribution Report
|
|
|
|
**Period:** ${START_DATE} to ${END_DATE}
|
|
|
|
| Category | Googlers | Community | Total |
|
|
|---|---:|---:|---:|
|
|
| **Issues** | $googler_issues | $non_googler_issues | **$TOTAL_ISSUES** |
|
|
| **Pull Requests** | $googler_prs | $non_googler_prs | **$TOTAL_PRS** |
|
|
| **Discussions** | $googler_discussions | $non_googler_discussions | **$TOTAL_DISCUSSIONS** |
|
|
|
|
_This report was generated automatically by a GitHub Action._
|
|
EOF
|
|
)
|
|
|
|
echo "report_body<<EOF" >> "${GITHUB_OUTPUT}"
|
|
echo "${REPORT_BODY}" >> "${GITHUB_OUTPUT}"
|
|
echo "EOF" >> "${GITHUB_OUTPUT}"
|
|
|
|
echo "📊 Community Contribution Report:"
|
|
echo "${REPORT_BODY}"
|
|
|
|
- name: '🤖 Get Insights from Report'
|
|
if: |-
|
|
${{ steps.report.outputs.report_body != '' }}
|
|
uses: 'google-github-actions/run-gemini-cli@a3bf79042542528e91937b3a3a6fbc4967ee3c31' # ratchet:google-github-actions/run-gemini-cli@v0
|
|
env:
|
|
GITHUB_TOKEN: '${{ steps.generate_token.outputs.token }}'
|
|
REPOSITORY: '${{ github.repository }}'
|
|
with:
|
|
gcp_workload_identity_provider: '${{ vars.GCP_WIF_PROVIDER }}'
|
|
gcp_project_id: '${{ vars.GOOGLE_CLOUD_PROJECT }}'
|
|
gcp_location: '${{ vars.GOOGLE_CLOUD_LOCATION }}'
|
|
gcp_service_account: '${{ vars.SERVICE_ACCOUNT_EMAIL }}'
|
|
gemini_api_key: '${{ secrets.GEMINI_API_KEY }}'
|
|
use_vertex_ai: '${{ vars.GOOGLE_GENAI_USE_VERTEXAI }}'
|
|
use_gemini_code_assist: '${{ vars.GOOGLE_GENAI_USE_GCA }}'
|
|
settings: |-
|
|
{
|
|
"coreTools": [
|
|
"run_shell_command(gh issue list)",
|
|
"run_shell_command(gh pr list)",
|
|
"run_shell_command(gh search issues)",
|
|
"run_shell_command(gh search prs)"
|
|
]
|
|
}
|
|
prompt: |-
|
|
You are a helpful assistant that analyzes community contribution reports.
|
|
Based on the following report, please provide a brief summary and highlight any interesting trends or potential areas for improvement.
|
|
|
|
Report:
|
|
${{ steps.report.outputs.report_body }}
|