Masdika Loading..
Masdika.ID

DevOps Engineer

Cloud Engineer

System Administrator

  • Home
  • Portfolio
  • Services
  • Resume
  • Skills
  • Blog
  • Contact
Masdika.ID

DevOps Engineer

Cloud Engineer

System Administrator

Download CV

Recent Posts

  • Dari Laptop Bekas Jadi Server Pribadi: Cara Membangun Home Server Murah Menggunakan ISP MyRepublic dengan Public IP
  • Pembuatan Subnet dan Alokasi IP Address pada Amazon Web Service VPC
  • Instalasi dan Konfigurasi AWS CLI pada EC2 (Lab Guide)
  • Membangun Arsitektur Web + Database Highly Available di AWS (RDS Multi-AZ)
  • Cara Reset Password OpenBSD di Proxmox via VNC

Recent Comments

  1. Alif on Jangan Gunakan latest Tag pada Docker Images! Ini Alasannya
  2. Sahrull on Panduan Lengkap Anti-DDoS: Installasi Iptables, Hardening, dan Cloudflare Proxy
  3. VSTRA on Cara Cerdas Menguasai Kubernetes (K8s): Panduan Lengkap Orkestrasi Kontainer untuk Developer Modern
  4. Rikiy on Cara Mudah Deploy Website Node.js Menggunakan Docker
  5. Masdika.BIZ.ID on Disaster Recovery Cluster (DRC) WordPress dengan MariaDB Galera dan Load Balancer Caddy

Categories

  • Tutorial

Masdika.ID

  • About
  • Terms & Conditions
  • Privacy Policy
BLOG POST

CI/CD Laravel: Otomatisasi Deployment dengan Jenkins & Docker

August 1, 2025 Tutorial by Masdika.ID
CI/CD Laravel: Otomatisasi Deployment dengan Jenkins & Docker

Dalam era modern pengembangan perangkat lunak, Continuous Integration (CI) dan Continuous Deployment (CD) menjadi pilar utama untuk menjamin kecepatan, kualitas, dan reliabilitas dalam proses rilis aplikasi. Artikel ini membahas penerapan CI/CD untuk Laravel 11 menggunakan Jenkins dan Docker sebagai tools utama. Kami akan membangun pipeline otomatis untuk menguji, membangun, dan mendeploy aplikasi Laravel ke production environment dengan mudah dan efisien.

Di awal projek ini, kita akan melakukan proses deployment aplikasi absensi yang dapat dilihat pada repositori berikut: ๐Ÿ‘‰ absensi-karyawan-gps-barcode

๐Ÿงฑ Arsitektur yang Digunakan

Berikut adalah komponen utama:

  • Laravel 11 sebagai backend framework
  • Jenkins sebagai CI/CD automation server
  • Docker & Docker Compose untuk environment konsisten
  • Caddy untuk reverse proxy dan SSL otomatis
  • MySQL 8 sebagai database

๐Ÿณ Struktur File

Berikut file penting dalam proyek:

  • Dockerfile โ†’ Build Laravel App dengan PHP 8.3 + Composer + NPM
  • docker-compose.yml โ†’ Orkestrasi layanan Laravel, Database, dan Caddy
  • entrypoint.sh โ†’ Script awal container untuk install dan konfigurasi Laravel
  • Jenkinsfile โ†’ Pipeline otomatis CI/CD

๐Ÿ”ง Dockerfile Laravel

Dockerfile ini membangun image Laravel berbasis php:8.3-fpm, menginstal ekstensi PHP dan Composer.

FROM php:8.3-fpm

# Install dependencies OS & PHP
RUN apt-get update && apt-get install -y \
    git unzip zip curl gnupg ca-certificates \
    libzip-dev libpng-dev libonig-dev libxml2-dev libpq-dev \
    && docker-php-ext-install pdo pdo_mysql zip gd bcmath

# Install Composer dari image resmi
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# Set working directory
WORKDIR /var/www

# Copy semua file project
COPY . .

# Copy entrypoint script
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

# Buka port PHP-FPM
EXPOSE 9000

ENTRYPOINT ["entrypoint.sh"]
CMD ["php-fpm"]

๐Ÿ› ๏ธ docker-compose.yml

