kiến thức DevOps thực tế và chi tiết

elroydevops DevOps thực tế và chi tiết từ doanh nghiệp

Gitlab CI CD nâng cao

Tiếp nối series CI/CD của mình, bài viết này mình sẽ triển khai Gitlab CI CD nâng cao. Vậy cách mình triển khai sau đây có ưu điểm gì hay? Nếu bạn đang gặp vấn đề cấu hình .gitlab-ci.yml của mình là thằng DevOps Engineer viết ngon nghẻ mà ông Dev nọ lại chỉnh sửa tùm lum được nó không?

Các bài viết mình chia sẻ đều có mục đích cụ thể, bài viết nào cần chi tiết mình sẽ làm thật chi tiết để cho những bạn chưa có kinh nghiệm có một cái flow hoàn chỉnh (chi tiết từ cái bước tạo dự án, tạo branch, cài đặt,…). Có những bài viết muốn đem lại tư tưởng triển khai để mọi người có thể hiểu, vận dụng và sáng tạo theo cách riêng của mình vì chắc chắn rồi mình không clone hoàn chỉnh trên thực tế trong bài viết public được.

Trong bài Gitlab CI CD nâng cao này mình cũng sẽ triển khai chi tiết nhưng sẽ đem lại tư tưởng triển khai cho bạn được nhiều hơn, chúng ta cùng bắt đầu.

Ưu điểm cách triển khai Gitlab CI CD

  • Triển khai Gitlab CI CD nâng cao, bảo mật hơn phù hợp trên môi trường staging đơn giản nhưng những ưu điểm sau
    • Không lộ file cấu hình .gitlab-ci.yml: cấu hình Gitlab CI CD trong dự án sẽ được bảo vệ hơn.
    • Không viết trực tiếp cấu hình .gitlab-ci.yml trong dự án: đảm bảo việc giới hạn quyền tác động vào cấu hình Gitlab CI CD của chúng ta bởi các user khác.
    • Quản lý tập trung các file cấu hình: dễ dàng kiểm soát, nâng cấp, chỉnh sửa mà không lo ảnh hưởng code dự án (mấy bạn fresher, junior ít kinh nghiệm sử dụng Git khi code có thể dính Conflict và fix không cẩn thận có thể ảnh hưởng đến chúng ta việc động lại rất mất công).
    • Kiểm soát được việc deploy: Kiểm soát được việc triển khai dự án lên staging bằng cách chỉ có người có quyền mới được phép triển khai, vậy ở staging này của chúng ta là continuous delivery.

Chuẩn bị và lưu ý

Trong bài viết này mình sẽ lấy chính project bài viết Jenkins CI CD pipeline (Delivery)

  • Dự án Java sample Harvard University Portal.
  • Cài đặt và cấu hình Java, Maven, Tomcat.

Bài viết mình cũng sẽ triển khai chi tiết để mọi người lấy được tư tưởng nên như mình nói không thể giống hẳn nhé mà sẽ đơn giản hơn rất nhiều nhưng tư tưởng vẫn vậy, điều này vừa giúp các bạn mới hoặc chưa có kinh nghiệm triển khai vẫn có thể hiểu được.

Còn nếu mình nhận được nhiều request cần một bài viết chi tiết, nâng cao như một khóa học nhưng hoàn toàn free thì mình cũng có thể làm được cho mọi người nhé.

Triển khai Gitlab CI CD

Trước khi vào triển khai mình sẽ mô tả trước các step chúng ta sẽ đi qua:

  • Thiết lập cài đặt services cần thiết trên server deploy
  • Thiết lập trên dự án cấu hình Gitlab CI CD
  • Thiết lập cấu hình trên dự án cần chạy CI CD

Thiết lập cài đặt services cần thiết trên server deploy

Chúng ta phải tạo một người dùng riêng trên server cho dự án đó, đây là một bước cần thiết để triển khai rõ ràng, minh bạch khi trên server của chúng ta phải triển khai nhiều dự án, mình sẽ tiến hành tạo user là hvportal (tương ứng cho project Harvard University Portal)

elroydevops.tech
$ sudo useradd hvportal

Tạo mật khẩu cho người dùng

elroydevops.tech
$ sudo passwd hvportal

Bạn hãy kiểm tra xem server của mình cài đặt Git chưa nhé nếu chưa cài đặt hãy sử dụng câu lệnh dưới đây

elroydevops.tech
$ sudo yum install git -y

Để chạy được một dự án Java web chúng ta sẽ tiến hành cài đặt các bước sau đây, đầu tiên cài đặt Java 11 (lưu ý server đang chạy Jenkins cũng phải cùng version Java nhé)

