Skip to content

Comments on Issues Cancel Gemini Execution for Example Workflow #195

@AdnaneKhan

Description

@AdnaneKhan

TL;DR

The concurrency settings in examples/workflows/gemini-cli/gemini-cli.yml cause any comment on an issue while Gemini is working to cancel the gemini workflow. This happens regardless of the user's permission or whether they commented @gemini-cli ....

These workflows are the ones used when setting up gemini using the /setup-github command per https://blog.google/technology/developers/introducing-gemini-cli-github-actions/

Expected behavior

Only a maintainer commenting @gemini-cli should cancel a current gemini workflow.

Observed behavior

If a maintainer assigns Gemini using @gemini-cli ... and anyone else comments anything on the issue while Gemini is working, then it will cancel the workflow.

Action YAML

name: '💬 Gemini CLI'

on:
  pull_request_review_comment:
    types:
      - 'created'
  pull_request_review:
    types:
      - 'submitted'
  issue_comment:
    types:
      - 'created'

concurrency:
  group: '${{ github.workflow }}-${{ github.event.issue.number }}'
  cancel-in-progress: |-
    ${{ github.event.sender.type == 'User' && ( github.event.issue.author_association == 'OWNER' || github.event.issue.author_association == 'MEMBER' || github.event.issue.author_association == 'COLLABORATOR') }}

defaults:
  run:
    shell: 'bash'

permissions:
  contents: 'write'
  id-token: 'write'
  pull-requests: 'write'
  issues: 'write'