services:
  laravel_app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: laravel_app
    volumes:
      - .:/var/www
    networks:
      - laravel
    depends_on:
      - laravel_db

  laravel_db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: db_absensi_karyawan
      MYSQL_USER: laravel
      MYSQL_PASSWORD: PasswordKamu
      MYSQL_ROOT_PASSWORD: PasswordKamu
    volumes:
      - ./db_data:/var/lib/mysql
    networks:
      - laravel

  caddy:
    image: caddy:2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile
      - .:/var/www
      - ./caddy_data:/data
      - ./caddy_config:/config
    depends_on:
      - laravel_app
    networks:
      - laravel

networks:
  laravel:

๐Ÿช„ entrypoint.sh

Script untuk setup Laravel saat container dijalankan:

#!/bin/sh

cd /var/www

# Salin .env jika belum ada
[ ! -f .env ] && cp .env.example .env

# Install dependency PHP
composer install

# Generate app key jika belum ada
php artisan key:generate --ansi --force

# Jalankan migrasi dan seeder (opsional)
php artisan migrate --force || true
php artisan db:seed --force || true

# Permission folder runtime Laravel
mkdir -p storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
chmod -R 775 storage bootstrap/cache

# Install npm & build assets
apt update && apt install -y npm
npm install
npm run build

# Jalankan perintah yang diberikan ke container
exec "$@"

๐Ÿงช Jenkinsfile

pipeline {
    agent any

    environment {
        DOCKER_IMAGE = 'masdika/absensi-karyawan:latest'
        REMOTE_DOCKER_HOST = 'ssh://root@103.168.146.164'
    }

    stages {
        stage('Clone Repository') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'github-token', usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PAT')]) {
                    sh '''
                        rm -rf absensi-karyawan-gps-barcode
                        git clone https://$GIT_USER:$GIT_PAT@github.com/masdikaaa/absensi-karyawan-gps-barcode.git
                    '''
                }
            }
        }

        stage('Build Docker Image') {
            steps {
                sh '''
                    cd absensi-karyawan-gps-barcode
                    docker build -t $DOCKER_IMAGE .
                '''
            }
        }

        stage('Push to DockerHub') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'dockerhub-credentials', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
                    sh '''
                        echo "$DOCKER_PASS" | docker login -u "$DOCKER_USER" --password-stdin
                        docker push $DOCKER_IMAGE
                    '''
                }
            }
        }

        stage('Deploy to Remote Docker Server') {
            steps {
                sshagent(credentials: ['ssh-key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no root@103.168.146.164 '
                            set -e
                            if [ ! -d absensi-app ]; then
                                git clone https://github.com/masdikaaa/absensi-karyawan-gps-barcode.git absensi-app
                            fi

                            cd absensi-app
                            git reset --hard
                            git checkout master
                            git pull origin master

                            # Pastikan file .env ada
                            if [ ! -f .env ]; then
                                echo "[INFO] .env tidak ditemukan, membuat dari .env.example"
                                cp .env.example .env
                            fi

                            docker compose pull
                            docker compose down
                            docker compose up -d --build
                        '
                    '''
                }
            }
        }
    }
}

๐Ÿ’ก Manfaat CI/CD di Jenkins

  • ๐Ÿš€ Kecepatan: Build & deploy otomatis setelah push code
  • โœ… Konsistensi: Tidak ada lagi perbedaan environment lokal dan production
  • ๐Ÿ”’ Keamanan: Caddy otomatis menangani HTTPS
  • ๐Ÿ“ฆ Isolasi: Semua dependency Laravel berada dalam container

๐Ÿ”š Penutup

Dengan menggabungkan Laravel, Docker, dan Jenkins, proses pengembangan menjadi lebih profesional dan scalable. Pipeline ini bisa kamu kembangkan dengan integrasi test otomatis, notifikasi ke Slack, atau multi-environment (staging & production).

Selamat mencoba membangun DevOps pipeline profesional untuk Laravel-mu! ๐Ÿง‘โ€๐Ÿ’ปโœจ

Share:
Tags: CI/CDdockerjenkinsLaravel
Related Posts
Membangun Jenkins Production Stabil dengan Inbound Agent dan Traefik SSL

Panduan ini menjelaskan instalasi Jenkins production menggunakan Docker + Traefik (SSL otomatis via DNS Challenge Cloudflare), dengan fokus utama pada…

VM vs Container vs Pod – Perbedaan Lengkap untuk Cloud & DevOps!

Dalam dunia Cloud Computing dan DevOps, tiga istilah yang paling sering kita dengar adalah Virtual Machine (VM), Container, dan Pod….

Post navigation

Prev
Next
Write a comment Cancel Reply


ยฉ 2025 www.masdika.id โ€” Semua hak cipta dilindungi