Month 2 — CI/CD & Containerization
Complete Detailed Guide

This document explains Build Tools, Jenkins CI/CD pipelines, Docker, Dockerfile, Docker Compose, and containerizing real applications like Node.js, Java, and React.

1️⃣ Build Tools (Maven & Gradle)

Build tools automate compiling, packaging, testing, and deploying code.

✔ Maven

Maven uses pom.xml file and follows a standard directory structure.

Install Maven:

sudo apt install maven
mvn -version

✔ Gradle

Gradle is faster and uses build.gradle.

Install Gradle:

sudo apt install gradle
gradle -v

Common Build Lifecycle

Reference: Maven Docs | Gradle Docs

2️⃣ Jenkins — CI/CD

Jenkins automates testing, integration, building, and deployment.

✔ Install Jenkins

sudo apt update
sudo apt install openjdk-11-jdk
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins
sudo systemctl enable --now jenkins

Access Jenkins in browser:

http://localhost:8080

✔ Jenkins Freestyle Job

✔ Jenkins Pipeline & Jenkinsfile

Create Jenkinsfile inside your project:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Docker Build') {
            steps {
                sh 'docker build -t myapp .'    
            }
        }
    }
}

Reference: Jenkins Official Docs

3️⃣ Docker — Containerization

Docker packages your application along with environment so it runs anywhere.

✔ Install Docker

sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER

✔ Docker Images & Containers

✔ Creating a Dockerfile

FROM node:18
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]

✔ Docker Compose

Use it for multi-container apps (API + Database).

version: '3'
services:
  app:
    build: .
    ports:
      - "3000:3000"
  mongo:
    image: mongo
    ports:
      - "27017:27017"

Reference: Docker Docs

4️⃣ Containerizing Real Projects

✔ Node.js App

FROM node:18
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]

✔ React App

FROM node:18 as build
WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80 

✔ Java Spring Boot

FROM openjdk:17-jdk-slim
COPY target/myapp.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

📚 Useful External References