jobs:
  gemini-cli:
    # This condition seeks to ensure the action is only run when it is triggered by a trusted user.
    # For private repos, users who have access to the repo are considered trusted.
    # For public repos, users who members, owners, or collaborators are considered trusted.
    if: |-
      github.event_name == 'workflow_dispatch' ||
      (
        github.event_name == 'issues' && github.event.action == 'opened' &&
        contains(github.event.issue.body, '@gemini-cli') &&
        !contains(github.event.issue.body, '@gemini-cli /review') &&
        !contains(github.event.issue.body, '@gemini-cli /triage') &&
        (
          github.event.repository.private == true ||
          contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.issue.author_association)
        )
      ) ||
      (
        (
          github.event_name == 'issue_comment' ||
          github.event_name == 'pull_request_review_comment'
        ) &&
        contains(github.event.comment.body, '@gemini-cli') &&
        !contains(github.event.comment.body, '@gemini-cli /review') &&
        !contains(github.event.comment.body, '@gemini-cli /triage') &&
        (
          github.event.repository.private == true ||
          contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association)
        )
      ) ||
      (
        github.event_name == 'pull_request_review' &&
        contains(github.event.review.body, '@gemini-cli') &&
        !contains(github.event.review.body, '@gemini-cli /review') &&
        !contains(github.event.review.body, '@gemini-cli /triage') &&
        (
          github.event.repository.private == true ||
          contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.review.author_association)
        )
      )
    timeout-minutes: 10
    runs-on: 'ubuntu-latest'
    steps:
      - name: 'Generate GitHub App Token'
        id: 'generate_token'
        if: |-
          ${{ vars.APP_ID }}
        uses: 'actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e' # ratchet:actions/create-github-app-token@v2
        with:
          app-id: '${{ vars.APP_ID }}'
          private-key: '${{ secrets.APP_PRIVATE_KEY }}'

      - name: 'Get context from event'
        id: 'get_context'
        env:
          EVENT_NAME: '${{ github.event_name }}'
          EVENT_PAYLOAD: '${{ toJSON(github.event) }}'
        run: |-
          set -euo pipefail

          USER_REQUEST=""
          ISSUE_NUMBER=""
          IS_PR="false"

          if [[ "${EVENT_NAME}" == "issues" ]]; then
            USER_REQUEST=$(echo "${EVENT_PAYLOAD}" | jq -r .issue.body)
            ISSUE_NUMBER=$(echo "${EVENT_PAYLOAD}" | jq -r .issue.number)
          elif [[ "${EVENT_NAME}" == "issue_comment" ]]; then
            USER_REQUEST=$(echo "${EVENT_PAYLOAD}" | jq -r .comment.body)
            ISSUE_NUMBER=$(echo "${EVENT_PAYLOAD}" | jq -r .issue.number)
            if [[ $(echo "${EVENT_PAYLOAD}" | jq -r .issue.pull_request) != "null" ]]; then
              IS_PR="true"
            fi
          elif [[ "${EVENT_NAME}" == "pull_request_review" ]]; then
            USER_REQUEST=$(echo "${EVENT_PAYLOAD}" | jq -r .review.body)
            ISSUE_NUMBER=$(echo "${EVENT_PAYLOAD}" | jq -r .pull_request.number)
            IS_PR="true"
          elif [[ "${EVENT_NAME}" == "pull_request_review_comment" ]]; then
            USER_REQUEST=$(echo "${EVENT_PAYLOAD}" | jq -r .comment.body)
            ISSUE_NUMBER=$(echo "${EVENT_PAYLOAD}" | jq -r .pull_request.number)
            IS_PR="true"
          fi

          # Clean up user request
          USER_REQUEST=$(echo "${USER_REQUEST}" | sed 's/.*@gemini-cli//' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

          {
            echo "user_request=${USER_REQUEST}"
            echo "issue_number=${ISSUE_NUMBER}"
            echo "is_pr=${IS_PR}"
          } >> "${GITHUB_OUTPUT}"

      - name: 'Set up git user for commits'
        run: |-
          git config --global user.name 'gemini-cli[bot]'
          git config --global user.email 'gemini-cli[bot]@users.noreply.github.com'

      - name: 'Checkout PR branch'
        if: |-
          ${{  steps.get_context.outputs.is_pr == 'true' }}
        uses: 'actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8' # ratchet:actions/checkout@v5
        with:
          token: '${{ steps.generate_token.outputs.token || secrets.GITHUB_TOKEN }}'
          repository: '${{ github.repository }}'
          ref: 'refs/pull/${{ steps.get_context.outputs.issue_number }}/head'
          fetch-depth: 0

      - name: 'Checkout main branch'
        if: |-
          ${{  steps.get_context.outputs.is_pr == 'false' }}
        uses: 'actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8' # ratchet:actions/checkout@v5
        with:
          token: '${{ steps.generate_token.outputs.token || secrets.GITHUB_TOKEN }}'
          repository: '${{ github.repository }}'
          fetch-depth: 0

      - name: 'Acknowledge request'
        env:
          GITHUB_ACTOR: '${{ github.actor }}'
          GITHUB_TOKEN: '${{ steps.generate_token.outputs.token || secrets.GITHUB_TOKEN }}'
          ISSUE_NUMBER: '${{ steps.get_context.outputs.issue_number }}'
          REPOSITORY: '${{ github.repository }}'
          REQUEST_TYPE: '${{ steps.get_context.outputs.request_type }}'
        run: |-
          set -euo pipefail
          MESSAGE="@${GITHUB_ACTOR} I've received your request and I'm working on it now! 🤖"
          if [[ -n "${MESSAGE}" ]]; then
            gh issue comment "${ISSUE_NUMBER}" \
              --body "${MESSAGE}" \
              --repo "${REPOSITORY}"
          fi

      - name: 'Get description'
        id: 'get_description'
        env:
          GITHUB_TOKEN: '${{ steps.generate_token.outputs.token || secrets.GITHUB_TOKEN }}'
          IS_PR: '${{ steps.get_context.outputs.is_pr }}'
          ISSUE_NUMBER: '${{ steps.get_context.outputs.issue_number }}'
        run: |-
          set -euo pipefail
          if [[ "${IS_PR}" == "true" ]]; then
            DESCRIPTION=$(gh pr view "${ISSUE_NUMBER}" --json body --template '{{.body}}')
          else
            DESCRIPTION=$(gh issue view "${ISSUE_NUMBER}" --json body --template '{{.body}}')
          fi
          {
            echo "description<<EOF"
            echo "${DESCRIPTION}"
            echo "EOF"
          } >> "${GITHUB_OUTPUT}"

      - name: 'Get comments'
        id: 'get_comments'
        env:
          GITHUB_TOKEN: '${{ steps.generate_token.outputs.token || secrets.GITHUB_TOKEN }}'
          IS_PR: '${{ steps.get_context.outputs.is_pr }}'
          ISSUE_NUMBER: '${{ steps.get_context.outputs.issue_number }}'
        run: |-
          set -euo pipefail
          if [[ "${IS_PR}" == "true" ]]; then
            COMMENTS=$(gh pr view "${ISSUE_NUMBER}" --json comments --template '{{range .comments}}{{.author.login}}: {{.body}}{{"\n"}}{{end}}')
          else
            COMMENTS=$(gh issue view "${ISSUE_NUMBER}" --json comments --template '{{range .comments}}{{.author.login}}: {{.body}}{{"\n"}}{{end}}')
          fi
          {
            echo "comments<<EOF"
            echo "${COMMENTS}"
            echo "EOF"
          } >> "${GITHUB_OUTPUT}"

      - name: 'Run Gemini'
        id: 'run_gemini'
        uses: 'google-github-actions/run-gemini-cli@v0'
        env:
          GITHUB_TOKEN: '${{ steps.generate_token.outputs.token || secrets.GITHUB_TOKEN }}'
          REPOSITORY: '${{ github.repository }}'
          USER_REQUEST: '${{ steps.get_context.outputs.user_request }}'
          ISSUE_NUMBER: '${{ steps.get_context.outputs.issue_number }}'
          IS_PR: '${{ steps.get_context.outputs.is_pr }}'
        with:
          gemini_api_key: '${{ secrets.GEMINI_API_KEY }}'
          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 }}'
          use_vertex_ai: '${{ vars.GOOGLE_GENAI_USE_VERTEXAI }}'
          use_gemini_code_assist: '${{ vars.GOOGLE_GENAI_USE_GCA }}'
          settings: |-
            {
              "debug": ${{ fromJSON(env.DEBUG || env.ACTIONS_STEP_DEBUG || false) }},
              "maxSessionTurns": 50,
              "telemetry": {
                "enabled": false,
                "target": "gcp"
              }
            }
          prompt: |-
            ## Role

            You are a helpful AI assistant invoked via a CLI interface in a GitHub workflow. You have access to tools to interact with the repository and respond to the user.

            ## Context

            - **Repository**: `${{ github.repository }}`
            - **Triggering Event**: `${{ github.event_name }}`
            - **Issue/PR Number**: `${{ steps.get_context.outputs.issue_number }}`
            - **Is this a PR?**: `${{ steps.get_context.outputs.is_pr }}`
            - **Issue/PR Description**:
            `${{ steps.get_description.outputs.description }}`
            - **Comments**:
            `${{ steps.get_comments.outputs.comments }}`

            ## User Request

            The user has sent the following request:
            `${{ steps.get_context.outputs.user_request }}`

            ## How to Respond to Issues, PR Comments, and Questions

            This workflow supports three main scenarios:

            1. **Creating a Fix for an Issue**
               - Carefully read the user request and the related issue or PR description.
               - Use available tools to gather all relevant context (e.g., `gh issue view`, `gh pr view`, `gh pr diff`, `cat`, `head`, `tail`).
               - Identify the root cause of the problem before proceeding.
               - **Show and maintain a plan as a checklist**:
                 - At the very beginning, outline the steps needed to resolve the issue or address the request and post them as a checklist comment on the issue or PR (use GitHub markdown checkboxes: `- [ ] Task`).
                 - Example:
                   
                   ### Plan
                   - [ ] Investigate the root cause
                   - [ ] Implement the fix in `file.py`
                   - [ ] Add/modify tests
                   - [ ] Update documentation
                   - [ ] Verify the fix and close the issue
                   
                 - Use: `gh pr comment "${ISSUE_NUMBER}" --body "<plan>"` or `gh issue comment "${ISSUE_NUMBER}" --body "<plan>"` to post the initial plan.
                 - As you make progress, keep the checklist visible and up to date by editing the same comment (check off completed tasks with `- [x]`).
                   - To update the checklist:
                     1. Find the comment ID for the checklist (use `gh pr comment list "${ISSUE_NUMBER}"` or `gh issue comment list "${ISSUE_NUMBER}"`).
                     2. Edit the comment with the updated checklist:
                        - For PRs: `gh pr comment --edit <comment-id> --body "<updated plan>"`
                        - For Issues: `gh issue comment --edit <comment-id> --body "<updated plan>"`
                     3. The checklist should only be maintained as a comment on the issue or PR. Do not track or update the checklist in code files.
               - If the fix requires code changes, determine which files and lines are affected. If clarification is needed, note any questions for the user.
               - Make the necessary code or documentation changes using the available tools (e.g., `write_file`). Ensure all changes follow project conventions and best practices. Reference all shell variables as `"${VAR}"` (with quotes and braces) to prevent errors.
               - Run any relevant tests or checks to verify the fix works as intended. If possible, provide evidence (test output, screenshots, etc.) that the issue is resolved.
               - **Branching and Committing**:
                 - **NEVER commit directly to the `main` branch.**
                 - If you are working on a **pull request** (`IS_PR` is `true`), the correct branch is already checked out. Simply commit and push to it.
                   - `git add .`
                   - `git commit -m "feat: <describe the change>"`
                   - `git push`
                 - If you are working on an **issue** (`IS_PR` is `false`), create a new branch for your changes. A good branch name would be `issue/${ISSUE_NUMBER}/<short-description>`.
                   - `git checkout -b issue/${ISSUE_NUMBER}/my-fix`
                   - `git add .`
                   - `git commit -m "feat: <describe the fix>"`
                   - `git push origin issue/${ISSUE_NUMBER}/my-fix`
                   - After pushing, you can create a pull request: `gh pr create --title "Fixes #${ISSUE_NUMBER}: <short title>" --body "This PR addresses issue #${ISSUE_NUMBER}."`
               - Summarize what was changed and why in a markdown file: `write_file("response.md", "<your response here>")`
               - Post the response as a comment:
                 - For PRs: `gh pr comment "${ISSUE_NUMBER}" --body-file response.md`
                 - For Issues: `gh issue comment "${ISSUE_NUMBER}" --body-file response.md`

            2. **Addressing Comments on a Pull Request**
               - Read the specific comment and the context of the PR.
               - Use tools like `gh pr view`, `gh pr diff`, and `cat` to understand the code and discussion.
               - If the comment requests a change or clarification, follow the same process as for fixing an issue: create a checklist plan, implement, test, and commit any required changes, updating the checklist as you go.
               - **Committing Changes**: The correct PR branch is already checked out. Simply add, commit, and push your changes.
                 - `git add .`
                 - `git commit -m "fix: address review comments"`
                 - `git push`
               - If the comment is a question, answer it directly and clearly, referencing code or documentation as needed.
               - Document your response in `response.md` and post it as a PR comment: `gh pr comment "${ISSUE_NUMBER}" --body-file response.md`

            3. **Answering Any Question on an Issue**
               - Read the question and the full issue context using `gh issue view` and related tools.
               - Research or analyze the codebase as needed to provide an accurate answer.
               - If the question requires code or documentation changes, follow the fix process above, including creating and updating a checklist plan and **creating a new branch for your changes as described in section 1.**
               - Write a clear, concise answer in `response.md` and post it as an issue comment: `gh issue comment "${ISSUE_NUMBER}" --body-file response.md`

            ## Guidelines

            - **Be concise and actionable.** Focus on solving the user's problem efficiently.
            - **Always commit and push your changes if you modify code or documentation.**
            - **If you are unsure about the fix or answer, explain your reasoning and ask clarifying questions.**
            - **Follow project conventions and best practices.**

Log output


Additional information

No response

Metadata

Metadata

Assignees

Labels

area/workflowskind/bugSomething isn't workingpriority/p1Important and should be addressed in the near term

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions