diff --git a/documentation/docs/tutorials/cicd.md b/documentation/docs/tutorials/cicd.md new file mode 100644 index 00000000..21ba4f75 --- /dev/null +++ b/documentation/docs/tutorials/cicd.md @@ -0,0 +1,242 @@ +--- +title: CI/CD Environments +description: Set up Goose in your CI/CD pipeline to automate tasks +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Goose isn’t just useful on your local machine, it can also streamline tasks in CI/CD environments. By integrating Goose into your pipeline, you can automate tasks such as: + +- Code reviews +- Documentation checks +- Build and deployment workflows +- Infrastructure and environment management +- Rollbacks and recovery processes +- Intelligent test execution + +This guide walks you through setting up Goose in your CI/CD pipeline, with a focus on using GitHub Actions for code reviews. + + +## Using Goose with GitHub Actions +You can run Goose directly within GitHub Actions. Follow these steps to set up your workflow. + +:::info TLDR +
+ Copy the GitHub Workflow + + ```yaml title="goose.yml" + + name: Goose + + on: + pull_request: + types: [opened, synchronize, reopened, labeled] + + permissions: + contents: write + pull-requests: write + issues: write + + env: + PROVIDER_API_KEY: ${{ secrets.REPLACE_WITH_PROVIDER_API_KEY }} + PR_NUMBER: ${{ github.event.pull_request.number }} + + jobs: + goose-comment: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Gather PR information + run: | + { + echo "# Files Changed" + gh pr view $PR_NUMBER --json files \ + -q '.files[] | "* " + .path + " (" + (.additions|tostring) + " additions, " + (.deletions|tostring) + " deletions)"' + echo "" + echo "# Changes Summary" + gh pr diff $PR_NUMBER + } > changes.txt + + - name: Install Goose CLI + run: | + mkdir -p /home/runner/.local/bin + curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh \ + | CONFIGURE=false INSTALL_PATH=/home/runner/.local/bin bash + echo "/home/runner/.local/bin" >> $GITHUB_PATH + + - name: Configure Goose + run: | + mkdir -p ~/.config/goose + cat < ~/.config/goose/config.yaml + GOOSE_PROVIDER: REPLACE_WITH_PROVIDER + GOOSE_MODEL: REPLACE_WITH_MODEL + keyring: false + EOF + + - name: Create instructions for Goose + run: | + cat < instructions.txt + Create a summary of the changes provided. Don't provide any session or logging details. + The summary for each file should be brief and structured as: + + - dot points of changes + You don't need any extensions, don't mention extensions at all. + The changes to summarise are: + $(cat changes.txt) + EOF + + - name: Test + run: cat instructions.txt + + - name: Run Goose and filter output + run: | + goose run --instructions instructions.txt | \ + # Remove ANSI color codes + sed -E 's/\x1B\[[0-9;]*[mK]//g' | \ + # Remove session/logging lines + grep -v "logging to /home/runner/.config/goose/sessions/" | \ + grep -v "^starting session" | \ + grep -v "^Closing session" | \ + # Trim trailing whitespace + sed 's/[[:space:]]*$//' \ + > pr_comment.txt + + - name: Post comment to PR + run: | + cat -A pr_comment.txt + gh pr comment $PR_NUMBER --body-file pr_comment.txt + ``` +
+ +::: + +### 1. Create the Workflow File + +Create a new file in your repository at `.github/workflows/goose.yml`. This will contain your GitHub Actions workflow. + +### 2. Define the Workflow Triggers and Permissions + +Configure the action such that it: + +- Triggers the workflow when a pull request is opened, updated, reopened, or labeled +- Grants the necessary permissions for Goose to interact with the repository +- Configures environment variables for your chosen LLM provider + +```yaml +name: Goose + +on: + pull_request: + types: [opened, synchronize, reopened, labeled] + +permissions: + contents: write + pull-requests: write + issues: write + +env: + PROVIDER_API_KEY: ${{ secrets.REPLACE_WITH_PROVIDER_API_KEY }} + PR_NUMBER: ${{ github.event.pull_request.number }} +``` + + +### 3. Install and Configure Goose + +To install and set up Goose in your workflow, add the following steps: + +```yaml +steps: + - name: Install Goose CLI + run: | + mkdir -p /home/runner/.local/bin + curl -fsSL https://github.com/block/goose/releases/download/stable/download_cli.sh \ + | CONFIGURE=false INSTALL_PATH=/home/runner/.local/bin bash + echo "/home/runner/.local/bin" >> $GITHUB_PATH + + - name: Configure Goose + run: | + mkdir -p ~/.config/goose + cat < ~/.config/goose/config.yaml + GOOSE_PROVIDER: REPLACE_WITH_PROVIDER + GOOSE_MODEL: REPLACE_WITH_MODEL + keyring: false + EOF +``` + +:::info Replacements +Replace `REPLACE_WITH_PROVIDER` and `REPLACE_WITH_MODEL` with your LLM provider and model names and add any other necessary configuration required. +::: + +### 4. Gather PR Changes and Prepare Instructions + +This step extracts pull request details and formats them into structured instructions for Goose. + +```yaml + - name: Create instructions for Goose + run: | + cat < instructions.txt + Create a summary of the changes provided. Don't provide any session or logging details. + The summary for each file should be brief and structured as: + + - dot points of changes + You don't need any extensions, don't mention extensions at all. + The changes to summarise are: + $(cat changes.txt) + EOF +``` + +### 5. Run Goose and Clean Output + +Now, run Goose with the formatted instructions and clean the output by removing ANSI color codes and unnecessary log messages. + +```yaml + - name: Run Goose and filter output + run: | + goose run --instructions instructions.txt | \ + # Remove ANSI color codes + sed -E 's/\x1B\[[0-9;]*[mK]//g' | \ + # Remove session/logging lines + grep -v "logging to /home/runner/.config/goose/sessions/" | \ + grep -v "^starting session" | \ + grep -v "^Closing session" | \ + # Trim trailing whitespace + sed 's/[[:space:]]*$//' \ + > pr_comment.txt +``` + +### 6. Post Comment to PR + +Finally, post the Goose output as a comment on the pull request: + +```yaml + - name: Post comment to PR + run: | + cat -A pr_comment.txt + gh pr comment $PR_NUMBER --body-file pr_comment.txt +``` + +With this workflow, Goose will run on pull requests, analyze the changes, and post a summary as a comment on the PR. + +This is just one example of what's possible. Feel free to modify your GitHub Action to meet your needs. + +--- + +## Security Considerations + +When running Goose in a CI/CD enviroment, keep these security practices in mind: + +1. **Secret Management** + - Store your sensitive credentials (like API keys) as GitHub Secrets. + - Never expose these credentials in logs or PR comments. + +2. **Principle of Least Privilege** + - Grant only the necessary permissions in your workflow and regularly audit them. + +3. **Input Validation** + - Ensure any inputs passed to Goose are sanitized and validated to prevent unexpected behavior. diff --git a/documentation/docusaurus.config.ts b/documentation/docusaurus.config.ts index cc438f9d..5c21f4c5 100644 --- a/documentation/docusaurus.config.ts +++ b/documentation/docusaurus.config.ts @@ -94,8 +94,8 @@ const config: Config = { { from: '/docs', to: '/docs/category/getting-started' - } - ], + } + ] }, ], ],