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

Setup Gitlab CICD pipeline private registry

Trước khi tìm hiểu chi tiết CICD pipeline là gì, triển khai như thế nào cho chuẩn bạn hãy xem thông tin ngay dưới đây.

Chắn hẳn bạn đã biết những ứng dụng, website đang thịnh hành hiện nay như: Facebook, Instagram, TikTok, Youtube, Google, Twitter,… đều có lượng truy cập hàng ngày vô cùng lớn, chính vì vậy đã đem lại doanh thu siêu khủng khiếp giúp những ông “Trùm” thành Tỷ Phú Đô La, gây dựng đế chế ngày càng mạnh mẽ, với hàng triệu thông tin mỗi ngày. Vậy bạn có biết nếu ứng dụng, website của họ bị sập dù chỉ 1 phút sẽ tốn mất bao nhiêu tiền không? Bạn hãy xem ví dụ về Facebook dưới đây, đúng vậy, sẽ tốn khoảng hơn $163,000/minute tương đương gần 4 Tỷ VND mỗi phút đó là dựa theo con số đã cũ vào năm 2020 sau một lần Facebook sập khoảng 6 giờ đồng hồ.

Cre: Facebook’s outage likely cost the company over $60 million

Mỗi lần triển khai phiên bản mới sẽ có thời gian trống hay sao? hay chúng ta lại ngập trong câu nói quen thuộc “Code ở dưới local chạy phà phà mà” vậy nên CICD Pipeline là một phần công việc không thể thiếu trong mỗi dự án. Bạn có thể hiểu đơn giản là công việc này sẽ khiến cho những phiên bản mới được cập nhật mà phiên bản cũ vẫn chạy khi hoàn tất phiên bản mới lên cũng không hề có khoảng thời gian website bị downtime vì vậy sẽ hạn chế tối đa việc ảnh hưởng đến người dùng, không những giúp chúng ta giảm thiểu được thời gian triển khai code lên server (không còn phải triển khai thủ công bằng tay mà có triển khai thì chục nghìn vài chục nghìn service thì triển khai chay sao nổi), các job test, mà còn làm tăng hiệu quả công việc và vô số lợi ích bạn có thể tìm hiểu thêm. Chính vì vậy đây được coi là kỹ năng bắt buộc phải có nếu bạn muốn trở thành DevOps Engineer.

Quan trọng là vậy nhưng công việc này lại đòi hỏi phải biết vận dụng thành thạo rất nhiều kỹ năng của các công cụ, và những công cụ triển khai CICD pipeline phổ biến hiện nay có Gitlab CI, Jenkins, CircleCI, TeamCity và 2 service của các nhà cung cấp Cloud lớn nhất thế giới hiện nay như CodePipeline (AWS), Azure DevOps (Microsoft). Kèm với đó phải kết hợp vận dụng với rất nhiều công cụ khác như Linux, Script, Docker, Ansible, K8s, Selenium, Webserver,… tuy nhiên bạn đừng lo lắng khi nghe những công cụ lạ lẫm vì chúng ta chưa cần biết đến nó trong bài viết này.

Và ngay sau đây mình sẽ cùng tìm hiểutriển khai CICD pipeline luôn một dự án sử dụng Gitlab CICD bạn sẽ nắm được luồng xử lý cũng như có thể triển khai ngay trong dự án của bạn chi tiết từ lúc cài đặt server gitlab cái lúc mà bạn còn chưa có chỗ để mà lưu code (chi tiết đến từng câu lệnh).

CICD là gì?

CI/CD là viết tắt của Continuous Integration (tích hợp liên tục)/Continuous Delivery (chuyển giao liên tục) hoặc Continuous Deployment (triển khai liên tục). Đây là một phương pháp được sử dụng trong phát triển phần mềm để tăng tốc độ phát triển và giảm thiểu tối đa các lỗi phát sinh trong quá trình phát triển, trong bài này chúng ta sẽ làm về Continuous Integration/Continuous Deployment

  • Continuous Integration (CI) là quá trình tự động hóa việc tích hợp và kiểm tra mã nguồn từ các thành viên của nhóm phát triển vào một bản chung, đảm bảo rằng mã nguồn luôn ổn định và tương thích với nhau.
  • Continuous Deployment (CD) là quá trình tự động hóa việc phát triển, kiểm thử và triển khai ứng dụng để đưa các tính năng mới và cải tiến lên môi trường sản xuất một cách nhanh chóng và tin cậy.

