Sử dụng miễn phí Shared Runners CI/CD của Gitlab

Sử dụng miễn phí Shared Runners CI/CD của Gitlab

Tin ngắn hàng ngày dành cho bạn
  • Cuối tuần đang ngồi làm cái Cửa hàng cho thư giãn mọi người ạ. Trước mình đã làm một lần rồi cơ mà làm cho có, bán được hẳn 1 cuốn sách 😆

    Giờ làm lại, sẽ đa dạng sản phẩm hơn. Dự là đăng mấy sản phẩm đã mua và dùng rồi kèm theo vài dòng nhận xét cho mọi người tham khảo 🤓

    » Xem thêm
  • Một bài viết thú vị về cách làm thế nào để viết blog cho lập trình viên đọc.

    How to Write Blog Posts that Developers Read

    Tóm tắt lại là đi thẳng vào vấn đề và hình dung ra đối tượng độc giả mà bạn đang nhắm đến. Một điều nữa là tác giả đã có hơn 9 năm kinh nghiệm viết, thời gian đầu không ai đọc nhưng sự kiên trì đã giúp anh đạt được mốc 300K - 500K độc giả mỗi năm. Quả là con số ấn tượng phải không ạ 🔥

    » Xem thêm
  • Bây giờ hiện đại quá cái gì người ta cũng có thể nghĩ ra được. ferretdb.com là một dự án mã nguồn mở, biến cơ sở dữ liệu PostgreSQL thành... MongoDB. Đúng vậy bạn không nghe nhầm đâu. Nếu vẫn muốn dùng Postgres mà thích cú pháp truy vấn của Mongo thì ferretdb là dành cho bạn.

    À ngoài PostgreSQL ra thì còn có thể cắm vào SQLite nữa. Xịn!!! 🙏

    » Xem thêm

Vấn đề

CI/CD bao gồm CI (Continuous Integration) và CD (Continuous Delivery) là quá trình tích hợp (integration) thường xuyên, nhanh chóng khi phát hành phiên bản mới (delivery). CI/CD giúp cho quá trình từ viết mã đến khi triển khai ứng dụng lên máy chủ trở nên nhanh và tự động hơn.

Thông thường chúng ta trải qua các bước viết mã -> test (unit test) -> commit code -> build -> deploy... Nhưng nếu tích hợp CI/CD có thể tự động được rất nhiều bước trong viết mã -> deploy.

CI/CD được hỗ trợ trong các nền tảng quản lý mã như Gitlab, Github... và được kích hoạt qua các sự kiện như commit code. Để sử dụng được CI/CD cần phải thiết lập các Runners kết nối đến tài khoản. Các Runners đóng vai trò cho việc xử lý mã và logic ứng dụng của bạn.

Trong phạm vi bài viết này tôi sẽ nói về cách sử dụng Shared Runner của Gitlab.

Gitlab Shared Runner

Nếu dùng Gitlab để quản lý mã thì bạn có thể sử dụng các Shared Runners với thời gian miễn phí lên đến 400 phút cho dự án Private và không giới hạn với dự án Public cộng đồng.

Nghe có vẻ không nhiều nhưng với các dự án cá nhân mà tiết kiệm chi phí đồng thời lại có thể tích hợp CI/CD thì quả là đáng để sử dụng. Blog của tôi đang dùng cách này để triển khai tự động cho môi trường Development.

Để kích hoạt Shared runner các bạn vào Project > Settings > CI/CD và tích vào Enable shared runners for this project.

Bật gitlab shared runners

Ở bên dưới mục Available shared runners là số lượng các Shared runners mà Gitlab cung cấp cùng với trạng trái của chúng. Hãy để ý vào các "label" bên dưới mỗi Runner, chúng ta sẽ cần nó để chỉ định Runner cần thiết cho mục đích sử dụng của mỗi stage.

gitlab runner

Cách sử dụng

.gitlab-ci.yml là tệp yml để kích hoạt CI/CD của Gitlab. Trong này chứa cấu hình và chỉ dẫn để chúng ta xử lý quá trình tự động hoá.

Trang blog 2coffee sử dụng Docker để build và đẩy image lên Gitlab registry, sau đó gửi một HTTP request đến server để cập nhật lại service tạo ra một quy trình CI/CD hoàn chỉnh.

Tôi chia thành 2 stage: build/push image và HTTP request:

stages:
  - build
  - curl-docker-ci

