Jenkins là một opensource dùng để thực hiện chức năng tích hợp liên tục (gọi là CI – Continuous Integration) và xây dựng các tác vụ tự động hóa. Nó tích hợp các source code của các members trong team lại nhanh chóng một cách liên tục, theo dõi sự thực thi và trạng thái thông qua các bước kiểm thử (Integration test, units test). Tất nhiên là nhằm giúp sản phẩm chạy ổn định.
Các hệ thống tích hợp liên tục (CI) là một phần quan trọng của bất kỳ nhóm Agile nào vì chúng giúp thực thi các lý tưởng phát triển Agile.
Đây là một công cụ xây dựng liên tục, cho phép các nhóm tập trung vào công việc của họ bằng cách tự động hóa quá trình xây dựng, quản lý nhân tạo và quy trình triển khai.
Chức năng và tính linh hoạt cốt lõi của Jenkins cho phép nó phù hợp với nhiều môi trường khác nhau và có thể giúp hợp lý hóa quy trình phát triển cho tất cả các bên liên quan.
CI là gì? CD là gì?
Credit: Dzone
CI là viết tắt của Continuous Integration
Là tích hợp liên tục, nhằm liên tục tích hợp các source code của các thành viên trong team lại một cách nhanh chóng. Giúp kiểm soát được tình hình phát triển thông qua các bước kiểm thử unit tests,Integration tests.
CI Workflow
Chu trình làm việc
Bước đầu tiên, các thành viên trong team dev sẽ bắt đầu pull code mới nhất từ repo về branch để thực hiện các yêu cầu chức năng nhất định.
Tiếp đó là quá trình lập trình và test code để đảm bảo chất lượng của chức năng cũng như toàn bộ source code.
Thành viên code xong thì sẵn sàng cho việc commit vào branch develop của team.
Thành viên cập nhật code mới từ repo về local repo
Merge code và giải quyết conflict.
Build và đảm bảo code pass qua các tests dưới local.
Commit code lên repo
Máy chủ CI lắng nghe các thay đổi code từ repository và có thể tự động build/test, sau đó đưa ra các thông báo (pass/failure) cho các thành viên.
CD là viết tắt của Continuous Delivery
Continuous Delivery là chuyển giao liên tục, là 1 tập hợp các kỹ thuật để triển khai tích hợp souce code trên môi trường staging ( một môi trường rất giống với môi trường production). Với cách này ta có thể đảm bảo source code được review, kiểm thử một cách tỉ mỉ trước khi deploy lên môi trường production.
Mặc định Jenkins sẽ chạy ở địa chỉ localhost:8080. Bạn có thể thay đổi lại PORT trong file jenkins.xml để an toàn hoặc riêng tư hơn.
Chờ quá trình cài đặt Plugins hoàn tất là xong. Mặc định Jenkins chỉ truy cập được từ internal. Để có thể truy cập Jenkins từ ngoài mạng internet, ví dụ https://jenkins.tuanitpro.com/ chúng ta cần cấu hình Reverse Proxy cho IIS.
Sau một thời gian code ra được môt trang web xịn xò thì bạn có nhu cầu đưa lên internet để mọi người được biết. Bắt đầu với công việc đầu tiên là tìm mua tên miền, hosting hoặc VPS. Bạn có thể mua VPS lại Vultr. 1 VPS có thể cài đặt được nhiều trang web.
Như vậy sau quá trình chuẩn bị thành công, chúng ta sẽ đẩy code từ local lên hosting, server. Quá trình này khá là mất công. Cách cổ điển hiện nay được nhiều người dùng là dùng FTP, hoặc upload thằng từ các trang quản lý. Đây là công việc khá nhàm chán, tốn thời gian. Khi có một thay đổi nhỏ là phải đi thao tác lại.
Chính vì vậy khái niệm CI/CD ra đời. CI/CD là một bộ đôi công việc, bao gồm CI (Continuous Integration) và CD (Continuous Delivery), ý nói là quá trình tích hợp (integration) thường xuyên, nhanh chóng hơn khi code cũng như thường xuyên cập nhật phiên bản mới (delivery).
Có khá nhiều công cụ hỗ trợ CI/CD, nhưng trong phạm vi bài viết chỉ đề cập công cụ CI/CD của Gitlab, và tất nhiên sử dụng tính năng free. Nếu bạn dùng nhiều hơn, phải trả thêm phí. Khi đó công việc sau khi code xong chỉ là nhấn nút push lên gitlab, ngồi uống cafe và đợi thành qủa.
Để tiết kiệm thời gian cài đặt và mọi thứ suôn sẻ, bạn cần có một chút kiến thức về VPS, SSH, public key, private key…
Một số thứ cần chuẩn bị trước khi bắt tay vào làm.
Gitlab Runner là thành phần cực kỳ quan trọng trong workflow Gitlab CI. Nếu không có Runner thì sẽ không có lệnh test, deploy nào được thực thi. Runner có nhiều loại, phân biệt dựa vào cái gọi là executor. Khi khởi tạo runner, bạn sẽ phải chọn nó là loại executor nào, và nó sẽ quyết định môi trường thực thi các câu lệnh trong file config ở trên. Bạn có thể tham khảo link https://docs.gitlab.com/runner/executors/ để biết sự khác nhau của các executor cũng như cách cài đặt, cấu hình chúng.
Trong repository setting, mục CI/CD, trên VPS mình chọn cài manual, excutor chọn Shell. Hoặc dùng luôn Share Runner mà không cần cài đặt cũng được.
Đến đây tạm xong phần cài đặt cần thiết. Chúng ta sẽ quay lại repo trên Gitlab.
Thêm file .gitlab-ci.yml tại folder root trên Gitlab
Mặc định Gitlab không có cơ chế nào về CI cho dự án của bạn, chỉ khi nào dự án của bạn có file .gitlab-ci.yml nằm ở thư mục gốc thì Gitlab mới nhận dạng được dự án của bạn muốn áp dụng Gitlab CI. File này có định dạng và cần hợp lệ thì mới có thể hoạt động được, không thì khi bạn push code lên thì Gitlab sẽ báo lỗi file định dạng nội dung của file cấu hình không hợp lệ. Tham khảo cú pháp của cấu hình này tại https://docs.gitlab.com/ce/ci/yaml/
Chú ý phải đúng format. Bạn có thể sửa trực tiếp trên Gitlab, nó sẽ kiểm tra giúp file có đúng format hay không. Đoạn code dưới đây làm 2 việc. Đầu tiên build code từ branh master ra bản release. Câu lệnh npm run build –prod khá quen thuộc. Sau đó deploy lên production thông qua Rsync kết hợp SSH.
# Using the node image to build the React app
image: node:latest
variables:
PUBLIC_URL: /
# Cache node modules - speeds up future builds
cache:
paths:
- node_modules
stages:
- build
- deploy
build:
stage: build
script:
- npm install # Install all dependencies
- npm run build --prod # Build for prod
artifacts:
paths:
- build
only:
- master # Only run on master branch
deploy_production:
stage: deploy
image: ubuntu
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 700 ~/.ssh/id_rsa
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_rsa
- ssh-keyscan -H 'gitlab.com' >> ~/.ssh/known_hosts
- apt-get install rsync -y -qq
- apt-get install curl -y -qq
script:
- echo "Deploying to server"
- ssh -i ~/.ssh/gitlab -o StrictHostKeyChecking=no USERNAME@IP-HOST -p PORT
- rsync -avz --progress -a -e "ssh -p PORT" build/ USERNAME@IP-HOST:/home/www/noithatrongviet.com/public_html
- echo "Deployed"
environment:
name: production
url: http:noithatrongviet.com
only:
- master # Only run on master branch
Chú các thông tin quan trọng: USERNAME@IP-HOST PORT là thông tin tên đăng nhập, port SSH của bạn. /home/www/noithatrongviet.com/public_html thay = đường dẫn trên host của bạn. Xong nhấn nút Commit và vào mục CI/CD -> Pipelines hoặc CI/CD -> Jobs kiểm tra kết quả của bạn.Tận hưởng thành quảChúc các bạn thành công. Từ nay cứ commit code là Gitlab tự động build và deploy lên host cho bạn, quá đã phải không.