Tóm lại, CICD pipeline giúp các nhà phát triển phần mềm tối ưu hóa quy trình phát triển, giảm thiểu thời gian và chi phí phát triển, đồng thời cũng tăng tính ổn định và tin cậy của sản phẩm.

Lợi ích thực tế áp dụng ngay trong dự án của bạn

Khi bạn tìm hiểu về CICD pipeline thì có vẻ như bạn là người mới tìm hiểu DevOps, hoặc bạn là Developer và đúng vậy bài viết này dành cho bạn, nhưng bạn đừng nghĩ sẽ đơn giản và giá trị không cao nhé, đây sẽ là cách triển khai mà bạn có thể yên tâm áp dụng cho dự án, cho doanh nghiệp của bạn (bạn hãy hiểu luồng nghiệp vụ trong bài viết này nhé).

Vậy lợi ích thấy ngay ở đây là gì:

  • Không còn phải triển khai code lên server bằng tay thủ công và tốn thời gian.
  • Tăng hiệu suất trong dự án (dĩ nhiên rồi tiết kiệm một đống thời gian deploy code ấy chứ).
  • Quá trình Dev và Test có thể liên tục: fix lỗi -> test, test -> fix lỗi giảm thiểu tối đa thời gian trống của các thành viên trong dự án.
  • Và rõ ràng rồi, Dev giỏi mà biết kỹ năng này lại khác gì hổ mọc thêm cánh, làm việc hiệu quả hơn, tiết kiệm thời gian hơn, tiết kiệm chi phí hơn tăng thu nhập là điều tất yếu.
  • DevOps thì sao dĩ nhiên rồi kỹ năng này là bắt buộc, thậm chí còn bắt buộc phải master, thành thạo sử dụng các công cụ, kết hợp các công cụ để cho ra được CICD pipeline tối ưu nhất cũng là khẳng định bản thân có giá trị.

Triển khai CICD pipeline A -> Z step by step

Mình sẽ tiến hành setup CICD pipeline cho một dự án .NET 6 trong mạng nội bộ và đảm bảo đủ các yếu tố: Chi tiết, bảo mật, miễn phí bạn có thể thực hành luôn tại thiết bị của mình hoặc trong doanh nghiệp của bạn.

Tổng quan các bước triển khai CICD pipeline

Chuẩn bị

  • 3 server ubuntu
    • Server 1: Server cài đặt gitlab có địa chỉ IP là 10.32.4.111
    • Server 2: Cài đặt gitlab-runner và registry có địa chỉ IP là 10.32.4.125 (nếu bạn chưa biết đó là gì, đừng lo lắng bạn sẽ biết và hiểu ngay là gì ở phần triển khai sắp tới)
    • Server 3: Deploy dự án có địa chỉ IP là 10.32.3.180
    • Nếu bạn không có những máy chủ cần thiết tại doanh nghiệp bạn có thể tham khảo Cách dùng vagrant tạo máy ảo mình có hướng dẫn để tạo nhanh 3 server (lưu ý địa chỉ IP ở đây là mình tự đặt nên bạn có thể đặt là gì tùy ý và tùy thuộc vào rải IP mà bạn setup).