elroydevops.tech
$ sudo yum install java-11-openjdk-devel -y

Rất có thể khi bạn sử dụng CentOS Java sẽ được cài đặt version 8 nên bạn sử dụng câu lệnh dưới đây

elroydevops.tech
$ sudo update-alternatives --config java

Chọn đúng version Java 11 như dưới đây nhé (dấu + là version đang được lựa chọn)

Tiếp theo cài đặt Maven

elroydevops.tech
$ sudo yum install maven -y

Tiến hành cài đặt Webserver tomcat, để chạy được dự án Java web chúng ta sử dụng tomcat, đầu tiên tạo người dùng tomcat

elroydevops.tech
$ sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat

Di chuyển tới thư mục /tmp và tải file cài đặt tomcat về server, ở đây mình sử dụng lựa chọn –no-check-certificate vì thật không ngờ mình tải đúng lúc website tomcat hết SSL

elroydevops.tech
$ cd /tmp && wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.78/bin/apache-tomcat-9.0.78.tar.gz

Tiến hành giải nén file cài đặt tomcat vừa tải

elroydevops.tech
$ sudo tar xzvf apache-tomcat-9*tar.gz -C /opt/tomcat –strip-components=1

Đổi quyền sở hữu thư mục cho người dùng tomcat

elroydevops.tech
$ sudo chown -R tomcat:tomcat /opt/tomcat

Cho user hvportal vào group tomcat

elroydevops.tech
$ sudo usermod -aG tomcat hvportal

Cấp quyền thực thi cho các file có đuôi .sh để đảm bảo có thể thực thi script

