1. Overview

The goal is to automate:

  1. CI (Continuous Integration): Build, test, and create Docker image whenever code is pushed to Git.
  2. CD (Continuous Deployment): Deploy the new Docker image to the Linux VM automatically.

Tools


2. Git CI/CD Flow

Git Push → CI (Build + Test + Docker Image) → Push to Docker Registry → CD → VM Pull & Deploy

Steps:

  1. Developer pushes code to main or develop.
  2. CI workflow triggers:
  3. CD workflow on VM:

3. Example GitHub Actions Workflow

.github/workflows/ci-cd.yml

name: CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          distribution: temurin
          java-version: 17

      - name: Build Spring Boot JAR
        run: mvn clean package -DskipTests

      - name: Run tests
        run: mvn test

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

      - name: Build Docker Image
        run: docker build -t myusername/myapp:latest .

      - name: Push Docker Image
        run: docker push myusername/myapp:latest