Các bước triển khai

  • Step 1: Cài đặt Gitlab và triển khai dự án lên trên Gitlab
    • Step 1.1: Cài đặt Gitlab bằng docker trên server 1
    • Step 1.2: Tạo dự án trên Gitlab và push code từ local lên Gitlab
  • Step 2: Cài đặt Gitlab-runner kết nối với Gitlab và Registry
    • Step 2.1: Cài đặt gitlab-runner và kết nối gitlab-runner với Gitlab trên server 2
    • Step 2.2: Cài đặt registry và cài đặt https cho registry trên server 2
  • Step 3: Thực hiện cấu hình CICD pipeline trên Gitlab và trong source dự án
    • Step 3.1: Cấu hình Dockerfile để chạy dự án bằng container
    • Step 3.2: Cấu hình .gitlab-ci.yml file để chạy CICD pipeline
    • Step 3.3: Cấu hình các biến trong cài đặt CICD pipeline
  • Step 4: Cài đặt kết nối Registry với server deploy
    • Step 4.1: Cài đặt kết nối ssh từ server 2 sang server 3
    • Step 4.2: Cấu hình tin cậy https từ server 3 với server 2

Sơ đồ luồng 1 chiều siêu đơn giản

  • Bạn có thể thấy ngay khi bạn push code, gitlab-runner sẽ chạy để kéo code về server, nó sẽ tiến hành chạy các job tiếp tục như build thành image và push nó lên registry (giai đoạn này là CI), tiếp tục server deploy sẽ tiến hành pull image nó và run lên container (giai đoạn này là CD) người dùng truy cập từ address mà bạn đã cấu hình.
  • Vậy là chỉ duy nhất công việc của bạn là kiểm tra thật kỹ code của mình và nhấn push, hoặc merge request từ nhánh khác vào và CICD pipeline code sẽ tự động build, test, deploy.

Step 1: Cài đặt gitlab và triển khai dự án lên trên Gitlab

Ở bước đầu tiên mình sẽ tiến hành cài đặt Gitlab trên server có IP là 10.32.4.111 như ở bước chuẩn bị đã nói và mình sử dụng docker với ưu điểm là nhanh chóng, dễ dàng (tuy nhiên thực tế mình không khuyến khích sử dụng docker để cài đặt gitlab làm server lưu trữ source).

Nếu bạn đã biết cách setup hoặc bạn đã có gitlab thì có thể bỏ qua bước này tiếp tục các bước tiếp cicd pipeline nhé.

$ apt-get update

$ apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

$ apt-get update

$ apt-get install docker-ce docker-ce-cli containerd.io

$ curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ chmod +x /usr/local/bin/docker-compose

Cài đặt xong tiến hành thực hiện 2 lệnh sau và kết quản vậy là đã cài đặt docker và docker-compose thành công.

$ docker -v

$ docker-compose -v

$ mkdir -p /home/docker-app/gitlab && cd /home/docker-app/gitlab tạo thư mục để lưu config triển khai gitlab và đi tới thư mục đó.

$ nano docker-compose.yml tạo file docker-compose để tiến hành build Gitlab và nội dung dưới đây

version: '3'                                              # Phiên bản docker-compose

services:                                                 # Định nghĩa các dịch vụ khởi tạo các ứng dụng, có thể có nhiều ứng dụng
  web:                                                    # Tên của một dịch vụ được định nghĩa
    image: gitlab/gitlab-ee:latest                        # Gói gitlab-ee phiên bản mới nhất được lấy từ Docker hub
    restart: always                                       # Khởi chạy container cùng với hệ thống (tự động khởi động)
    container_name: gitlab-server                         # Tên của container
    hostname: 10.32.4.111                                 # hostname nếu bạn muốn đặt cái khác ở đây mình sử dụng IP server luôn
    environment:                                          # Thuộc tính cung cấp biến môi trường
      GITLAB_OMNIBUS_CONFIG: |                            # Biến môi trường được sử dụng để cấu hình GitLab Omnibus 
        external_url 'http://10.32.4.111:8090'            # Chính xác là link Gitlab mà chúng ta sẽ sử dụng
    ports:                                                
      - '8090:8090'                                       # Ánh xạ cổng từ host (máy tính chạy Docker) vào container của service
    volumes:                                              # Lưu dữ liệu container chạy khi bạn có xóa container sẽ không mất dữ liệu
      - '/srv/gitlab/config:/etc/gitlab'                  # Thư mục này chứa các tệp cấu hình cho GitLab
      - '/srv/gitlab/logs:/var/log/gitlab'                # Thư mục này chứa các tệp nhật ký cho GitLab
      - '/srv/gitlab/data:/var/opt/gitlab'                # Thư mục này chứa các dữ liệu cho GitLab

