Generate Weekly Community Report 📊 #17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }} |