Setup CI CD trong GIT

Hướng Dẫn Cấu Hình CI/CD Trên GitLab Với File .gitlab-ci.yml Cho Dự Án Web

Giới thiệu về CI/CD trên GitLab

CI/CD (Continuous Integration/Continuous Deployment) là một quy trình tự động hóa quan trọng trong phát triển phần mềm, giúp giảm thiểu sai sót và tăng tốc độ triển khai ứng dụng. Với GitLab, bạn có thể dễ dàng cấu hình CI/CD thông qua file .gitlab-ci.yml. Bài viết này sẽ hướng dẫn chi tiết cách sử dụng file .gitlab-ci.yml để xây dựng, kiểm tra và triển khai dự án web, sử dụng DDEV và Drush, với các domain demo như demo.app, demo.edu.vn, và các site đa nền tảng.

File .gitlab-ci.yml dưới đây là ví dụ thực tế, được tối ưu để tự động hóa quá trình build, kiểm tra trước khi triển khai (pre-deploy) và triển khai (deploy) cho các dự án Drupal hoặc web tương tự.

Tại sao nên cấu hình CI/CD trên GitLab?

Cấu hình CI/CD trên GitLab mang lại nhiều lợi ích:

  • Tự động hóa: Tự động chạy các lệnh build, kiểm tra và deploy, tiết kiệm thời gian so với thao tác thủ công.
  • Độ tin cậy: Phát hiện lỗi sớm thông qua kiểm tra mã nguồn và trạng thái website trước khi triển khai.
  • Tính linh hoạt: Hỗ trợ triển khai trên nhiều môi trường (staging, production) với các domain như demo.app hoặc demo.edu.vn.
  • Tích hợp mạnh mẽ: Kết hợp với các công cụ như Composer, Drush và DDEV để quản lý dự án Drupal hiệu quả.

Cấu hình file .gitlab-ci.yml chi tiết

Dưới đây là giải thích từng phần trong file .gitlab-ci.yml đã được thay đổi IP/domain thành "demo":

Định nghĩa Stages

stages:
  - build
  - pre_deploy
  - deploy

File định nghĩa 3 giai đoạn:

  • Build: Xây dựng dự án, cài đặt phụ thuộc và kiểm tra hoạt động cơ bản.
  • Pre_deploy: Kiểm tra trước khi triển khai, đảm bảo không có thay đổi chưa commit.
  • Deploy: Triển khai lên server với các domain như demo.app.

Giai đoạn Build