Vậy là mình đã mô tả vô cùng chi tiết từng thành phần trong file docker-compose và tiếp theo bạn chỉ cần chạy lệnh

$ docker-compose up -d khởi chạy file docker-compose

$ docker ps xem kết quả của các container hiện đang chạy

Tiếp theo tiến hành đổi password tài khoản root cho dễ sử dụng

$ docker exec -it gitlab-server bash truy cập vào bên trong container đang chạy gitlab

$ gitlab-rake "gitlab:password:reset[root]" đổi password mới

Tiến hành đăng nhập vào Gitlab với IP và Port đã thiết lập: 10.32.4.111:8090

Tiến hành tạo dự án mới có tên là Ielts exam backend

Tạo dự án thành công và tiến hành tạo người dùng mới (tương ứng với thành viên trong team)

Mình tạo một tài khoản tên ManhNV và role regular

Tiến hành cập nhật password

Qua trang admin tiến hành thêm người dùng đó vào dự án

Đây sẽ là tài khoản để triển khai, bảo trì dự án nên bạn phải đặt quyền là Maintainer nhé

Login tài khoản vừa tạo tiến hành push code lên và tiến hành tạo thêm nhánh develop và staging (main là nhánh mặc định)

Bạn truy cập vào Pipelines sẽ thấy có những job được khởi tạo do mình đã quên tắt Auto DevOps của Gitlab tiến hành truy cập Setting để tắt

Bỏ chọn như dưới đây và lưu lại

Vậy đến đây chúng ta đã setup xong Step 1 trong phần CICD pipeline này với tạo Gitlab và đưa dự án lên trên Gitlab, tiếp theo sẽ đến bước vô cùng quan trọng bạn chú ý nhé

Step 2: Cài đặt Gitlab-runner kết nối với Gitlab và Registry

Đầu tiên chúng ta phải hiểu gitlab-runner là gì. Bạn có thể hiểu đơn giản gitlab-runner tương ứng chính là người lấy code từ trên server gitlab về và thực thi các câu lệnh của bạn. Vậy tác dụng chính xác của gitlab-runner ở đây sẽ là clone code từ gitlab tiến hành chạy công việc CICD pipeline như build dự án đóng gói nó và triển khai lên server deploy cùng với registry. Registry bạn có thể hiểu đơn giản giống như docker hub là một nơi lưu trữ những image và đơn giản hơn nữa nó giống như gitlab vậy khác là gitlab lưu trữ các source code registry lưu trữ các image docker.

Như ở trên server này có IP là 10.32.4.125 chúng ta cũng tiến hành cài đặt gitlab-runner và registry

$ apt-get update

$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | bash

$ apt-get install gitlab-runner

$ apt-cache madison gitlab-runner

$ gitlab-runner -version

$ usermod -aG docker gitlab-runner

$ usermod -aG sudo gitlab-runner

$ visudo chỉnh sửa tệp sudoers, tệp này xác định người dùng và nhóm có quyền quản trị viên thêm 2 dòng gitlab-runner như dưới đây

Sau khi đã cài đặt xong gitlab-runner mình sẽ tiến hành kết nối gitlab-runner với gitlab

$ gitlab-runner register khởi tạo gitlab-runner mới theo thứ tự

  • Server gitlab (ở đây của mình là 10.32.4.111:8090)
  • Nhập token project lấy từ setting cicd trong dự án trên gitlab như dưới đây (dự án của mình là HAusq4W7Ro1MqNFPfzho)
  • Nhập mô tả, bạn có thể thêm mô tả cho runner này (như mình ENTER qua và mặc định lấy hostname server)
  • Nhập tag, tag của runner có thể được chỉ định trong cài đặt, ví dụ chỉ đích danh tag này thì runner mới chạy (ở đây mình điền ielts-exam-be)
  • Nhập ghi chú (Phần này ENTER bỏ qua cũng được)
  • Lựa chọn cách chạy (ở đây mình ghi shell)