elroydevops.tech
$ sudo sh -c ‘chmod +x /opt/tomcat/bin/*.sh’

Lấy đường dẫn tuyệt đối của thực thi của chương trình java trên hệ thống, bạn hãy copy lại để chúng ta sử dụng nhé

elroydevops.tech
$ sudo readlink -f $(which java)

Được kết quả dưới đây

/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java

Tạo cấu hình service cho tomcat

elroydevops.tech
$ sudo vi /etc/systemd/system/tomcat.service

Cấu hình như dưới đây

[unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes

User=tomcat
Group=tomcat

Environment="/usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
wantedBy=multi-user.target

Tải lại các tệp cấu hình và cập nhật của systemd trên hệ thống Linux

elroydevops.tech
$ sudo systemctl daemon-reload

Khởi động tomcat cùng hệ thống

elroydevops.tech
$ sudo systemctl enable tomcat

Khởi động tomcat (nếu bạn có sử dụng Firewall hãy mở port 8080 nhé)

elroydevops.tech
$ sudo systemctl start tomcat

Thay đổi quyền thư mục /opt/tomcat để các user có thể sử dụng

elroydevops.tech
$ sudo chmod -R 775 /opt/tomcat

Bước tải cài đặt gitlab-runner cho bạn nào làm lab từ đầu nhé

elroydevops.tech
$ sudo yum install -y curl

Cài đặt kho lưu trữ (repository) của GitLab Runner trên hệ thống (nếu lỗi có thể do dấu “” nhé hãy gõ lại)

elroydevops.tech
$ sudo curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

Tiến hành cài đặt Gitlab-runner

elroydevops.tech
$ sudo yum install gitlab-runner -y

Khởi tạo runner mới cho dự án

elroydevops.tech
$ sudo gitlab-runner register

Điền thông tin như dưới đây (thông thường sẽ tạo runner theo môi trường và chúng ta có thể sử dụng cho nhiều project một cách tường minh hơn tuy nhiên ở đây mình tạo luôn trong project) Token kia lấy trong phần Setting > CI/CD > Runner nhé

Tiến hành khởi chạy gitlab-runner bằng lệnh

$ sudo nohup gitlab-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --user gitlab-runner > /dev/null 2>&1 &

Cấp quyền thực thi cho Gitlab-runner

elroydevops.tech
$ sudo visudo

Thêm nội dung sau đây vào trong file dưới phần root ALL = (ALL) ALL

gitlab-runner ALL=(ALL) NOPASSWD: /bin/systemctl*
gitlab-runner ALL=(ALL) NOPASSWD: /bin/cp*
gitlab-runner ALL=(ALL) NOPASSWD: /bin/chown*
gitlab-runner ALL=(ALL) NOPASSWD: /bin/su hvportal*

Thiết lập trên dự án cấu hình Gitlab CI CD

Sau khi thiết lập xong phần server deploy chúng ta đến với Gitlab CI CD, mình có một dự án Harvard University Portal như thế này

Nhận được request có bạn không down được project để làm lab cùng mình thì bạn có thể làm theo hướng dẫn này nhé, trong phần Chuẩn bị tài nguyên của bài viết triển khai Jenkins Production bạn chuột phải vào link như dưới đây và chọn open link in new window

Sau đó khi đã mở ra trang mới bạn chỉ cần F5 lại 1 lần project sẽ được download như dưới đây

Tiếp theo chúng ta quay lại Gitlab, tạo group config (đây là group chứa dự án cấu hình cicd cho tất cả các dự án cần chạy Gitlab CI CD)

Chọn vào tạo dự án

Điền thông tin dưới đây (đây chính là dự án chứa các cấu hình cicd cho tất cả các dự án)

Tiếp đến chúng ta sẽ viết file cấu hình bạn chọn vào Add file sẽ mở ra trình IDE giống VSCode (hoặc nếu không bạn tạo file cũng tương tự nhé không cần quá quan trọng mấy cái râu ria)

Vào giao diện IDE chúng ta tiến hành tạo file

Đây là một cách triển khai dự án java với tomcat rất đơn giản thôi trong bài viết Jenkins CI CD mình cũng đã nói rồi, bản chất là build dự án java được thư mục target rồi copy nó vào trong phần webapps của tomcat và chạy

File .staging.yml chính là file tổng file này có thể nói là cấu hình để chạy Gitlab CI CD tất cả các dự án có trên gitlab của bạn tải file tại .staging.txt (ở đây mình để .txt để bạn mở thấy luôn còn định dạng của file là .yml nhé)

Ở đây mình có 2 stages là build, deploy và bước deploy là thủ công.

 

Tiếp theo mình tạo file .hv-portal-ci.yml với nội dung chính là cung cấp các thông tin biến số của dự án, như vậy chúng ta có bao nhiêu dự án sẽ đều tạo các file cấu hình trong project riêng như vậy sẽ đảm bảo việc các thành viên không có quyền có thể sửa đổi file cấu hình.

File .hv-portal-ci.yml bạn xem tại .hv-portal-ci.txt

 

Sau khi thiết lập xong file cấu hình Gitlab CI CD thì bạn tiến hành commit file

Thiết lập cấu hình trên dự án cần chạy CI CD

Như mình đã nói và bạn cũng thấy mình cấu hình các bước ở trên là chỉ có người có quyền mới được deploy nên chúng ta tiến hành thêm một user khác vào dự án

Quay lại dự án Hardvard University Portal, mình thêm một người dùng có quyền Develop

Thành công được kết quả

Tiếp theo bước rất quan trọng chọn vào Settings > CI/CD > General pipelines > CI/CD Configuration file phần này chính là file cấu hình Gitlab CI CD tại dự án /config/cicd mà nãy chúng ta tạo bạn thêm như dưới đây.

Vậy là thiết lập thành công Gitlab CI CD, chi tiết document bạn có thể xem tại đây, bây giờ chúng ta sẽ tiến hành chạy thử, tạo tag giả định chúng ta release lên staging env

Vậy là Gitlab CI CD đã chạy không hề có một chút cấu hình nào trong dự án cần chạy Gitlab CI CD

Như cấu hình mình viết bước deploy này sẽ là thủ công nên tạm thời đang dừng chờ người xác nhận (tuy nhiên trong khoảng thời gian 1h mặc định nhé, sau đó sẽ tự time out và chuyển thành fail)

Mình tiến hành truy cập vào account Guest vừa thêm lúc nãy trong dự án

Tiến hành bấm play để chạy deploy và chắc chắn rồi bị fail bước deploy

Chi tiết fail là không có quyền

Mình quay lại account manhnv của mình và tiến hành play lại và thành công

Gitlab CI CD nâng cao

Kiểm tra và đã thấy website Ha Vợt Iu Ni Vời Si Ty Pốt đồ đã lên

Vậy là mình đã hướng dẫn xong cách triển khai Gitlab CI CD nâng cao, bảo mật hơn phù hợp trên môi trường staging, tuy nhiên như mình đã nói thực tế sẽ phức tạp hơn rất nhiều, bạn có thể tham khảo để triển khai dự án của mình để thấy được thực tế các ưu điểm nhé. Bạn có thể liên hệ với mình nếu có vấn đề gì nhé. Mình sẽ làm nhiều hướng dẫn hơn về các kỹ năng các tool khác để giúp bạn tối ưu được những tác vụ cũng như tiết kiệm những chi phí khi phát triển phần mềm. Thanks.

 

Mọi thắc mắc bạn có thể liên hệ:

Email: [email protected]

Leave a comment

Your email address will not be published. Required fields are marked *