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
  • Vừa gia hạn tên miền cho 2coffee.dev. Vậy là em nó đã 3 tuổi rồi đó mọi người. Sẵn đây nói luôn...

    Mọi người chắc cũng biết về ý nghĩa của cái tên rồi đúng không. Ấy thế mà nó lại đang dính vào "lời nguyền cà phê" bởi vì tên miền có chứa từ khoá "coffee" rất "hot", làm nhiều người hoặc công cụ tìm kiếm đánh giá sai lệch về nội dung của trang web 🥲. Nhiều lúc mình muốn tìm cách để "khai tử" cái tên này đi, thay bằng tên khác thì con đường bớt chông gai hơn.

    Tiền thân của 2coffee.dev là estacks.icu, ấy thế mà sao lại bỏ được cái tên cũ không chút đắn đo? Là vì 2coffee.dev đánh dấu sự trưởng thành trong tư duy làm sản phẩm của mình, ý là nghiêm túc hơn á. Còn stacks.icu vẫn mãi mãi là tiền thân của "Xin chào, một tách cà phê dành cho mấy ông lập trình viên đây".

    » Xem thêm
  • Privacy Guides là một dự án phi lợi nhuận nhằm cung cấp cho người dùng các hiểu biết về quyền riêng tư, đồng thời khuyến nghị những phương pháp hay công cụ để giúp đòi lại quyền riêng tư trong thế giới Internet.

    Có nhiều bài viết hay tại đây, mình lấy ví dụ 3 khái niệm hay nhầm lẫn hoặc bị đánh tráo là Quyền riêng tư (privacy), Bảo mật (security) và Ẩn danh (anonymity). Trong khi nhiều người phản đối quyền riêng tư cho rằng một người không cần quyền riêng tư nếu họ "không có gì để che giấu". "Đây là một quan niệm sai lầm nguy hiểm, vì nó tạo ra cảm giác rằng những người đòi hỏi quyền riêng tư phải là những kẻ lệch lạc, tội phạm hoặc sai trái." - Why Privacy Matters.

    » Xem thêm
  • Có một nơi rất tuyệt vời để học hoặc đang kẹt trong suy nghĩ không còn gì để học nữa thì phần bình luận ở bển Hacker News là thứ dành cho bạn.

    Y Combinator - Công ty đứng sau Hacker News tập trung vào các khoản đầu tư mạo hiểm cho các Startup tại Thung lũng Silicon, nên không ngạc nhiên khi có rất nhiều bộ óc thiên tài bình luận dạo ở trên đây. Nhưng cái dạo của họ cũng đủ cung cấp từ khoá mở ra cho chúng ta nhiều điều mới.

    Không tin ư? Chỉ cần lướt một tí, bấm bài viết nào phù hợp với thị hiếu của bạn, xem bình luận và nhớ thêm một cốc cà phê bên cạnh nhé ☕️

    » 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ó ạ