Workshop: สร้าง CI/CD Pipeline สำหรับ Laravel Deploy บน Plesk

CI/CD คืออะไร และทำไมถึงสำคัญกับ Laravel

CI/CD (Continuous Integration/Continuous Deployment) เป็นแนวทางการพัฒนาซอฟต์แวร์ที่ช่วยให้นักพัฒนาสามารถผลิตและปรับปรุงโค้ดได้อย่างรวดเร็ว ถูกต้อง และมีประสิทธิภาพ ในแต่ละครั้งที่นักพัฒนาสร้าง commit ใหม่ ระบบ CI/CD จะทำการทดสอบ บิวด์ และปรับใช้โค้ดโดยอัตโนมัติ ซึ่งช่วยลดข้อผิดพลาดและเพิ่มความเร็วในการส่งมอบผลิตภัณฑ์

สำหรับแอปพลิเคชัน Laravel CI/CD นั้นสำคัญมากเพราะช่วยให้:

  • ตรวจสอบข้อผิดพลาดได้เร็วขึ้น
  • ลดเวลาในการปรับใช้ (Deploy) ลงเหลือเพียงไม่กี่นาที
  • เพิ่มคุณภาพของโค้ดผ่านการทดสอบอัตโนมัติ
  • ลดความเสี่ยงจากการปรับใช้ด้วยตนเองที่อาจเกิดข้อผิดพลาด
  • เพิ่มความเชื่อมั่นของทีมในการพัฒนาอย่างต่อเนื่อง

สิ่งที่ต้องเตรียมสำหรับ CI/CD Pipeline

ก่อนเริ่มการตั้งค่า CI/CD Pipeline คุณจะต้องเตรียมส่วนประกอบต่อไปนี้:

  • Server VPS ที่ติดตั้ง Plesk – เพื่อใช้เป็น Server ปรับใช้สำหรับแอปพลิเคชัน Laravel
  • Git Repository – GitHub, GitLab หรือ Gitea เพื่อเก็บโค้ดของคุณ
  • Laravel Project – โปรเจกต์ Laravel ที่พร้อมปรับใช้
  • SSH Keys – สำหรับการเชื่อมต่ออย่างปลอดภัยระหว่าง CI/CD System และ Server
  • Composer Dependencies – ควรมี composer.lock เพื่อให้ Deployment มีความสอดคล้องกัน

ขั้นตอนการตั้งค่า Git Repository

สิ่งแรกที่คุณต้องทำคือเตรียม Git Repository ให้พร้อม:

1. สร้าง Repository บน GitHub/GitLab

เข้าไปยัง GitHub หรือ GitLab และสร้าง Repository ใหม่สำหรับโปรเจกต์ Laravel ของคุณ ระบุชื่อที่เหมาะสม เช่น “laravel-app-production” และตั้งค่าให้เป็น Private Repository หากเป็นโปรเจกต์เชิงพาณิชย์

2. Push โค้ด Laravel ไปยัง Repository

cd /path/to/laravel-project
git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/username/laravel-app.git
git push -u origin main

3. เตรียม Environment File

สำคัญมากที่จะต้องไม่ push .env file ไปยัง Repository เพราะมีข้อมูลสำคัญ แทนที่นั้น สร้าง .env.example ที่มีเฉพาะ key โดยไม่มีค่า

cp .env .env.example
rm .env
git add .env.example
git commit -m "Add env example file"
git push

การตั้งค่า Plesk Git Deployment

Plesk มีฟีเจอร์ Git Deployment ที่ช่วยให้คุณปรับใช้แอปพลิเคชันได้โดยอัตโนมัติเมื่อมี commit ใหม่บน Repository

ขั้นตอนการตั้งค่า:

  1. เข้าไปในแผงควบคุม Plesk
  2. ไปที่ Tools & Settings > Git
  3. คลิก “Initialize Repository” และเลือก Repository URL
  4. ป้อน Branch ที่ต้องการ (เช่น main หรือ master)
  5. สร้าง SSH Key และ Deploy Key สำหรับการเชื่อมต่ออย่างปลอดภัย
  6. ทดสอบการเชื่อมต่อโดยคลิก “Check Connection”
  7. คลิป “Deploy” เพื่อทำการปรับใช้ครั้งแรก

การเขียน CI/CD Pipeline ด้วย GitHub Actions

GitHub Actions เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการสร้าง CI/CD Pipeline โดยตรงจาก GitHub Repository ของคุณ ไม่ต้องใช้บริการภายนอกเพิ่มเติม

สร้าง Workflow File:

