140 lines
3.1 KiB
Markdown
140 lines
3.1 KiB
Markdown
# GitHub Actions Pipelines
|
|
|
|
## Complete CI/CD Pipeline
|
|
|
|
```yaml
|
|
name: CI/CD Pipeline
|
|
|
|
on:
|
|
push:
|
|
branches: [main, develop]
|
|
pull_request:
|
|
branches: [main]
|
|
|
|
env:
|
|
REGISTRY: ghcr.io
|
|
IMAGE_NAME: ${{ github.repository }}
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '20'
|
|
cache: 'npm'
|
|
- run: npm ci
|
|
- run: npm test
|
|
- run: npm run lint
|
|
|
|
build:
|
|
needs: test
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
outputs:
|
|
image-tag: ${{ steps.meta.outputs.tags }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: docker/setup-buildx-action@v3
|
|
- uses: docker/login-action@v3
|
|
with:
|
|
registry: ${{ env.REGISTRY }}
|
|
username: ${{ github.actor }}
|
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
- id: meta
|
|
uses: docker/metadata-action@v5
|
|
with:
|
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
tags: |
|
|
type=sha,prefix=
|
|
type=ref,event=branch
|
|
- uses: docker/build-push-action@v5
|
|
with:
|
|
context: .
|
|
push: true
|
|
tags: ${{ steps.meta.outputs.tags }}
|
|
cache-from: type=gha
|
|
cache-to: type=gha,mode=max
|
|
|
|
deploy-staging:
|
|
needs: build
|
|
if: github.ref == 'refs/heads/develop'
|
|
runs-on: ubuntu-latest
|
|
environment: staging
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- run: |
|
|
kubectl set image deployment/app app=${{ needs.build.outputs.image-tag }}
|
|
|
|
deploy-production:
|
|
needs: build
|
|
if: github.ref == 'refs/heads/main'
|
|
runs-on: ubuntu-latest
|
|
environment: production
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- run: |
|
|
kubectl set image deployment/app app=${{ needs.build.outputs.image-tag }}
|
|
```
|
|
|
|
## Common Workflow Patterns
|
|
|
|
### Matrix Builds (Multi-version testing)
|
|
```yaml
|
|
jobs:
|
|
test:
|
|
strategy:
|
|
matrix:
|
|
node-version: [18, 20, 22]
|
|
os: [ubuntu-latest, macos-latest]
|
|
runs-on: ${{ matrix.os }}
|
|
steps:
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: ${{ matrix.node-version }}
|
|
```
|
|
|
|
### Reusable Workflows
|
|
```yaml
|
|
# .github/workflows/deploy.yml
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
environment:
|
|
required: true
|
|
type: string
|
|
secrets:
|
|
DEPLOY_KEY:
|
|
required: true
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
environment: ${{ inputs.environment }}
|
|
steps:
|
|
- run: echo "Deploying to ${{ inputs.environment }}"
|
|
```
|
|
|
|
### Caching Dependencies
|
|
```yaml
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: ~/.npm
|
|
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-node-
|
|
```
|
|
|
|
## Quick Reference
|
|
|
|
| Action | Purpose |
|
|
|--------|---------|
|
|
| `actions/checkout@v4` | Clone repository |
|
|
| `actions/setup-node@v4` | Install Node.js |
|
|
| `docker/build-push-action@v5` | Build and push Docker image |
|
|
| `docker/metadata-action@v5` | Generate Docker tags |
|
|
| `actions/cache@v4` | Cache dependencies |
|