- Notifications
You must be signed in to change notification settings - Fork1k
ci: add workflow for agentic issue triage#19839
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
4190d01
40199e1
c408273
082f24d
4099aa8
3140885
5483ae0
99dbfad
8c03a76
e519504
39f6791
f5fd496
9042463
85c7af7
4634da0
d682786
7dd78d7
736f019
1683c7c
cb2c111
52a1d0c
56e3a11
574d114
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
name: AI Triage Automation | ||
on: | ||
workflow_dispatch: | ||
inputs: | ||
issue_url: | ||
description: 'GitHub Issue URL to process' | ||
required: true | ||
type: string | ||
template_name: | ||
description: 'Coder template to use for workspace' | ||
required: true | ||
default: 'ai-workspace' | ||
type: string | ||
prefix: | ||
description: 'Prefix for workspace name' | ||
required: false | ||
default: 'traiage' | ||
type: string | ||
persistence_mode: | ||
description: 'Persistence mode (push or archive)' | ||
required: false | ||
type: choice | ||
options: | ||
- push | ||
- archive | ||
default: 'archive' | ||
jobs: | ||
traiage: | ||
name: Triage GitHub Issue with Claude Code | ||
runs-on: ubuntu-latest | ||
timeout-minutes: 30 | ||
env: | ||
CODER_URL: ${{ secrets.TRAIAGE_CODER_URL }} | ||
CODER_SESSION_TOKEN: ${{ secrets.TRAIAGE_CODER_SESSION_TOKEN }} | ||
TEMPLATE_NAME: ${{ inputs.template_name }} | ||
permissions: | ||
contents: read | ||
issues: write | ||
actions: write | ||
steps: | ||
- name: Checkout repository | ||
uses: actions/checkout@v4 | ||
with: | ||
persist-credentials: false | ||
fetch-depth: 0 | ||
- name: Extract context key from issue | ||
id: extract-context | ||
env: | ||
ISSUE_URL: ${{ inputs.issue_url }} | ||
run: | | ||
issue_number="$(gh issue view "${ISSUE_URL}" --json number --jq '.number')" | ||
context_key="gh-${issue_number}" | ||
echo "context_key=${context_key}" >> "${GITHUB_OUTPUT}" | ||
echo "CONTEXT_KEY=${context_key}" >> "${GITHUB_ENV}" | ||
- name: Download and install Coder binary | ||
shell: bash | ||
env: | ||
CODER_URL: ${{ secrets.TRAIAGE_CODER_URL }} | ||
run: | | ||
if [ "${{ runner.arch }}" == "ARM64" ]; then | ||
ARCH="arm64" | ||
else | ||
ARCH="amd64" | ||
fi | ||
mkdir -p "${HOME}/.local/bin" | ||
curl -fsSL --compressed "$CODER_URL/bin/coder-linux-${ARCH}" -o "${HOME}/.local/bin/coder" | ||
chmod +x "${HOME}/.local/bin/coder" | ||
export PATH="$HOME/.local/bin:$PATH" | ||
coder version | ||
coder whoami | ||
echo "$HOME/.local/bin" >> "${GITHUB_PATH}" | ||
- name: Create Coder workspace | ||
id: create-workspace | ||
env: | ||
PREFIX: ${{ inputs.prefix }} | ||
CONTEXT_KEY: ${{ steps.extract-context.outputs.context_key }} | ||
RUN_ID: ${{ github.run_id }} | ||
TEMPLATE_PARAMETERS: ${{ secrets.TRAIAGE_TEMPLATE_PARAMETERS }} | ||
run: | | ||
export WORKSPACE_NAME="${PREFIX}-${CONTEXT_KEY}-${RUN_ID}" | ||
echo "Creating workspace: $WORKSPACE_NAME" | ||
./scripts/traiage.sh create | ||
echo "workspace_name=$WORKSPACE_NAME" >> "${GITHUB_OUTPUT}" | ||
echo "WORKSPACE_NAME=${WORKSPACE_NAME}" >> "${GITHUB_ENV}" | ||
- name: Send prompt to AI agent inside workspace | ||
id: prepare-prompt | ||
env: | ||
WORKSPACE_NAME: ${{ steps.create-workspace.outputs.workspace_name }} | ||
ISSUE_URL: ${{ inputs.issue_url }} | ||
run: | | ||
PROMPT_FILE=/tmp/prompt.txt | ||
trap 'rm -f "${PROMPT_FILE}"' EXIT | ||
# Fetch issue description using `gh` CLI | ||
issue_description=$(gh issue view "${ISSUE_URL}") | ||
# Write a prompt to PROMPT_FILE | ||
cat > "${PROMPT_FILE}" <<EOF | ||
Analyze the below GitHub issue description, understand the root cause, and make appropriate changes to resolve the issue. | ||
ISSUE URL: ${ISSUE_URL} | ||
ISSUE DESCRIPTION BELOW: | ||
${issue_description} | ||
EOF | ||
echo "WORKSPACE_NAME: ${WORKSPACE_NAME}" | ||
# This command will run the prompt inside the workspace | ||
# and exit once the agent has completed the task. | ||
PROMPT=$(cat $PROMPT_FILE) ./scripts/traiage.sh prompt | ||
johnstcn marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
- name: Commit and push changes | ||
id: commit-push | ||
if: ${{ inputs.persistence_mode == 'push' }} | ||
run: | | ||
echo "Committing and pushing changes in workspace: $WORKSPACE_NAME" | ||
./scripts/traiage.sh commit-push | ||
- name: Create and upload archive | ||
id: create-archive | ||
if: ${{ inputs.persistence_mode == 'archive' }} | ||
env: | ||
DESTINATION_PREFIX: ${{ secrets.TRAIAGE_DESTINATION_PREFIX }} | ||
run: | | ||
echo "Creating archive for workspace: $WORKSPACE_NAME" | ||
./scripts/traiage.sh archive | ||
echo "archive_url=${DESTINATION_PREFIX%%/}/$WORKSPACE_NAME.tar.gz" >> "${GITHUB_OUTPUT}" | ||
- name: Report results | ||
env: | ||
ISSUE_URL: ${{ inputs.issue_url }} | ||
CONTEXT_KEY: ${{ steps.extract-context.outputs.context_key }} | ||
WORKSPACE_NAME: ${{ steps.create-workspace.outputs.workspace_name }} | ||
ARCHIVE_URL: ${{ steps.create-archive.outputs.archive_url }} | ||
run: | | ||
{ | ||
echo "## TrAIage Results"; | ||
echo "- **Issue URL:** ${ISSUE_URL}"; | ||
echo "- **Context Key:** ${CONTEXT_KEY}"; | ||
echo "- **Workspace:** ${WORKSPACE_NAME}"; | ||
echo "- **Archive URL:** ${ARCHIVE_URL}" | ||
} >> "${GITHUB_STEP_SUMMARY}" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Could we also output here how to utilize the artifact? PS. What's the difference of throwing it into step summary vs just outputting to stdout? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more.
ref:https://github.blog/news-insights/product-news/supercharging-github-actions-with-job-summaries/ There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Regarding the "how-to" -- I think we will want to add some level of automation around this in the associated template. Something like the below:
| ||
- name: Cleanup workspace | ||
if: steps.create-workspace.outputs.workspace_name != '' && (inputs.persistence_mode == 'archive' && steps.create-archive.outputs.archive_url != '') | ||
run: | | ||
echo "Cleaning up workspace: $WORKSPACE_NAME" | ||
./scripts/traiage.sh delete || true |
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.