สร้างไดเรกทอรี .github/workflows ในโปรเจกต์ของคุณ และสร้างไฟล์ชื่อ deploy.yml

name: Laravel CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    
    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_DATABASE: laravel_test
          MYSQL_PASSWORD: password
          MYSQL_ROOT_PASSWORD: password
        options: >-
          --health-cmd="mysqladmin ping"
          --health-interval=10s
          --health-timeout=5s
          --health-retries=3
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Setup PHP
      uses: shivammathur/setup-php@v2
      with:
        php-version: '8.2'
        extensions: mbstring, bcmath, pdo_mysql
        coverage: xdebug
    
    - name: Install Dependencies
      run: composer install
    
    - name: Copy Environment File
      run: cp .env.example .env
    
    - name: Generate Application Key
      run: php artisan key:generate
    
    - name: Run Tests
      run: php artisan test
    
    - name: Run Code Analysis
      run: ./vendor/bin/phpstan analyse app

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Deploy to Server
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        script: |
          cd /var/www/html/laravel-app
          git pull origin main
          composer install --no-dev --optimize-autoloader
          php artisan migrate --force
          php artisan cache:clear
          php artisan config:clear
          chown -R nobody:nobody /var/www/html/laravel-app

การตั้งค่า Environment Variables และ .env File

สำหรับการปรับใช้อย่างปลอดภัย ข้อมูลที่ละเอียดอ่อนเช่น Database Password ควรเก็บไว้ใน GitHub Secrets แทนที่จะ Commit โดยตรง

ขั้นตอนการตั้งค่า Secrets:

  1. ไปที่ Settings > Secrets and Variables > Actions ใน Repository
  2. คลิก “New repository secret”
  3. เพิ่ม Secrets ต่อไปนี้:
SERVER_HOST = your-vps-ip-or-domain.com
SERVER_USER = deploy_user
SSH_PRIVATE_KEY = (your private SSH key content)
DB_PASSWORD = your_database_password

จากนั้น ในขั้นตอน Deploy สามารถใช้ค่าเหล่านี้ได้ด้วยการอ้างอิง ${{ secrets.SECRET_NAME }}

การรัน Database Migration อัตโนมัติ

หากแอปพลิเคชัน Laravel ของคุณมีการเปลี่ยนแปลงฐานข้อมูล (Database Migration) สามารถให้ CI/CD Pipeline รันการ Migrate โดยอัตโนมัติได้

เพิ่มโค้ดนี้ในขั้นตอน Deploy ของ Workflow:

- name: Run Database Migrations
  run: |
    php artisan migrate --force
    php artisan db:seed --class=ProductionSeeder

ตัวเลือก –force จำเป็นในสภาพแวดล้อม Production เพื่อหลีกเลี่ยงการถามยืนยันจากสคริปต์

ทดสอบ Pipeline:

  1. สร้าง Pull Request ใหม่หรือ Push ไปยัง main branch
  2. ไปที่แท็บ Actions ใน GitHub
  3. ดูสถานะการ Run Workflow
  4. หากเกิดข้อผิดพลาด ให้คลิกที่ Workflow เพื่อดูรายละเอียดข้อผิดพลาด

ปัญหาทั่วไปและวิธีแก้:

  • ข้อผิดพลาด SSH Connection: ตรวจสอบให้แน่ใจว่า SSH Key ถูกป้อนอย่างถูกต้องใน GitHub Secrets
  • Composer Dependencies ล้มเหลว: ลองลบ composer.lock และรันใหม่
  • Database Migration ล้มเหลว: ตรวจสอบสิทธิ์การเข้าถึงฐานข้อมูลและโครงสร้างตารางโครงข่าย
  • ไม่สามารถเขียนไฟล์บน Server: ตรวจสอบสิทธิ์ของไดเรกทอรี storage และ bootstrap/cache
  • การสนับสนุนทั้งวัน: ทีมสนับสนุนของเรา พร้อมช่วยเหลือ 24/7 หากมีปัญหาในการตั้งค่า
  • Plesk ที่ได้รับการอัปเดต: Plesk ติดตั้งและอัปเดตเรียบร้อยแล้ว พร้อมให้คุณใช้ Git Deployment
  • ประสิทธิภาพสูง: VPS ของ DE ใช้ SSD NVMe และ Intel Xeon Processors เพื่อให้ความเร็วสูงสุด
  • SSL Certificate ฟรี: ได้รับ Let’s Encrypt SSL Certificate ฟรีสำหรับปรับใช้แอปพลิเคชัน HTTPS
  • ความปลอดภัย: มี DDoS Protection และ Firewall บนบริการ Cloud VPS ของเรา