diff --git a/docs/api-reference/github-actions.mdx b/docs/api-reference/github-actions.mdx new file mode 100644 index 000000000..5632f8ecb --- /dev/null +++ b/docs/api-reference/github-actions.mdx @@ -0,0 +1,451 @@ +--- +title: "GitHub Actions Integration" +sidebarTitle: "GitHub Actions" +icon: "github" +--- + +Integrate Codegen with GitHub Actions to automate code reviews, issue triage, and other development workflows. This guide shows you how to use the Codegen Python SDK within GitHub Actions workflows. + + + This approach is necessary because GitHub webhooks don't fire for bot users, preventing direct `@codegen` mentions in automated workflows. Using GitHub Actions with the Codegen API provides a reliable alternative. + + +## Prerequisites + +Before setting up GitHub Actions with Codegen, ensure you have: + +- A GitHub repository with Actions enabled +- A Codegen account with API access +- Your organization ID and API token from [codegen.com/developer](https://codegen.com/developer) +- The Codegen GitHub App installed on your repository + +## Basic Setup + +### 1. Store Your Credentials + +Add your Codegen credentials as GitHub repository secrets: + +1. Go to your repository → Settings → Secrets and variables → Actions +2. Add the following secrets: + - `CODEGEN_ORG_ID`: Your organization ID from codegen.com/developer + - `CODEGEN_API_TOKEN`: Your API token from codegen.com/developer + +### 2. Create a GitHub Actions Workflow + +Create `.github/workflows/codegen-review.yml` in your repository: + +```yaml +name: Codegen PR Review + +on: + pull_request: + types: [opened, synchronize] + branches: [main, develop] + +jobs: + codegen-review: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install Codegen SDK + run: | + pip install codegen + + - name: Run Codegen Review + env: + CODEGEN_ORG_ID: ${{ secrets.CODEGEN_ORG_ID }} + CODEGEN_API_TOKEN: ${{ secrets.CODEGEN_API_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + python .github/scripts/codegen_review.py +``` + +### 3. Create the Review Script + +Create `.github/scripts/codegen_review.py`: + +```python +import os +import sys +from codegen.agents.agent import Agent + +def main(): + # Get environment variables + org_id = os.getenv('CODEGEN_ORG_ID') + api_token = os.getenv('CODEGEN_API_TOKEN') + github_token = os.getenv('GITHUB_TOKEN') + + if not all([org_id, api_token]): + print("Error: Missing required environment variables") + sys.exit(1) + + # Get PR information from GitHub context + pr_number = os.getenv('GITHUB_EVENT_PATH') + repo_name = os.getenv('GITHUB_REPOSITORY') + + # Initialize Codegen agent + agent = Agent( + org_id=org_id, + token=api_token + ) + + # Create review prompt + prompt = f""" + Please review PR #{pr_number} in repository {repo_name}. + + Focus on: + - Code quality and best practices + - Potential bugs or security issues + - Performance considerations + - Documentation and testing + + Provide specific, actionable feedback with line-by-line comments where appropriate. + """ + + try: + # Run the agent + task = agent.run(prompt=prompt) + + # Wait for completion (with timeout) + max_attempts = 30 # 5 minutes with 10-second intervals + attempt = 0 + + while attempt < max_attempts: + task.refresh() + print(f"Task status: {task.status}") + + if task.status == "completed": + print("✅ Review completed successfully!") + if hasattr(task, 'result') and task.result: + print(f"Result: {task.result}") + break + elif task.status == "failed": + print("❌ Review failed") + sys.exit(1) + + attempt += 1 + time.sleep(10) + + if attempt >= max_attempts: + print("⏰ Review timed out") + sys.exit(1) + + except Exception as e: + print(f"Error running Codegen review: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() +``` + +## Advanced Configuration + +### Conditional Reviews + +Only run reviews for specific conditions: + +```yaml +name: Conditional Codegen Review + +on: + pull_request: + types: [opened, synchronize] + +jobs: + check-conditions: + runs-on: ubuntu-latest + outputs: + should-review: ${{ steps.check.outputs.should-review }} + steps: + - name: Check if review needed + id: check + run: | + # Skip if PR is from dependabot + if [[ "${{ github.actor }}" == "dependabot[bot]" ]]; then + echo "should-review=false" >> $GITHUB_OUTPUT + # Skip if PR is a draft + elif [[ "${{ github.event.pull_request.draft }}" == "true" ]]; then + echo "should-review=false" >> $GITHUB_OUTPUT + # Skip if PR has "skip-review" label + elif [[ "${{ contains(github.event.pull_request.labels.*.name, 'skip-review') }}" == "true" ]]; then + echo "should-review=false" >> $GITHUB_OUTPUT + else + echo "should-review=true" >> $GITHUB_OUTPUT + fi + + codegen-review: + needs: check-conditions + if: needs.check-conditions.outputs.should-review == 'true' + runs-on: ubuntu-latest + # ... rest of the job +``` + +### Custom Review Types + +Create different review workflows for different scenarios: + +```python +# .github/scripts/codegen_security_review.py +def security_review(): + prompt = f""" + Perform a security-focused review of PR #{pr_number} in {repo_name}. + + Look specifically for: + - SQL injection vulnerabilities + - XSS vulnerabilities + - Authentication/authorization issues + - Sensitive data exposure + - Insecure dependencies + + Provide detailed security recommendations. + """ + # ... rest of implementation + +# .github/scripts/codegen_performance_review.py +def performance_review(): + prompt = f""" + Analyze PR #{pr_number} in {repo_name} for performance implications. + + Focus on: + - Database query efficiency + - Memory usage patterns + - CPU-intensive operations + - Caching opportunities + - Scalability concerns + + Suggest specific optimizations. + """ + # ... rest of implementation +``` + +### Error Handling and Retries + +Implement robust error handling: + +```python +import time +import logging +from typing import Optional + +def run_with_retry(agent: Agent, prompt: str, max_retries: int = 3) -> Optional[str]: + """Run agent with retry logic and proper error handling.""" + + for attempt in range(max_retries): + try: + task = agent.run(prompt=prompt) + + # Wait for completion with exponential backoff + max_wait_time = 300 # 5 minutes + check_interval = 10 + total_wait = 0 + + while total_wait < max_wait_time: + task.refresh() + logging.info(f"Attempt {attempt + 1}: Task status: {task.status}") + + if task.status == "completed": + return task.result if hasattr(task, 'result') else "Review completed" + elif task.status == "failed": + raise Exception(f"Task failed: {getattr(task, 'error', 'Unknown error')}") + + time.sleep(check_interval) + total_wait += check_interval + + raise Exception("Task timed out") + + except Exception as e: + logging.error(f"Attempt {attempt + 1} failed: {e}") + if attempt == max_retries - 1: + raise + time.sleep(2 ** attempt) # Exponential backoff + + return None +``` + +## Environment-Specific Workflows + +### Development Environment + +```yaml +# .github/workflows/codegen-dev-review.yml +name: Codegen Dev Review + +on: + pull_request: + types: [opened, synchronize] + branches: [develop, feature/*] + +jobs: + dev-review: + runs-on: ubuntu-latest + steps: + # ... setup steps + - name: Run Development Review + env: + CODEGEN_ORG_ID: ${{ secrets.CODEGEN_ORG_ID }} + CODEGEN_API_TOKEN: ${{ secrets.CODEGEN_API_TOKEN }} + REVIEW_TYPE: "development" + run: | + python .github/scripts/codegen_review.py --type development +``` + +### Production Environment + +```yaml +# .github/workflows/codegen-prod-review.yml +name: Codegen Production Review + +on: + pull_request: + types: [opened, synchronize] + branches: [main, master] + +jobs: + prod-review: + runs-on: ubuntu-latest + steps: + # ... setup steps + - name: Run Production Review + env: + CODEGEN_ORG_ID: ${{ secrets.CODEGEN_ORG_ID }} + CODEGEN_API_TOKEN: ${{ secrets.CODEGEN_API_TOKEN }} + REVIEW_TYPE: "production" + run: | + python .github/scripts/codegen_review.py --type production --strict +``` + +## Best Practices + +### Security + +- **Never commit API tokens**: Always use GitHub Secrets +- **Use least privilege**: Create dedicated API tokens with minimal required permissions +- **Rotate tokens regularly**: Update API tokens periodically +- **Monitor usage**: Track API usage to detect anomalies + +### Performance + +- **Set appropriate timeouts**: Don't let workflows run indefinitely +- **Use caching**: Cache Python dependencies to speed up workflow execution +- **Parallel execution**: Run multiple review types in parallel when possible +- **Rate limiting**: Respect API rate limits to avoid throttling + +### Reliability + +- **Implement retries**: Handle transient failures gracefully +- **Add logging**: Include detailed logging for debugging +- **Fail gracefully**: Don't block PRs if reviews fail +- **Monitor workflows**: Set up alerts for workflow failures + +## Troubleshooting + +### Common Issues + +**Issue**: "No repos found in the organization" +``` +Solution: Verify your organization ID is correct and the repository +is accessible to your Codegen organization. +``` + +**Issue**: "Authentication failed" +``` +Solution: Check that your API token is valid and properly set in +GitHub Secrets. Tokens may expire and need renewal. +``` + +**Issue**: "Task timeout" +``` +Solution: Increase the timeout duration or break large PRs into +smaller chunks. Complex reviews may take longer to complete. +``` + +**Issue**: "Workflow not triggering" +``` +Solution: Check the workflow triggers and ensure the PR meets +the specified conditions (branch names, PR types, etc.). +``` + +### Debugging + +Enable debug logging in your workflow: + +```yaml +- name: Run Codegen Review + env: + CODEGEN_DEBUG: "true" + CODEGEN_LOG_LEVEL: "DEBUG" + run: | + python .github/scripts/codegen_review.py +``` + +Add debug output to your Python script: + +```python +import logging + +logging.basicConfig( + level=logging.DEBUG if os.getenv('CODEGEN_DEBUG') else logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s' +) + +logger = logging.getLogger(__name__) +``` + +## Examples + +### Complete Working Example + +Here's a complete, production-ready workflow: + + + See a full working example with all files and configurations in our examples repository. + + +### Integration with Existing CI/CD + +Integrate Codegen reviews with your existing CI/CD pipeline: + +```yaml +name: CI/CD with Codegen + +on: + pull_request: + types: [opened, synchronize] + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - name: Run tests + run: npm test + + codegen-review: + needs: tests # Only run review if tests pass + if: success() + runs-on: ubuntu-latest + steps: + # ... Codegen review steps + + deploy: + needs: [tests, codegen-review] + if: success() && github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + steps: + - name: Deploy + run: npm run deploy +``` + +## Next Steps + +- Explore the [Codegen API Reference](/api-reference) for advanced usage +- Check out [example workflows](https://github.com/codegen-sh/codegen-examples) in our examples repository +- Join our [Slack community](https://community.codegen.com) for support and best practices +- Consider [enterprise features](https://codegen.com/enterprise) for advanced workflow management + diff --git a/docs/docs.json b/docs/docs.json index 296a85d39..e92015134 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -73,7 +73,7 @@ }, { "group": "Guides", - "pages": ["api-reference/agent-run-logs"] + "pages": ["api-reference/agent-run-logs", "api-reference/github-actions"] } ] },