Docker - GitHub Actions


Introduction

Integrating Docker with GitHub Actions enables seamless automation of the build, test, and deployment processes for containerized applications. By using Docker in your GitHub Actions workflows, you can create a consistent and repeatable workflow that enhances the efficiency and reliability of your software delivery pipeline. This tutorial covers the essentials of Docker and GitHub Actions integration, including setup, workflow creation, and best practices for effective CI/CD.


1. Overview of GitHub Actions

GitHub Actions is a CI/CD platform that enables developers to automate workflows for building, testing, and deploying applications. It integrates seamlessly with GitHub repositories, allowing for automatic execution of workflows triggered by events such as pushes, pull requests, and releases.


2. Setting Up GitHub Actions for Docker


3. Basic Workflow for Building a Docker Image

Here's a basic GitHub Actions workflow to build a Docker image whenever code is pushed to the main branch:

name: Build Docker Image

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v1

    - name: Build and push Docker image
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: user/repository:latest

4. Using Docker Compose with GitHub Actions

You can use Docker Compose in your GitHub Actions workflows to manage multi-container applications. Here's how to set it up:

name: Docker Compose CI

on:
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build and test with Docker Compose
      run: |
        docker-compose -f docker-compose.test.yml up --build --abort-on-container-exit

5. Running Tests in Docker Containers

Running tests in Docker containers ensures consistency across different environments. Here's how to configure a GitHub Actions workflow to run tests inside a container:

name: Test in Docker

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build Docker image
      run: docker build -t myapp-test .

    - name: Run tests
      run: docker run myapp-test npm test

6. Deploying Docker Containers to AWS ECS

GitHub Actions can automate the deployment of Docker containers to AWS Elastic Container Service (ECS). Here's a basic workflow example:

name: Deploy to ECS

on:
  push:
    tags:
      - 'v*'

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: us-east-1

    - name: Deploy to ECS
      uses: aws-actions/amazon-ecs-deploy-task-definition@v1
      with:
        task-definition: task-definition.json
        service: my-ecs-service
        cluster: my-ecs-cluster
        wait-for-service-stability: true

7. Using Environment Variables and Secrets

Securely manage environment variables and secrets in GitHub Actions to protect sensitive information such as API keys and credentials:

Storing Secrets in GitHub
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build with secret
      run: docker build --build-arg SECRET=${{ secrets.MY_SECRET }} -t myapp .

8. Caching Dependencies in GitHub Actions

Use caching in GitHub Actions to speed up workflow execution by reusing previously downloaded dependencies:

name: Cache Dependencies

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Cache Node.js modules
      uses: actions/cache@v2
      with:
        path: ~/.npm
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-

    - name: Install dependencies
      run: npm install

    - name: Build Docker image
      run: docker build -t myapp .

9. Parallelizing Jobs in GitHub Actions

GitHub Actions supports parallel job execution to reduce workflow execution time. Here's an example:

name: Parallel Jobs

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [12, 14, 16]

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v2
      with:
        node-version: ${{ matrix.node-version }}

    - name: Install dependencies
      run: npm install

    - name: Run tests
      run: npm test

10. Using Custom Docker Images in Workflows

You can use custom Docker images in GitHub Actions workflows to provide specific tools and environments. Here's how:

name: Custom Docker Image

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Use custom Docker image
      uses: docker://custom/image:latest

    - name: Build project
      run: build-command

11. Building and Publishing Docker Images

Automate the process of building and publishing Docker images to a registry with GitHub Actions. Here's an example workflow:

name: Build and Publish Docker Image

on:
  push:
    tags:
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Log in to Docker Hub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Build and push Docker image
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: user/repository:${{ github.ref_name }}

12. Triggering Workflows on Schedule

Schedule workflows to run at specific times using cron syntax in GitHub Actions. Here's an example:

name: Scheduled Build

on:
  schedule:
    - cron: '0 2 * * 1' # Every Monday at 2 AM

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Build Docker image
      run: docker build -t myapp .

13. Monitoring and Logging with GitHub Actions

GitHub Actions provides monitoring and logging capabilities to track workflow execution and diagnose issues:


14. Best Practices for Docker and GitHub Actions Integration

Follow these best practices to optimize Docker and GitHub Actions integration for efficient and reliable CI/CD workflows:


15. Summary

Docker and GitHub Actions integration provides a powerful solution for automating the build, test, and deployment processes for containerized applications. By leveraging the capabilities of both tools and following best practices, you can create efficient and reliable CI/CD workflows that enhance your software delivery workflow.