Bạn mệt mỏi với việc deploy code lên VPS thủ công? Bạn muốn quy trình này diễn ra tự động, nhanh chóng và ít sai sót hơn? Bài viết này sẽ hướng dẫn bạn cách sử dụng GitLab CI/CD để tự động deploy code lên VPS một cách dễ dàng và hiệu quả.
GitLab CI/CD là một công cụ mạnh mẽ tích hợp sẵn trong GitLab, giúp bạn tự động hóa quy trình phát triển phần mềm, từ kiểm tra, build đến deploy. Với GitLab CI/CD, bạn có thể tiết kiệm thời gian, giảm thiểu lỗi và tập trung vào việc phát triển sản phẩm tốt hơn.
GitLab CI/CD là gì và tại sao nên sử dụng?
GitLab CI/CD (Continuous Integration/Continuous Delivery/Continuous Deployment) là một hệ thống tự động hóa quy trình phát triển phần mềm. Nó giúp bạn tự động thực hiện các bước như:
- Continuous Integration (CI): Tự động kiểm tra, build và test code mỗi khi có thay đổi (ví dụ: push code lên repository).
- Continuous Delivery (CD): Tự động chuẩn bị và đóng gói ứng dụng để sẵn sàng deploy.
- Continuous Deployment (CD): Tự động deploy ứng dụng lên môi trường production.
Lợi ích của việc sử dụng GitLab CI/CD:
- Tự động hóa: Giảm thiểu các công việc thủ công, lặp đi lặp lại.
- Tăng tốc độ: Deploy code nhanh chóng hơn, rút ngắn thời gian phát hành.
- Giảm thiểu lỗi: Tự động kiểm tra và test code, giảm thiểu lỗi trong quá trình deploy.
- Tăng tính ổn định: Đảm bảo quy trình deploy luôn diễn ra ổn định và nhất quán.
- Dễ dàng quản lý: Quản lý và theo dõi quy trình deploy một cách dễ dàng trên GitLab.
Các bước cơ bản để deploy code lên VPS bằng GitLab CI/CD
Để deploy code lên VPS bằng GitLab CI/CD, bạn cần thực hiện các bước sau:
-
Chuẩn bị VPS: Đảm bảo VPS của bạn đã được cấu hình và sẵn sàng để nhận code. Cài đặt các phần mềm cần thiết như web server (Nginx, Apache), database server (MySQL, PostgreSQL), và các ngôn ngữ lập trình (PHP, Python, Node.js).
-
Tạo GitLab Repository: Tạo một repository trên GitLab để chứa code của bạn.
-
Cấu hình SSH Key: Tạo SSH key trên GitLab và thêm public key vào VPS để GitLab có thể truy cập vào VPS.
-
Tạo file
.gitlab-ci.yml
: Tạo một file.gitlab-ci.yml
trong root directory của repository. File này sẽ định nghĩa các bước trong quy trình CI/CD. -
Viết script deploy: Viết script deploy để copy code từ GitLab sang VPS và thực hiện các bước cần thiết để triển khai ứng dụng.
-
Push code lên GitLab: Push code lên GitLab và GitLab CI/CD sẽ tự động thực hiện quy trình deploy.
Hướng dẫn chi tiết cấu hình .gitlab-ci.yml
để deploy code lên VPS
File .gitlab-ci.yml
là trái tim của GitLab CI/CD. Nó định nghĩa các giai đoạn (stages) và các công việc (jobs) cần thực hiện trong quy trình CI/CD.
Dưới đây là một ví dụ về file .gitlab-ci.yml
để deploy code lên VPS:
stages:
- build
- deploy
build:
stage: build
image: node:16 # Sử dụng image Node.js 16 để build
script:
- npm install # Cài đặt các dependencies
- npm run build # Build project (ví dụ: tạo bản build cho React, Vue.js)
artifacts:
paths:
- dist/ # Lưu lại thư mục dist để deploy
expire_in: 1 day
deploy:
stage: deploy
image: alpine/ssh # Sử dụng image Alpine Linux có SSH client
before_script:
- apk update && apk add openssh-client # Cập nhật và cài đặt openssh-client
- echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null # Thêm SSH key vào agent
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $SSH_SERVER_IP >> ~/.ssh/known_hosts # Thêm host key của server vào known_hosts
- chmod 400 ~/.ssh/known_hosts
script:
- rsync -avz dist/ $SSH_USER@$SSH_SERVER_IP:$DEPLOY_PATH # Copy code lên VPS
- ssh $SSH_USER@$SSH_SERVER_IP "cd $DEPLOY_PATH && npm install && pm2 restart all" # Thực hiện các lệnh deploy trên VPS
only:
- main # Chỉ deploy khi có commit trên branch main
variables:
SSH_USER: root # Username SSH
SSH_SERVER_IP: 123.456.789.10 # IP của VPS
DEPLOY_PATH: /var/www/your-app # Đường dẫn đến thư mục deploy trên VPS
Giải thích:
- stages: Định nghĩa các giai đoạn trong quy trình CI/CD. Ở đây, chúng ta có hai giai đoạn là
build
vàdeploy
. - build: Giai đoạn build code.
- image: Sử dụng image
node:16
để build code. - script: Thực hiện các lệnh
npm install
vànpm run build
để cài đặt dependencies và build project. - artifacts: Lưu lại thư mục
dist/
để sử dụng trong giai đoạn deploy.
- image: Sử dụng image
- deploy: Giai đoạn deploy code lên VPS.
- image: Sử dụng image
alpine/ssh
để có SSH client. - before_script: Thực hiện các lệnh trước khi deploy.
- Cài đặt
openssh-client
. - Thêm SSH key vào agent. Bạn cần cấu hình biến môi trường
SSH_PRIVATE_KEY
trên GitLab. - Thêm host key của server vào
known_hosts
. Bạn cần cấu hình biến môi trườngSSH_SERVER_IP
trên GitLab.
- Cài đặt
- script: Thực hiện các lệnh deploy.
- Sử dụng
rsync
để copy code từ GitLab sang VPS. - Sử dụng
ssh
để thực hiện các lệnh deploy trên VPS, ví dụ: cài đặt dependencies, restart ứng dụng.
- Sử dụng
- only: Chỉ deploy khi có commit trên branch
main
. - variables: Định nghĩa các biến môi trường. Bạn cần cấu hình các biến này trên GitLab.
- image: Sử dụng image
Lưu ý:
- Thay thế các giá trị
SSH_USER
,SSH_SERVER_IP
,DEPLOY_PATH
bằng các giá trị thực tế của bạn. - Đảm bảo bạn đã cài đặt và cấu hình các phần mềm cần thiết trên VPS.
- Bạn có thể tùy chỉnh file
.gitlab-ci.yml
để phù hợp với nhu cầu của bạn.
Cấu hình SSH Key trên GitLab và VPS
Để GitLab có thể truy cập vào VPS, bạn cần cấu hình SSH Key.
1. Tạo SSH Key trên GitLab:
-
Truy cập vào GitLab, vào Settings -> CI/CD -> Variables.
-
Tạo một biến mới với tên
SSH_PRIVATE_KEY
. -
Giá trị của biến này là private key của SSH key. Bạn có thể tạo SSH key bằng lệnh sau:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
Sau đó, copy nội dung của file
~/.ssh/id_rsa
(private key) vào giá trị của biếnSSH_PRIVATE_KEY
. -
Quan trọng: Chọn “Masked” để ẩn giá trị của biến này.
2. Thêm Public Key vào VPS:
-
Copy public key của SSH key (nội dung của file
~/.ssh/id_rsa.pub
). -
Kết nối vào VPS bằng SSH.
-
Thêm public key vào file
~/.ssh/authorized_keys
của user mà bạn sẽ sử dụng để deploy. Nếu file này chưa tồn tại, hãy tạo nó.mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys echo "YOUR_PUBLIC_KEY" >> ~/.ssh/authorized_keys
Thay thế
YOUR_PUBLIC_KEY
bằng nội dung của public key.
3. Thêm Host Key của Server vào known_hosts
:
Để tránh cảnh báo “Host key verification failed” khi kết nối SSH, bạn cần thêm host key của server vào file ~/.ssh/known_hosts
trên GitLab Runner. Điều này có thể được thực hiện trong before_script
của file .gitlab-ci.yml
bằng lệnh ssh-keyscan
. Tuy nhiên, bạn cần cấu hình biến môi trường SSH_SERVER_IP
trên GitLab.
Ví dụ cụ thể với các ngôn ngữ và framework phổ biến
Dưới đây là một số ví dụ cụ thể về cách deploy code lên VPS với các ngôn ngữ và framework phổ biến:
-
PHP:
# .gitlab-ci.yml stages: - deploy deploy: stage: deploy image: alpine/ssh before_script: - apk update && apk add openssh-client - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan $SSH_SERVER_IP >> ~/.ssh/known_hosts - chmod 400 ~/.ssh/known_hosts script: - rsync -avz ./ $SSH_USER@$SSH_SERVER_IP:$DEPLOY_PATH only: - main variables: SSH_USER: root SSH_SERVER_IP: 123.456.789.10 DEPLOY_PATH: /var/www/your-php-app
Trên VPS, bạn cần cấu hình web server (Nginx, Apache) để trỏ đến thư mục
$DEPLOY_PATH
. -
Node.js (Express.js):
# .gitlab-ci.yml stages: - build - deploy build: stage: build image: node:16 script: - npm install - npm run build # (Nếu có build step, ví dụ dùng webpack) artifacts: paths: - dist/ # Hoặc build/ expire_in: 1 day deploy: stage: deploy image: alpine/ssh before_script: - apk update && apk add openssh-client - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan $SSH_SERVER_IP >> ~/.ssh/known_hosts - chmod 400 ~/.ssh/known_hosts script: - rsync -avz dist/ $SSH_USER@$SSH_SERVER_IP:$DEPLOY_PATH # Hoặc build/ - ssh $SSH_USER@$SSH_SERVER_IP "cd $DEPLOY_PATH && npm install && pm2 restart all" only: - main variables: SSH_USER: root SSH_SERVER_IP: 123.456.789.10 DEPLOY_PATH: /var/www/your-node-app
Trên VPS, bạn cần cài đặt Node.js và PM2 để quản lý ứng dụng Node.js.
-
Python (Django):
# .gitlab-ci.yml stages: - deploy deploy: stage: deploy image: alpine/ssh before_script: - apk update && apk add openssh-client - echo "$SSH_PRIVATE_KEY" | tr -d 'r' | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan $SSH_SERVER_IP >> ~/.ssh/known_hosts - chmod 400 ~/.ssh/known_hosts script: - rsync -avz ./ $SSH_USER@$SSH_SERVER_IP:$DEPLOY_PATH - ssh $SSH_USER@$SSH_SERVER_IP "cd $DEPLOY_PATH && pip install -r requirements.txt && python manage.py migrate && python manage.py collectstatic --noinput && sudo systemctl restart your-django-app" only: - main variables: SSH_USER: root SSH_SERVER_IP: 123.456.789.10 DEPLOY_PATH: /var/www/your-django-app
Trên VPS, bạn cần cài đặt Python, pip và cấu hình web server (Nginx, Apache) để phục vụ ứng dụng Django.
Các lỗi thường gặp và cách khắc phục khi deploy code lên VPS bằng GitLab CI/CD
Trong quá trình deploy code lên VPS bằng GitLab CI/CD, bạn có thể gặp một số lỗi sau:
- “Host key verification failed”: Lỗi này xảy ra khi GitLab không thể xác minh host key của VPS. Bạn cần thêm host key của VPS vào file
~/.ssh/known_hosts
trên GitLab Runner. - “Permission denied (publickey)”: Lỗi này xảy ra khi GitLab không có quyền truy cập vào VPS. Bạn cần kiểm tra lại SSH key và đảm bảo rằng public key đã được thêm vào file
~/.ssh/authorized_keys
trên VPS. - “rsync: command not found”: Lỗi này xảy ra khi
rsync
chưa được cài đặt trên image mà bạn sử dụng trong GitLab CI/CD. Bạn cần cài đặtrsync
trongbefore_script
. - “npm: command not found” / “python: command not found”: Lỗi này xảy ra khi Node.js hoặc Python chưa được cài đặt trên image mà bạn sử dụng. Bạn cần sử dụng image có sẵn hoặc cài đặt các ngôn ngữ lập trình này trong
before_script
. - Lỗi liên quan đến biến môi trường: Đảm bảo rằng tất cả các biến môi trường cần thiết (ví dụ:
SSH_PRIVATE_KEY
,SSH_SERVER_IP
,DEPLOY_PATH
) đã được cấu hình chính xác trên GitLab.
Lời khuyên:
- Đọc kỹ log của GitLab CI/CD để tìm hiểu nguyên nhân gây ra lỗi.
- Tìm kiếm trên Google hoặc Stack Overflow để tìm giải pháp cho các lỗi cụ thể.
- Kiểm tra lại cấu hình của VPS và file
.gitlab-ci.yml
.
“Việc sử dụng GitLab CI/CD không chỉ giúp tự động hóa quy trình deploy mà còn mang lại sự nhất quán và giảm thiểu rủi ro sai sót trong quá trình triển khai ứng dụng,” anh Nguyễn Văn An, một DevOps Engineer có nhiều năm kinh nghiệm chia sẻ.
Nâng cao hiệu quả deploy với các tính năng của GitLab CI/CD
Ngoài các tính năng cơ bản, GitLab CI/CD còn cung cấp nhiều tính năng nâng cao giúp bạn tối ưu hóa quy trình deploy:
- Environments: Định nghĩa các môi trường (ví dụ: development, staging, production) và cấu hình riêng cho từng môi trường.
- Secrets: Lưu trữ các thông tin nhạy cảm (ví dụ: mật khẩu, API key) một cách an toàn.
- Variables: Sử dụng các biến môi trường để tùy chỉnh quy trình deploy.
- Caching: Cache các dependencies để tăng tốc độ build.
- Parallel Jobs: Chạy các công việc song song để giảm thời gian thực hiện.
- GitLab Runner: Là một agent chạy các jobs trong pipeline CI/CD. Có nhiều loại Runner như Shared Runners, Group Runners, và Specific Runners. Việc lựa chọn loại Runner phù hợp có thể ảnh hưởng đáng kể đến hiệu suất và bảo mật.
“Để có một quy trình CI/CD hiệu quả, việc lựa chọn và cấu hình GitLab Runner phù hợp là rất quan trọng. Nó giúp tối ưu hóa tài nguyên và đảm bảo các jobs được thực hiện một cách nhanh chóng và an toàn,” chị Trần Thị Bình, một chuyên gia về GitLab CI/CD cho biết.
Bảo mật trong GitLab CI/CD
Bảo mật là một yếu tố quan trọng cần được quan tâm khi sử dụng GitLab CI/CD. Dưới đây là một số biện pháp bảo mật bạn nên áp dụng:
- Sử dụng SSH Key: Sử dụng SSH Key thay vì mật khẩu để truy cập vào VPS.
- Lưu trữ SSH Key an toàn: Lưu trữ SSH Key trên GitLab dưới dạng biến môi trường được “Masked”.
- Sử dụng Secrets: Sử dụng Secrets để lưu trữ các thông tin nhạy cảm.
- Giới hạn quyền truy cập: Giới hạn quyền truy cập vào GitLab repository và VPS.
- Kiểm tra code: Tự động kiểm tra code để phát hiện các lỗ hổng bảo mật.
Kết hợp GitLab CI/CD với các công cụ khác
GitLab CI/CD có thể được tích hợp với nhiều công cụ khác để tạo ra một quy trình phát triển phần mềm hoàn chỉnh:
- Docker: Sử dụng Docker để đóng gói ứng dụng và deploy lên VPS.
- Kubernetes: Sử dụng Kubernetes để quản lý và scale ứng dụng trên VPS.
- Slack/Discord: Gửi thông báo về trạng thái của quy trình CI/CD đến Slack hoặc Discord.
- SonarQube: Sử dụng SonarQube để phân tích code và đánh giá chất lượng.
Ngoài ra bạn có thể tham khảo thêm về cách git và cronjob kết hợp deploy để có thêm các phương án triển khai khác.
Kết luận
GitLab CI/CD là một công cụ mạnh mẽ giúp bạn tự động hóa quy trình deploy code lên VPS một cách dễ dàng và hiệu quả. Bằng cách sử dụng GitLab CI/CD, bạn có thể tiết kiệm thời gian, giảm thiểu lỗi và tập trung vào việc phát triển sản phẩm tốt hơn. Hy vọng bài viết này đã cung cấp cho bạn những kiến thức cần thiết để bắt đầu sử dụng GitLab CI/CD cho dự án của mình. Hãy bắt đầu ngay hôm nay để trải nghiệm những lợi ích mà nó mang lại!
FAQ về GitLab CI/CD Deploy Code Lên VPS
1. GitLab CI/CD có miễn phí không?
Có, GitLab cung cấp phiên bản miễn phí với đầy đủ các tính năng CI/CD. Tuy nhiên, phiên bản miễn phí có giới hạn về số lượng Runners và thời gian build.
2. Tôi cần kiến thức gì để sử dụng GitLab CI/CD?
Bạn cần có kiến thức cơ bản về Git, Linux, và ngôn ngữ lập trình mà bạn sử dụng. Ngoài ra, bạn cũng cần hiểu về các khái niệm CI/CD. Bạn có thể tìm hiểu thêm về git hook post-receive là gì để có thêm các kiến thức liên quan.
3. Tôi có thể deploy code lên nhiều VPS cùng lúc không?
Có, bạn có thể sử dụng vòng lặp hoặc parallel jobs trong .gitlab-ci.yml
để deploy code lên nhiều VPS cùng lúc.
4. Làm thế nào để rollback code khi có lỗi?
Bạn có thể sử dụng GitLab CI/CD để tự động rollback code về phiên bản trước đó khi có lỗi. Bạn cần viết script để thực hiện việc này.
5. Tôi có thể sử dụng GitLab CI/CD để deploy database không?
Có, bạn có thể sử dụng GitLab CI/CD để deploy database. Bạn cần viết script để thực hiện các thao tác như backup database, migrate database, và restore database.
6. Làm thế nào để bảo mật thông tin đăng nhập database trong GitLab CI/CD?
Bạn nên sử dụng Secrets để lưu trữ thông tin đăng nhập database và không nên lưu trữ trực tiếp trong file .gitlab-ci.yml
.
7. Có công cụ nào khác ngoài GitLab CI/CD để deploy code lên VPS không?
Có, có nhiều công cụ khác như Jenkins, CircleCI, Travis CI, GitHub Actions,… Tuy nhiên, GitLab CI/CD có lợi thế là tích hợp sẵn trong GitLab, giúp bạn dễ dàng quản lý và sử dụng. Ngoài ra, bạn có thể tham khảo thêm về cách push code lên server bằng git như một cách thức tiếp cận đơn giản hơn.