Files
gh-rafaelcalleja-claude-mar…/skills/claude-code/references/cicd-integration.md
2025-11-30 08:48:52 +08:00

429 lines
7.8 KiB
Markdown

# CI/CD Integration
Integrate Claude Code into development workflows with GitHub Actions and GitLab CI/CD.
## GitHub Actions
### Basic Workflow
**.github/workflows/claude.yml:**
```yaml
name: Claude Code CI
on: [push, pull_request]
jobs:
claude-review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: anthropic/claude-code-action@v1
with:
command: '/fix:types && /test'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
```
### Code Review Workflow
```yaml
name: Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Review with Claude
uses: anthropic/claude-code-action@v1
with:
command: |
Review the changes in this PR:
- Check for bugs and edge cases
- Verify test coverage
- Assess performance implications
- Review security concerns
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Post Review Comment
uses: actions/github-script@v6
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: process.env.CLAUDE_OUTPUT
})
```
### Test & Fix Workflow
```yaml
name: Test and Fix
on: [push]
jobs:
test-fix:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Tests
id: test
continue-on-error: true
run: npm test
- name: Fix Failures
if: steps.test.outcome == 'failure'
uses: anthropic/claude-code-action@v1
with:
command: '/fix:test check test output and fix failures'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Commit Fixes
if: steps.test.outcome == 'failure'
run: |
git config user.name "Claude Bot"
git config user.email "claude@anthropic.com"
git add .
git commit -m "fix: auto-fix test failures"
git push
```
### Documentation Update
```yaml
name: Update Docs
on:
push:
branches: [main]
jobs:
docs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Update Documentation
uses: anthropic/claude-code-action@v1
with:
command: '/docs:update'
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Commit Docs
run: |
git config user.name "Claude Bot"
git config user.email "claude@anthropic.com"
git add docs/
git commit -m "docs: auto-update documentation" || echo "No changes"
git push
```
## GitLab CI/CD
### Basic Pipeline
**.gitlab-ci.yml:**
```yaml
stages:
- review
- test
- deploy
claude-review:
stage: review
image: node:18
script:
- npm install -g @anthropic-ai/claude-code
- claude login --api-key $ANTHROPIC_API_KEY
- claude '/fix:types && /test'
only:
- merge_requests
```
### Advanced Pipeline
```yaml
variables:
CLAUDE_MODEL: "claude-sonnet-4-5-20250929"
stages:
- lint
- test
- review
- deploy
before_script:
- npm install -g @anthropic-ai/claude-code
- claude login --api-key $ANTHROPIC_API_KEY
lint:
stage: lint
script:
- claude '/fix:types'
artifacts:
paths:
- src/
expire_in: 1 hour
test:
stage: test
script:
- npm test || claude '/fix:test analyze failures and fix'
coverage: '/Coverage: \d+\.\d+%/'
review:
stage: review
script:
- |
claude "Review this merge request:
- Check code quality
- Verify tests
- Review security
- Assess performance" > review.md
artifacts:
reports:
codequality: review.md
only:
- merge_requests
deploy:
stage: deploy
script:
- claude '/deploy-check'
- ./deploy.sh
only:
- main
```
### Automated Fixes
```yaml
fix-on-failure:
stage: test
script:
- npm test
retry:
max: 2
when:
- script_failure
after_script:
- |
if [ $CI_JOB_STATUS == 'failed' ]; then
claude '/fix:test analyze CI logs and fix issues'
git add .
git commit -m "fix: auto-fix from CI"
git push origin HEAD:$CI_COMMIT_REF_NAME
fi
```
## Common Patterns
### PR Comment Bot
Post Claude reviews as PR comments:
```yaml
# GitHub Actions
- name: Comment PR
uses: actions/github-script@v6
with:
script: |
const review = process.env.CLAUDE_REVIEW
github.rest.pulls.createReview({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number,
body: review,
event: 'COMMENT'
})
```
### Conditional Execution
Run Claude only on certain conditions:
```yaml
# Run on large PRs only
- name: Review Large PRs
if: ${{ github.event.pull_request.changed_files > 10 }}
uses: anthropic/claude-code-action@v1
with:
command: '/review:codebase analyze changes'
```
### Cost Control
Limit CI usage to control costs:
```yaml
# Skip for draft PRs
- name: Claude Review
if: ${{ !github.event.pull_request.draft }}
uses: anthropic/claude-code-action@v1
# Run only on specific branches
- name: Claude Check
if: startsWith(github.ref, 'refs/heads/release/')
uses: anthropic/claude-code-action@v1
```
## Security Best Practices
### API Key Management
**GitHub:**
```
Settings → Secrets and variables → Actions
Add: ANTHROPIC_API_KEY
```
**GitLab:**
```
Settings → CI/CD → Variables
Add: ANTHROPIC_API_KEY (Protected, Masked)
```
### Restricted Permissions
**GitHub Actions:**
```yaml
permissions:
contents: read
pull-requests: write
issues: write
```
**GitLab CI:**
```yaml
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 1
```
### Secrets Scanning
Prevent API key exposure:
```yaml
- name: Scan for Secrets
run: |
if git diff | grep -i "ANTHROPIC_API_KEY"; then
echo "API key detected in diff!"
exit 1
fi
```
## Monitoring & Debugging
### Workflow Logs
**GitHub Actions:**
```yaml
- name: Debug Info
run: |
echo "Workflow: ${{ github.workflow }}"
echo "Event: ${{ github.event_name }}"
echo "Ref: ${{ github.ref }}"
```
**GitLab CI:**
```yaml
debug:
script:
- echo "Pipeline ID: $CI_PIPELINE_ID"
- echo "Job ID: $CI_JOB_ID"
- echo "Branch: $CI_COMMIT_BRANCH"
```
### Artifacts
Save Claude outputs:
```yaml
# GitHub
- name: Save Claude Output
uses: actions/upload-artifact@v3
with:
name: claude-results
path: claude-output.md
# GitLab
artifacts:
paths:
- claude-output.md
expire_in: 1 week
```
### Error Handling
```yaml
- name: Claude Task
continue-on-error: true
id: claude
uses: anthropic/claude-code-action@v1
- name: Handle Failure
if: steps.claude.outcome == 'failure'
run: |
echo "Claude task failed, continuing anyway"
```
## Performance Optimization
### Caching
**GitHub Actions:**
```yaml
- uses: actions/cache@v3
with:
path: ~/.claude/cache
key: claude-cache-${{ hashFiles('package-lock.json') }}
```
**GitLab CI:**
```yaml
cache:
key: claude-cache
paths:
- .claude/cache
```
### Parallel Execution
```yaml
# GitHub - Matrix builds
strategy:
matrix:
task: [lint, test, review]
steps:
- run: claude "/${{ matrix.task }}"
# GitLab - Parallel jobs
test:
parallel: 3
script:
- claude "/test --shard $CI_NODE_INDEX/$CI_NODE_TOTAL"
```
## See Also
- GitHub Actions docs: https://docs.github.com/actions
- GitLab CI/CD docs: https://docs.gitlab.com/ee/ci/
- Claude Code Actions: https://github.com/anthropics/claude-code-action
- Best practices: `references/best-practices.md`