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ặcdemo.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
- 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.
- Cấu hình Runner: Đảm bảo GitLab Runner đã được cài đặt trên server demo với DDEV và Drush.
- Chạy Pipeline: Push code lên branch
main
, sau đó theo dõi pipeline trong tab CI/CD của GitLab. - 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!