build:
  stage: build
  only:
    - main
  allow_failure: false
  before_script:
    - echo "🚀 Khởi động DDEV..."
    - ddev start
  script:
    - echo "🚀 Chạy composer install trong DDEV..."
    - ddev composer install --optimize-autoloader
    - echo "Modifying settings.php to use config sync directory..."
    - SETTINGS_FILE="web/sites/default/settings.php"
    - CONFIG_LINE="\$settings['config_sync_directory'] = '../config/sync';"
    - grep -qF "$CONFIG_LINE" "$SETTINGS_FILE" || echo "$CONFIG_LINE" >> "$SETTINGS_FILE"
    - echo "🔁 Import cấu hình site với Drush..."
    - ddev drush cr
    - ddev drush cim -y
    - ddev drush updb -y
    - ddev drush upe -y
    - ddev drush cr
    - echo "🔎 Kiểm tra trang web tại http://demo.ddev.site..."
    - ddev exec curl http://demo.ddev.site/
    - |
      response=$(ddev exec curl -o /dev/null -s -w "%{http_code}" -L http://demo.ddev.site)
      echo "response code: $response"
      if [ "$response" -eq 200 ]; then
        echo "✅ Website đang hoạt động!"
      else
        echo "❌ LỖI: Website không truy cập được! HTTP_CODE=$response"
        exit 1
      fi

Chức năng:

  • Khởi động DDEV và cài đặt phụ thuộc với Composer.
  • Cấu hình settings.php để đồng bộ config trong Drupal.
  • Chạy các lệnh Drush (cim, updb, upe) để import cấu hình, cập nhật database và export nội dung.
  • Kiểm tra website tại http://demo.ddev.site và trả về lỗi nếu HTTP code không phải 200.

Giai đoạn Pre_deploy

check_production_changes:
  stage: pre_deploy
  when: manual
  needs:
    - build
  allow_failure: false
  only:
    - main
  script:
    - echo "🚀 Deploying to demo.app..."
    - ssh -o StrictHostKeyChecking=no root@demo "
      cd /home/iotdev/vn-ielts-test &&
      CURRENT_BRANCH=\$(git rev-parse --abbrev-ref HEAD) &&
      echo '🔍 Current branch '$CURRENT_BRANCH &&
      if [ \"\$CURRENT_BRANCH\" != \"$CI_COMMIT_REF_NAME\" ]; then
      echo '❌ ERROR Branch mismatch! Expected '$CI_COMMIT_REF_NAME' but found '\$CURRENT_BRANCH &&
      exit 1;
      fi &&
      echo '✅ Branch check passed. Proceeding with export configs...' &&
      vendor/bin/drush cex -y &&
      if [ -n \"\$(git diff --name-only)\" ]; then
      echo '❌ ERROR Uncommitted changes detected! Please commit or stash changes before deployment.' &&
      git status &&
      exit 1;
      fi &&
      if [ -n \"\$(git ls-files --others --exclude-standard)\" ]; then
      echo '❌ ERROR Untracked files detected! Please commit or remove them before deployment.' &&
      git status &&
      exit 1;
      fi &&
      echo '✅ No uncommitted changes and no untracked files. Proceeding with deployment...'
      "
    - echo "==================================="
    - echo "🚀 Deploying to demo.edu.vn..."
    - ssh -o StrictHostKeyChecking=no root@demo "
      cd /home/iotdev/vn-ielts-test &&
      # (Tương tự như trên, kiểm tra branch và config)
      "
    - echo "==================================="
    - echo "🚀 Deploying to Multiple sites demo-site1.edu.vn, demo-site2.org, demo-site3.edu.vn..."
    - ssh -o StrictHostKeyChecking=no root@demo "
      cd /home/iotdev/vn-ielts-test &&
      # (Kiểm tra branch và export config cho từng site)
      "
    

Chức năng:

  • Kiểm tra branch hiện tại có khớp với main không.
  • Export config với Drush (cex) và kiểm tra xem có thay đổi chưa commit hoặc file không theo dõi (untracked files) không.
  • Thực hiện trên nhiều domain demo như demo.app, demo.edu.vn, và các site đa nền tảng.

Giai đoạn Deploy

deploy:
  stage: deploy
  when: manual
  needs:
    - check_production_changes
  allow_failure: false
  only:
    - main
  script:
    - echo "🚀 Deploying to demo.app..."
    - ssh -o StrictHostKeyChecking=no root@demo "
      cd /home/iotdev/vn-ielts-test &&
      CURRENT_BRANCH=\$(git rev-parse --abbrev-ref HEAD) &&
      if [ \"\$CURRENT_BRANCH\" != \"$CI_COMMIT_REF_NAME\" ]; then
      echo '❌ ERROR Branch mismatch!' && exit 1;
      fi &&
      echo '✅ Branch check passed. Proceeding with deployment...' &&
      vendor/bin/drush state:set system.maintenance_mode 1 &&
      git pull && composer install --optimize-autoloader &&
      vendor/bin/drush cr &&
      vendor/bin/drush cim -y &&
      vendor/bin/drush updb -y &&
      vendor/bin/drush upe -y &&
      vendor/bin/drush state:set system.maintenance_mode 0 &&
      vendor/bin/drush cr
      "
    - echo "==================================="
    - echo "🚀 Deploying to demo.edu.vn..."
    - ssh -o StrictHostKeyChecking=no root@demo "
      # (Tương tự như trên cho demo.edu.vn)
      "
    - echo "==================================="
    - echo "🚀 Deploying to Multiple sites demo-site1.edu.vn, demo-site2.org, demo-site3.edu.vn..."
    - ssh -o StrictHostKeyChecking=no root@demo "
      # (Triển khai cho từng site với Drush multi-site)
      "
    

Chức năng:

  • Chuyển website sang chế độ bảo trì (maintenance mode).
  • Pull code từ Git, cài Composer, và chạy các lệnh Drush để cập nhật cấu hình, database.
  • Tắt chế độ bảo trì và kiểm tra lại site.

Hướng dẫn triển khai CI/CD với GitLab

  1. Tạo file .gitlab-ci.yml: Sao chép nội dung file trên và đặt vào thư mục gốc của dự án GitLab.
  2. Cấu hình Runner: Đảm bảo GitLab Runner đã được cài đặt trên server demo với DDEV và Drush.
  3. Chạy Pipeline: Push code lên branch main, sau đó theo dõi pipeline trong tab CI/CD của GitLab.
  4. Kiểm tra kết quả: Xem log để xác nhận từng giai đoạn (build, pre_deploy, deploy) hoàn tất thành công.

Lợi ích của cấu hình này

  • Tối ưu thời gian: Tự động hóa toàn bộ quy trình từ build đến deploy.
  • Đảm bảo chất lượng: Kiểm tra lỗi trước khi triển khai lên production như demo.app.
  • Hỗ trợ đa site: Dễ dàng triển khai cho nhiều domain demo khác nhau chỉ với một file cấu hình.

Kêu gọi hành động

Hãy áp dụng ngay cấu hình CI/CD này trên GitLab để tối ưu hóa quy trình phát triển dự án web của bạn! Xem thêm chi tiết về GitLab CI/CD tại tài liệu chính thức và bắt đầu tự động hóa hôm nay!

Working Contact Form with Ajax & PHP

Get a functional and working contact form with Ajax & PHP in a few minutes. Just copy and paste the files, add a little code and you’re done.

Download Now