Làm đúng các bước trên và hoàn thành được kết quả, vậy là chúng ta setup xong gitlab-runner và kết nối với gitlab trong bài CICD pipeline này

Reload lại trang gitlab vào setting CICD pipeline sẽ thấy có 1 runner trạng thái đang chạy

Nhấn vào biểu tượng edit cấu hình CICD pipeline tiến hành vào chỉnh sửa một chút

  • Dòng đầu tiên chọn để runner nhận chạy công việc
  • Dòng thứ hai chọn để chạy trên các nhánh bảo vệ, phần này sẽ thêm lý thuyết mới đầu bạn cũng chưa cần quan tâm nên có thể bỏ tích chọn
  • Dòng thứ ba như mình có nói ở trên nếu t không tích chọn nó sẽ chạy khi được chỉ định tag chính xác.
  • Dòng thứ tư khóa runner này chỉ chạy trong dự án hiện tại nên chọn, vì các runner có thể được share giữa các dự án nhưng trường hợp này mình chọn tức là không cho dự án khác sử dụng runner này.

 

Mình sẽ tiến hành cài đặt docker và docker-compose như đã hướng dẫn ở trên trong server này (docker sẽ được cài đặt trên cả 3 server)

Tiếp theo mình sẽ setup registry bằng docker

$ mkdir -p /home/docker-app/registry && chmod -R 777 /home/docker-app/registry && cd /home/docker-app/registry tạo thư mục để lưu config triển khai registry và đi tới thư mục đó

$ mkdir certs data tạo 2 thư mục, certs để lưu thông tin key, data để lưu dữ liệu được

$ apt get update

$ apt-get install openssl cài đặt gói của openssl (như đã nói bài viết hướng tới sự “miễn phí” nên mình sử dụng OpenSSL để tạo chứng chỉ SSL/TLS tự ký để registry có thể sử dụng https)

$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -subj "/CN=10.32.4.125" -addext "subjectAltName = DNS:10.32.4.125,IP:10.32.4.125" -x509 -days 365 -out certs/domain.crt

  • Trong đó:
    • req: tùy chọn này chỉ định rằng chúng ta muốn sử dụng tiện ích yêu cầu chứng chỉ của OpenSSL.
    • -x509: Tùy chọn này cho biết chúng ta muốn tạo một chứng chỉ tự ký thay vì tạo yêu cầu ký chứng chỉ (CSR).
    • -newkey rsa:4096: Tùy chọn này tạo ra một khóa RSA mới với độ dài 4096 bit. Đây là một khóa đối xứng, có thể được sử dụng để mã hóa và giải mã thông tin, cũng như ký và xác minh chữ ký số.
    • -nodes: Tùy chọn này chỉ định rằng khóa không được bảo vệ bằng mật khẩu. Nếu không có tùy chọn này, OpenSSL sẽ yêu cầu nhập mật khẩu để bảo vệ khóa riêng tư.
    • -keyout certs/domain.key: Tùy chọn này chỉ định rằng khóa riêng tư sẽ được lưu trữ tệp domain.key trong thư mục certs vừa tạo.
    • -out certs/domain.crt: Tùy chọn này chỉ định rằng chứng chỉ sẽ được lưu trữ tệp domain.crt trong thư mục certs.
    • -days 365: Tùy chọn này chỉ định thời hạn của chứng chỉ là 1 năm (365 ngày).
    • -subj “/CN=10.32.4.125”: Tùy chọn này chỉ định thông tin chủ chứng chỉ, bao gồm tên chính (Common Name – CN) là địa chỉ IP của máy chủ.
    • -addext “subjectAltName = IP:10.32.4.125”: Tùy chọn này thêm một phần mở rộng cho chứng chỉ, chứa địa chỉ IP của máy chủ trong phần Alternative Names. Việc thêm phần mở rộng này giúp tránh tình trạng một số trình duyệt không nhận diện được chứng chỉ nếu chỉ có tên miền trong phần Common Name.
      • Thêm nữa, nếu không có Alternative Names thì khả năng lỗi của bạn rất cao khi một server khác tiến hành xác thực registry của bạn nên bạn hãy làm theo hướng dẫn nhé.
  • Được kết quả tạo thành công chứng chỉ SSL/TLs tự ký (chúng ta có thể config với website để có thể nhận https)

