Skip to content

gptme-bot

gptme-bot #27

Workflow file for this run

name: gptme-bot
on:
issue_comment:
types: [created]
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
# Set permissions on GITHUB_TOKEN to allow updates to GitHub Actions workflows
permissions:
actions: write
jobs:
check-comment:
runs-on: ubuntu-latest
outputs:
gptme_command: ${{ steps.detect_command.outputs.gptme_command }}
steps:
- name: Detect gptme command
id: detect_command
env:
COMMENT_BODY: ${{ github.event.comment.body }}
run: |
# Check if the comment starts with "@gptme"
if [[ "$COMMENT_BODY" == "@gptme "* ]]; then
# Extract the command
GPTME_COMMAND=${COMMENT_BODY#"@gptme "}
echo "gptme_command='${GPTME_COMMAND}'" >> $GITHUB_OUTPUT
fi
- name: Fail if author not on whitelist
if: steps.detect_command.outputs.gptme_command
run: |
WHITELIST=("ErikBjare") # Add your allowed usernames here
COMMENT_AUTHOR="${{ github.event.comment.user.login }}"
if [[ ! " ${WHITELIST[@]} " =~ " ${COMMENT_AUTHOR} " ]]; then
echo "Error: Author ${COMMENT_AUTHOR} is not on the whitelist."
exit 1
else
echo "Author ${COMMENT_AUTHOR} is on the whitelist."
fi
execute-command:
needs: check-comment
if: needs.check-comment.outputs.gptme_command
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Install ctags
run: sudo apt install universal-ctags
- name: Checkout PR branch if comment is on a PR
run: |
# Fetch details about the "issue" the comment is on
DATA=$(gh api /repos/${{ github.repository }}/issues/${{ github.event.issue.number }})
# Extract whether this "issue" is a PR and
IS_PR=$(echo "$DATA" | jq -r .pull_request)
# If this is a PR, checkout its branch
if [[ "$IS_PR" != "null" ]]; then
# Fetch details about the PR the comment is on
DATA=$(gh api /repos/${{ github.repository }}/pulls/${{ github.event.issue.number }})
# Get the PR's branch name
PR_BRANCH=$(echo "$DATA" | jq -r .head.ref)
git fetch origin $PR_BRANCH
git checkout $PR_BRANCH
fi
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install poetry
run: pipx install poetry
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
cache: 'poetry'
- name: Install dependencies
run: |
make build
poetry install -E datascience
- name: Run gptme
env:
GPTME_COMMAND: ${{ needs.check-comment.outputs.gptme_command }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: |
gh issue view $ISSUE_NUMBER > issue.md
gh issue view $ISSUE_NUMBER -c > comments.md
# Run gptme with the extracted command
# NOTE: always include issue context? risk of bloating context? perhaps only include if 'issue' mentioned in command?
poetry run gptme --non-interactive "$GPTME_COMMAND" issue.md comments.md
rm issue.md comments.md
- name: Commit, push, comment
env:
GPTME_COMMAND: ${{ needs.check-comment.outputs.gptme_command }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
ISSUE_TYPE: ${{ github.event.issue.pull_request && 'pull_request' || 'issue' }}
REPO_NAME: ${{ github.event.repository.name }}
USER_NAME: ${{ github.event.repository.owner.login }}
run: |
BRANCH_NAME="gptme-bot-changes-$(date +'%Y%m%d%H%M%S')"
BRANCH_BASE="master"
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
COMMENT_URL="https://github.com/${{ github.repository }}/issues/${{ github.event.issue.number }}#issuecomment-${{ github.event.comment.id }}"
COMMIT_MSG="gptme '$GPTME_COMMAND'
Made in this run: $RUN_URL
Triggered by this comment: $COMMENT_URL"
git config user.name "gptme-bot"
git config user.email "[email protected]"
if [[ $ISSUE_TYPE == "pull_request" ]]; then
# Push changes to the PR branch
git add -A
git commit -m "$COMMIT_MSG"
git push
# Comment on the PR
echo "Changes have been pushed to this pull request." | gh pr comment $ISSUE_NUMBER -R $USER_NAME/$REPO_NAME --body-file=-
else
# Create a new branch and push changes
git checkout -b $BRANCH_NAME
git add -A
git commit -m "$COMMIT_MSG"
git push -u origin $BRANCH_NAME
# Some say this helps! https://github.com/cli/cli/issues/2691#issuecomment-1289521962
sleep 1
# Create a PR
PR_URL=$(gh pr create --title "Changes for issue #$ISSUE_NUMBER" --body "$COMMIT_MSG" --repo $USER_NAME/$REPO_NAME | grep -o 'https://github.com[^ ]*')
# These are redundant/implied: --base $BRANCH_BASE --head $USER_NAME:$BRANCH_NAME
# Comment on the issue with the PR link
echo "A pull request has been created for this issue: $PR_URL" | gh issue comment $ISSUE_NUMBER -R $USER_NAME/$REPO_NAME --body-file=-
fi