#GitHub Actions

Build CI/CD pipelines with GitHub Actions.


#Basic Workflow

yaml
1# .github/workflows/ci.yml
2name: CI
3
4on:
5  push:
6    branches: [main]
7  pull_request:
8    branches: [main]
9
10jobs:
11  build:
12    runs-on: ubuntu-latest
13    
14    steps:
15      - uses: actions/checkout@v4
16      
17      - name: Setup Node.js
18        uses: actions/setup-node@v4
19        with:
20          node-version: '20'
21          cache: 'npm'
22      
23      - name: Install dependencies
24        run: npm ci
25      
26      - name: Run tests
27        run: npm test
28      
29      - name: Build
30        run: npm run build

#Deploy Workflow

yaml
1name: Deploy
2
3on:
4  push:
5    branches: [main]
6
7jobs:
8  deploy:
9    runs-on: ubuntu-latest
10    
11    steps:
12      - uses: actions/checkout@v4
13      
14      - name: Login to Docker Hub
15        uses: docker/login-action@v3
16        with:
17          username: ${{ secrets.DOCKER_USERNAME }}
18          password: ${{ secrets.DOCKER_PASSWORD }}
19      
20      - name: Build and push
21        uses: docker/build-push-action@v5
22        with:
23          push: true
24          tags: user/app:${{ github.sha }}
25      
26      - name: Deploy to production
27        run: |
28          # Your deployment commands
29          echo "Deploying..."

#Matrix Builds

yaml
1jobs:
2  test:
3    runs-on: ${{ matrix.os }}
4    strategy:
5      matrix:
6        os: [ubuntu-latest, windows-latest]
7        node: [18, 20]
8    
9    steps:
10      - uses: actions/checkout@v4
11      - uses: actions/setup-node@v4
12        with:
13          node-version: ${{ matrix.node }}
14      - run: npm ci && npm test

#Secrets Management

yaml
1# Use secrets in workflow
2env:
3  API_KEY: ${{ secrets.API_KEY }}
4
5# Use in steps
6- name: Deploy
7  env:
8    AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
9    AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
10  run: aws s3 sync ./dist s3://my-bucket

[!TIP] Pro Tip: Use reusable workflows for common patterns across repos!