Xem thêm về OpenSSL và https tại:

$ nano docker-compose.yml sau khi tạo xong chứng chỉ tiến hành tạo file docker-compose để chạy registry với nội dung

version: '3'
services:
  registry:
    image: registry:2
    restart: always
    container_name: registry-server
    ports:
      - "5000:5000"
    volumes:
      - ./data:/var/lib/registry
      - ./certs:/certs
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key

$ docker-compose up -d khởi chạy registry

Tiến hành truy cập vào website như đã config trong file docker-compose là https://10.32.4.125:5000

Chấp nhận cảnh báo vì trình duyệt cho biết là đây chứng chỉ tự ký.

Như vậy là mình đã cài đặt thành công registry, đây sẽ là nơi lưu trữ image (dự án đã được đóng gói thành image để sẵn sàng chạy)

Tuy nhiên nếu sử dụng docker login thì vẫn sẽ chưa được vì đây là chứng chỉ tự ký nên server sẽ chặn vì vậy mình phải làm thêm 1 bước là xác thực key, bạn làm theo những bước dưới đây

$ mkdir -p /etc/docker/certs.d/10.32.4.125:5000/ tạo thư mục để lưu trữ xác thực

$ cp /home/docker-app/registry/certs/domain.crt /etc/docker/certs.d/10.32.4.125:5000/ca.crt copy khóa riêng nãy chúng ta tạo vào thư mục vừa tạo

$ systemctl restart docker restart lại docker

$ docker login 10.32.4.125:5000 tiến hành login thử thành công và được kết quả (chú ý ở đây bạn có thể nhập username password bất kỳ hoặc muốn xác thực bạn có thể tìm kiếm cụm từ basic authentication cũng rất dễ dàng mình sẽ nhường bạn làm để tăng khả năng research)

Step 3: Thực hiện cấu hình CICD pipeline trên Gitlab và trong source dự án

Đây chính là bước setup trong dự án để có thể chạy CICD pipeline yêu cầu bạn phải biết về docker và viết yml file.

Tạo Dockerfile cho dự án .NET 6 như dưới đây:

Tiếp theo tiến hành tạo .gitlab-ci.yml file để cấu hình các công việc chạy CICD pipeline chi tiết dưới đây

  • variables: tạo các biến môi trường
  • stages: khai báo các giai đoạn của CICD pipeline ở đây mình có 2 giai đoạn build và deploy
  • build: khai báo gia đoạn build
    • before_script: là khối lệnh này sẽ được thực thi trước khi chạy script là các công việc chính trong giai đoạn đó, ở đây mình tiến hành login vào registry (bạn sẽ biết ngay dưới đây)
    • script: các công việc trong giai đoạn đó, ở đây mình tiến hành các bước như build image, gắn tag image vừa build và tiến hành đẩy lên registry, và mình xóa image mà vừa build đi
  • only: chỉ định đúng là nhánh đó thì job CICD pipeline mới chạy công việc, ở đây mình để là staging
  • deploy: tương tự vậy đây là 1 giai đoạn và giai đoạn này thực hiện như sau: từ server gitlab runner login vào server deploy và từ server deploy tiến hành  login vào registry và pull image về tiến hành chạy container ý lên với port là 8081

 

