← Back to Automation Scripts
Published: December 12, 2024

GitHub Actions: CI/CD and Workflow Automation

Master GitHub Actions for CI/CD and workflow automation. Learn about workflows, actions, and best practices for automated development processes.

19 min readProductivityAutomation
GitHub Actions for Developers

What are GitHub Actions?

GitHub Actions is a continuous integration and continuous deployment (CI/CD) platform that allows you to automate your build, test, and deployment pipeline. You can create workflows that build and test every pull request to your repository, or deploy merged pull requests to production.

Core Concepts

Workflows

Workflows are automated procedures that you add to your repository:

  • YAML Files: Defined in .github/workflows/ directory
  • Triggers: Can be triggered by events like push, pull request
  • Jobs: Contain one or more steps
  • Steps: Individual tasks that run commands
  • Actions: Reusable units of code

Events

Events that trigger workflows:

  • push: Code is pushed to repository
  • pull_request: Pull request is opened or updated
  • schedule: Scheduled using cron syntax
  • workflow_dispatch: Manual trigger
  • release: Release is published

Basic Workflow Structure

Simple Workflow

A basic GitHub Actions workflow:

name: CI on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' - name: Install dependencies run: npm install - name: Run tests run: npm test

Multi-Job Workflow

Workflow with multiple jobs:

name: Build and Deploy on: push: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run tests run: npm test build: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build application run: npm run build deploy: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Deploy to production run: npm run deploy

Popular Actions

Essential Actions

Commonly used GitHub Actions:

  • actions/checkout: Checkout repository code
  • actions/setup-node: Setup Node.js environment
  • actions/setup-python: Setup Python environment
  • actions/setup-java: Setup Java environment
  • actions/cache: Cache dependencies

Deployment Actions

Actions for deployment:

  • actions/deploy-pages: Deploy to GitHub Pages
  • azure/docker-login: Login to Azure Container Registry
  • aws-actions/configure-aws-credentials: Configure AWS credentials
  • google-github-actions/setup-gcloud: Setup Google Cloud
  • actions/upload-artifact: Upload build artifacts

Environment Setup

Node.js Projects

Setup for Node.js applications:

name: Node.js CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [16, 18, 20] steps: - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests run: npm test - name: Run linting run: npm run lint

Python Projects

Setup for Python applications:

name: Python CI on: [push, pull_request] jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: [3.8, 3.9, '3.10', '3.11'] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install -r requirements-dev.txt - name: Run tests run: pytest - name: Run linting run: flake8

Advanced Workflow Features

Conditional Execution

Run steps conditionally:

name: Conditional Workflow on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run tests if: github.event_name == 'pull_request' run: npm test - name: Deploy if: github.ref == 'refs/heads/main' run: npm run deploy

Secrets and Environment Variables

Use secrets and environment variables:

name: Deploy with Secrets on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v3 - name: Deploy to production env: API_KEY: ${{ secrets.API_KEY }} DATABASE_URL: ${{ secrets.DATABASE_URL }} run: | echo "Deploying with API key: $API_KEY" npm run deploy

Docker Integration

Docker Build and Push

Build and push Docker images:

name: Docker Build and Push on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push uses: docker/build-push-action@v4 with: context: . push: true tags: | myapp:latest myapp:${{ github.sha }}

Testing and Quality

Code Quality Checks

Implement comprehensive quality checks:

name: Quality Checks on: [push, pull_request] jobs: quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Run linting run: npm run lint - name: Run type checking run: npm run type-check - name: Run tests run: npm test - name: Run security audit run: npm audit --audit-level high

Coverage Reports

Generate and upload coverage reports:

name: Coverage on: [push, pull_request] jobs: coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests with coverage run: npm run test:coverage - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./coverage/lcov.info

Deployment Strategies

Blue-Green Deployment

Implement blue-green deployment:

name: Blue-Green Deployment on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v3 - name: Deploy to blue environment run: | echo "Deploying to blue environment" # Deploy to blue environment - name: Run smoke tests run: | echo "Running smoke tests" # Run smoke tests - name: Switch traffic to blue if: success() run: | echo "Switching traffic to blue" # Switch traffic to blue environment - name: Cleanup green environment if: always() run: | echo "Cleaning up green environment" # Cleanup green environment

Canary Deployment

Implement canary deployment:

name: Canary Deployment on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v3 - name: Deploy canary run: | echo "Deploying canary version" # Deploy canary version - name: Monitor canary run: | echo "Monitoring canary deployment" # Monitor canary deployment - name: Promote canary if: success() run: | echo "Promoting canary to production" # Promote canary to production

Best Practices

Workflow Organization

Organize workflows effectively:

  • Single Responsibility: One workflow per purpose
  • Reusable Actions: Create reusable actions
  • Environment Variables: Use environment variables
  • Secrets Management: Secure sensitive data
  • Documentation: Document workflow purposes

Performance Optimization

Optimize workflow performance:

  • Caching: Cache dependencies and build artifacts
  • Parallel Jobs: Run independent jobs in parallel
  • Matrix Strategy: Use matrix for multiple configurations
  • Conditional Steps: Skip unnecessary steps
  • Resource Management: Use appropriate runner types

Security Considerations

Secrets Management

Secure handling of secrets:

  • Repository Secrets: Store secrets in repository settings
  • Environment Secrets: Use environment-specific secrets
  • Secret Rotation: Regularly rotate secrets
  • Least Privilege: Grant minimal required permissions
  • Audit Logs: Monitor secret usage

Security Scanning

Implement security scanning:

name: Security Scan on: [push, pull_request] jobs: security: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Run security scan uses: github/super-linter@v4 env: DEFAULT_BRANCH: main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Run dependency check run: | npm audit --audit-level high npm audit fix

Monitoring and Notifications

Workflow Notifications

Set up workflow notifications:

name: Notify on Failure on: workflow_run: workflows: ["CI"] types: [completed] jobs: notify: if: ${{ github.event.workflow_run.conclusion == 'failure' }} runs-on: ubuntu-latest steps: - name: Notify team uses: 8398a7/action-slack@v3 with: status: failure channel: '#alerts' webhook_url: ${{ secrets.SLACK_WEBHOOK }}

Conclusion

GitHub Actions is a powerful platform for automating your development workflows. By mastering the concepts and best practices covered in this guide, you can create efficient, secure, and maintainable CI/CD pipelines.

Start with simple workflows and gradually add complexity as needed. Remember to follow security best practices, optimize for performance, and document your workflows for team collaboration.