Skip to content

🔀 Gemini Dispatch #49

🔀 Gemini Dispatch

🔀 Gemini Dispatch #49

Workflow file for this run

name: "🔀 Gemini Dispatch"
on:
pull_request_review_comment:
types:
- "created"
pull_request_review:
types:
- "submitted"
pull_request:
types:
- "opened"
issues:
types:
- "opened"
- "reopened"
issue_comment:
types:
- "created"
defaults:
run:
shell: "bash"
jobs:
debugger:
if: |-
${{ fromJSON(vars.DEBUG || vars.ACTIONS_STEP_DEBUG || false) }}
runs-on: "ubuntu-latest"
permissions:
contents: "read"
steps:
- name: "Print context for debugging"
env:
DEBUG_event_name: "${{ github.event_name }}"
DEBUG_event__action: "${{ github.event.action }}"
DEBUG_event__comment__author_association: "${{ github.event.comment.author_association }}"
DEBUG_event__issue__author_association: "${{ github.event.issue.author_association }}"
DEBUG_event__pull_request__author_association:
"${{ github.event.pull_request.author_association }}"
DEBUG_event__review__author_association: "${{ github.event.review.author_association }}"
DEBUG_event: "${{ toJSON(github.event) }}"
run: |-
env | grep '^DEBUG_'
dispatch:
# For PRs: only if not from a fork
# For comments: only if user types @gemini-cli and is OWNER/MEMBER/COLLABORATOR
# For issues: only on open/reopen
if: |-
(
github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.fork == false
) || (
github.event.sender.type == 'User' &&
startsWith(github.event.comment.body || github.event.review.body || github.event.issue.body, '@gemini-cli') &&
contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association || github.event.issue.author_association)
) || (
github.event_name == 'issues' &&
contains(fromJSON('["opened", "reopened"]'), github.event.action)
)
runs-on: "ubuntu-latest"
permissions:
contents: "read"
issues: "write"
pull-requests: "write"
outputs:
command: "${{ steps.extract_command.outputs.command }}"
request: "${{ steps.extract_command.outputs.request }}"
additional_context: "${{ steps.extract_command.outputs.additional_context }}"
issue_number: "${{ github.event.pull_request.number || github.event.issue.number }}"
steps:
- name: "Mint identity token"
id: "mint_identity_token"
if: |-
${{ vars.APP_ID }}
uses: "actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42" # ratchet:actions/create-github-app-token@v2
with:
app-id: "${{ vars.APP_ID }}"
private-key: "${{ secrets.APP_PRIVATE_KEY }}"
permission-contents: "read"
permission-issues: "write"
permission-pull-requests: "write"
- name: "Extract command"
id: "extract_command"
uses: "actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd" # ratchet:actions/github-script@v7
env:
EVENT_TYPE: "${{ github.event_name }}.${{ github.event.action }}"
REQUEST:
"${{ github.event.comment.body || github.event.review.body || github.event.issue.body }}"
with:
script: |
const request = process.env.REQUEST;
const eventType = process.env.EVENT_TYPE
core.setOutput('request', request);
if (request.startsWith("@gemini-cli /review")) {
core.setOutput('command', 'review');
const additionalContext = request.replace(/^@gemini-cli \/review/, '').trim();
core.setOutput('additional_context', additionalContext);
} else if (request.startsWith("@gemini-cli /triage")) {
core.setOutput('command', 'triage');
} else if (request.startsWith("@gemini-cli")) {
core.setOutput('command', 'invoke');
const additionalContext = request.replace(/^@gemini-cli/, '').trim();
core.setOutput('additional_context', additionalContext);
} else if (eventType === 'pull_request.opened') {
core.setOutput('command', 'review');
} else if (['issues.opened', 'issues.reopened'].includes(eventType)) {
core.setOutput('command', 'triage');
} else {
core.setOutput('command', 'fallthrough');
}
- name: "Acknowledge request"
env:
GITHUB_TOKEN:
"${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}"
ISSUE_NUMBER: "${{ github.event.pull_request.number || github.event.issue.number }}"
MESSAGE: |-
🤖 Hi @${{ github.actor }}, I've received your request, and I'm working on it now! You can track my progress [in the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
REPOSITORY: "${{ github.repository }}"
run: |-
gh issue comment "${ISSUE_NUMBER}" \
--body "${MESSAGE}" \
--repo "${REPOSITORY}"
review:
needs: "dispatch"
if: |-
${{ needs.dispatch.outputs.command == 'review' }}
uses: "./.github/workflows/gemini-review.yml"
permissions:
contents: "read"
id-token: "write"
issues: "write"
pull-requests: "write"
with:
additional_context: "${{ needs.dispatch.outputs.additional_context }}"
secrets: "inherit"
triage:
needs: "dispatch"
if: |-
${{ needs.dispatch.outputs.command == 'triage' }}
uses: "./.github/workflows/gemini-triage.yml"
permissions:
contents: "read"
id-token: "write"
issues: "write"
pull-requests: "write"
with:
additional_context: "${{ needs.dispatch.outputs.additional_context }}"
secrets: "inherit"
invoke:
needs: "dispatch"
if: |-
${{ needs.dispatch.outputs.command == 'invoke' }}
uses: "./.github/workflows/gemini-invoke.yml"
permissions:
contents: "read"
id-token: "write"
issues: "write"
pull-requests: "write"
with:
additional_context: "${{ needs.dispatch.outputs.additional_context }}"
secrets: "inherit"
fallthrough:
needs:
- "dispatch"
- "review"
- "triage"
- "invoke"
if: |-
${{ always() && !cancelled() && (failure() || needs.dispatch.outputs.command == 'fallthrough') }}
runs-on: "ubuntu-latest"
permissions:
contents: "read"
issues: "write"
pull-requests: "write"
steps:
- name: "Mint identity token"
id: "mint_identity_token"
if: |-
${{ vars.APP_ID }}
uses: "actions/create-github-app-token@67018539274d69449ef7c02e8e71183d1719ab42" # ratchet:actions/create-github-app-token@v2
with:
app-id: "${{ vars.APP_ID }}"
private-key: "${{ secrets.APP_PRIVATE_KEY }}"
permission-contents: "read"
permission-issues: "write"
permission-pull-requests: "write"
- name: "Send failure comment"
env:
GITHUB_TOKEN:
"${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}"
ISSUE_NUMBER: "${{ github.event.pull_request.number || github.event.issue.number }}"
MESSAGE: |-
🤖 I'm sorry @${{ github.actor }}, but I was unable to process your request. Please [see the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details.
REPOSITORY: "${{ github.repository }}"
run: |-
gh issue comment "${ISSUE_NUMBER}" \
--body "${MESSAGE}" \
--repo "${REPOSITORY}"