Bạn có thấy những phần có $ đó không, đó chính là các biến như $REGISTRY_USER, $REGISTRY_PASS,.. và bạn có hỏi nó nằm ở đâu không, chính là đây

Chi tiết như sau:

  • CI_REGISTRY: là registry chúng ta mới cài đặt ở trên tức là server thứ 2 với port 5000 chính là 10.32.4.125:5000
  • REGISTRY_USER: hiện bạn có thể lưu account server thứ 2
  • REGISTRY_PASS: tương tự bạn có thể lưu password server thứ 2
  • SERVER_TESTING: chính là server deploy tức là server thứ 3 mình có đề cập là 10.32.3.180

Để chuyên nghiệp hơn bạn có thể tạo registry với xác thực riêng trong file docker-compose.yml khởi tạo registry có thể tham khảo: set username and password for our own docker private registry

Và trước bước deploy bạn cũng có thể sử dụng một công cụ để quét bảo mật cho image rất được thịnh hành chính là trivy với cách sử dụng vô cùng đơn giản bạn có thể xem ở đây: container image trivy mình ví dụ luôn một vài cú pháp:

  • trivy image [YOUR_IMAGE_NAME]
  • trivy fs .

Step 4: Setup kết nối server deploy với server registry

Để làm được điều đó chúng ta phải tạo một key với người dùng là gitlab-runner của server 2 và tiến hành thêm vào server 3. thao tác tiếp tục tại server 2 như sau:

$ passwd gitlab-runner cài đặt mật khẩu cho gitlab-runner

$ exit tiến hành logout tài khoản hiện tại

$ ssh [email protected] tiến hành login với người dùng là gitlab-runner

$ ssh-keygen -t rsa tạo keygen

$ ssh-copy-id [email protected] copy keygen của tài khoản gitlab-runner sang server thứ 3 (server deploy) nhập password server thứ 3 như dưới đây

Vậy là người dùng gitlab-runner có thể ssh sang server deploy, tiếp tục chúng ta sẽ cấu hình như server 2 vì bản chất chứng chỉ của chúng ta là chứng chỉ tự ký bạn làm theo các bước dưới đây:

$ mkdir -p /home/sshkey/10.32.4.125/ tạo thư mục để lưu key SSL của server 2 (mình tạo ở đây để tường minh sau các bạn có thể sử dụng cho nhiều server khác)

$ scp [email protected]:/home/docker-app/registry/certs/domain.crt /home/sshkey/10.32.4.125/ tiến hành copy .crt file vào thư mục vừa tạo

$ mkdir -p /etc/docker/certs.d/10.32.4.125:5000/ tương tự tạo một thư mục như ở server 2

$ cp /home/sshkey/10.32.4.125/domain.crt /etc/docker/certs.d/10.32.4.125:5000/ca.crt copy file .crt vừa copy từ server 2 vào thư mục vừa tạo trong docker

$ systemctl restart docker restart lại service docker và được kết quả

Như vậy chúng ta đã setup xong giờ chỉ cần push code từ máy bạn lên và tận hưởng

Xem chi tiết job chạy

CICD pipeline chạy thành công

Kiểm tra tại registry đã có image của chúng ta tải lên

Truy cập link dự án vậy đã deploy thành công

Ở đây chúng ta có một cách nữa cũng đơn giản chính là cài đặt cả gitlab-runner ở server thứ 3 rồi lúc đó tương ứng mình sẽ chỉ định tag cho từng server thì cách triển khai này mình sẽ nhường cho bạn làm để bạn hiểu rõ hơn về gitlab ci/cd và bạn có thể tham khảo thêm sample-project/.gitlab-ci.yml

Vậy là qua bài này mình đã setup CICD pipeline cụ thể chi tiết với gitlab runner sử dụng docker để chạy một dự án backend là .NET 6, bạn có thể thực hành luôn và thấy được lợi ích của công việc này khá thú vị. Nếu bạn muốn tìm hiểu về DevOps thì có thể theo dõi website của mình, mình luôn hướng tới sự chi tiết, đơn giản, 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]