Ở stage build sẽ dùng Runner hỗ trợ Docker nên tôi xác định tags là docker. Các tham số như thông tin đăng nhập/mật khẩu của registry được truyền vào thông qua Variable là biến được thiết lập thông qua Gitlab. Thay vì chỉ dẫn các bước build & push image trực tiếp trong yml, tôi đã tạo một tệp có tên là build-dev.sh bên trong có chứa các câu lệnh bash để build & push image.

Cuối dùng vì tôi chỉ muốn thiết lập CI/CD cho môi trường Development nên tôi xác định CI chỉ được chạy khi commit code lên nhánh develop.

docker-build:
  stage: build
  image: docker:20.10.9
  tags:
    - docker
  services:
    - docker:dind
  before_script:
    - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
  script:
    - if [ "$CI_COMMIT_REF_NAME" = "develop" ]; then
      ./build/bin/build-dev.sh;
      fi
  only:
    - develop

Với nội dung của build-dev.sh đơn giản như:

#!/bin/sh -e

IMAGE=registry.gitlab.com/2coffee/page
VERSION=dev

name=${IMAGE}:${VERSION}

docker build -t ${name} -f ./Dockerfile .

docker push ${name}

Ở bước tiếp theo tôi cũng cho chạy một tệp curl-docker-ci.sh chứa lệnh CURL một HTTP request đến máy chủ để cập nhật lại service. Bởi vì lệnh bash này chỉ cần môi trường linux để chạy nên tôi xác định tags là linux.

curl-docker-ci:
  stage: curl-docker-ci
  tags:
    - linux
  script:
    - ./build/bin/curl-docker-ci.sh
  only:
    - develop

curl-docker-ci.sh đơn giả chỉ chứa một lệnh curl:

#!/bin/sh -e

curl --location --request POST $DOCKER_CI_ENDPOINT \
--header "Authorization: Basic $DOCKER_CI_BASIC_AUTH" \
--header 'Content-Type: application/json' \
--data '{"name": "'$DOCKER_CI_SERVICE_NAME'"}'

Ghép lại tôi sẽ có một file .gitlab-ci.yml hoàn chỉnh như sau:

stages:
  - build
  - curl-docker-ci

docker-build:
  stage: build
  image: docker:20.10.9
  tags:
    - docker
  services:
    - docker:dind
  before_script:
    - echo "$DOCKER_REGISTRY_PASS" | docker login $DOCKER_REGISTRY --username $DOCKER_REGISTRY_USER --password-stdin
  script:
    - if [ "$CI_COMMIT_REF_NAME" = "develop" ]; then
      ./build/bin/build-dev.sh;
      fi
  only:
    - develop

curl-docker-ci:
  stage: curl-docker-ci
  tags:
    - linux
  script:
    - ./build/bin/curl-docker-ci.sh
  only:
    - develop

Bây giờ hãy thử commit code lên nhánh develop rồi vào Project > CI/CD > Pipelines xem CI đã được kích hoạt chưa nhé.

shared runner running

Tổng kết

CI/CD là quá trình tích hợp thường xuyên và nhanh chóng khi phát hành phiên bản mới. Nhờ có CI/CD mà có thể tự động được nhiều khâu từ lúc viết mã đến lúc triển khai ứng dụng trên máy chủ.

Nếu sử dụng Gitlab để quản lý mã chúng ta có thể sử dụng miễn phí lên đến 400 phút CI/CD. Một con số không nhiều tuy nhiên bạn hoàn toàn có thể đăng kí một Runners để gỡ bỏ giới hạn.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (3)

Nội dung bình luận...
Avatar
Thành Đỗ2 năm trước
Cho mình xin cách dùng curl để update service với ad
Trả lời
Avatar
Thành Đỗ2 năm trước
Cảm ơn ạ        
Avatar
Xuân Hoài Tống2 năm trước
À mình viết một rest service bằng docker sdk để chọc vào docker mà update service thôi đó bạn
Avatar
Hương Trịnh2 năm trước
Không đăng nhập được bằng github ad ơi
Trả lời
Avatar
Xuân Hoài Tống2 năm trước
Ok bạn mình kiểm tra lại ạ
Avatar
Tùng Nguyễn2 năm trước
Bạn có bài viết nào nói về ci cd không
Trả lời
Avatar
Xuân Hoài Tống2 năm trước
Chào bạn, hiện chưa có ạ