CÁCH TẠO CI/CD SỬ DỤNG GITLAB RUNNER VỚI NODEJS TRÊN EC2 INSTANCE

CÁCH TẠO CI/CD SỬ DỤNG GITLAB RUNNER VỚI NODEJS TRÊN EC2 INSTANCE

Giới thiệu

CI/CD là gì

Continuous Integration (Tích hợp liên tục) là quá trình tự động build, chạy unit test khi source code được thay đổi trên Hệ thống quản lý phiên bản (Version Control – Git). Mục tiêu của CI là nhanh chóng đảm bảo thay đổi từ developer là “tốt” và phù hợp để sử dụng tiếp trong source code.

Continuous Delivery  (Phân phối liên tục) là một bước tiến của Continuous Integration. Ứng dụng không chỉ được build và test ở mỗi lần thay đổi code trên Version Control, mà Continuous Delivery còn đảm bảo ứng dụng có thể được deploy một cách đáng tin cậy vào bất cứ lúc nào. Tuy nhiên , việc deploy lên môi trường release cần phải thực hiện bằng tay.

Continuous Deployment  (Triển khai liên tục) cũng là một bước tiến của Continuous Integration, tương tự như Continuous Delivery. Tuy nhiên, khác với Continuous Delivery, thay vì deploy bằng tay lên môi trường release thì Continuous Deployment có thể thực hiện deploy tự động và user có thể sử dụng source mới nhất ngay lập tức.

GitLab Runner

GitLab Runner là dự án mã nguồn mở được sử dụng để chạy các job (build, test hoặc deploy,…) và gửi kết quả trở lại GitLab. Một Runner có thể là một máy ảo, một VPS, một Docker container hoặc thậm chí là 1 cụm các Docker container. Nó được sử dụng cùng với GitLab CI / CD, dịch vụ tích hợp liên tục mã nguồn mở đi kèm với GitLab để điều phối các job. GitLab và Runners giao tiếp với nhau thông qua API.

Phân loại Runners:

  • Shared Runners: là các runner được cung cấp bởi GitLab.
  • Specific Runners: là các runner do người dùng tự tạo sử dụng cho 1 GitLab project nào đó.
  • Group Runners: là các runner do người dùng tự tạo sử dụng cho 1 GitLab group bao gồm nhiều project.

Lựa chọn Executor:

GitLab Runner triển khai một số trình thực thi (Executor) để phục vụ cho nhiều mục đích khác nhau. Các loại Executor mà Gitlab Runner cung cấp:

  • SSH
  • Shell
  • Parallels
  • VirtualBox
  • Docker
  • Docker Machine (auto-scaling)
  • Kubernetes
  • Custom

Tuy nhiên trong khuôn khổ bài viết chúng ta sử dụng 2 Executor:

  • Executor Docker cho Test job. Để tiết kiệm tài nguyên cho server, ở Test job chúng ta sẽ sử dụng Shared Runner được cung cấp bởi Gitlab.
  • Executor Shell cho Deploy job. Chúng ta sẽ sử dụng Executor này để chạy command trực tiếp trên server của chúng ta.

Để biết thêm về các loại Executor khác và cách dùng của từng loại mọi người có thể tham khảo tại link sau: https://docs.gitlab.com/runner/executors/README.html

Cấu trúc triển khai

 

Khi push code lên GitLab nhánh develop thì GitLab sẽ tạo Pipeline (tiến trình) gồm 2 Stage (giai đoạn) Test và Deploy. Do ở đây chúng ta triển khai ứng dụng NodeJS nên chỉ cần 2 stage, đối với ứng dụng Typescript thì có thể phải cần thêm stage Build.

Ở stage Test sẽ gồm job Test, ở đây như đã nói tại phần Executor chúng ta sẽ dùng GitLab Shared Runner (với Executor Docker) được cung cấp bởi GitLab để tiết kiệm tài nguyên cho server. Khi job Test chạy thành công và không có bất kì lỗi nào thì GitLab mới chuyển sang stage tiếp theo là stage Deploy.

Ở stage Deploy sẽ gồm job Deploy, ở đây chúng ta sẽ dùng GitLab Runner (với Executor Shell) được cài đặt trên EC2 instance chung với Webserver. Nhiệm vụ của Runner này là phát hiện những thay đổi trong source code và copy những thay đổi đó vào Project folder, sau đó khởi động lại NodeJS service.

Để config các stage cũng như job chúng ta cần tạo file .gitlab-ci.yml và push lên GitLab chung với source code.

Note: Để trao đổi file giữa các stage chúng ta có thể lưu file vào GitLab Shared Storage. Thông thường chúng ta sẽ lưu libraries /node_modules vào Cache và đối với Typescript các file sinh ra từ quá trình build .ts sang .js sẽ lưu vào Artifacts (ở đây chúng ta dùng NodeJS nên sẽ không cần đến Artifacts).

Các bước tiến hành

Cài đặt server

Đầu tiên chúng ta tạo mới 1 EC2 instance chạy hệ điều hành Amazon Linux AMI. Mở port 3000 (port để truy cập NodeJS Sever từ trình duyệt). Sau đó dùng PuTTY để truy cập vào server.

Cài đặt GitLab Runner bằng lệnh sau:

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

Cài đặt NodeJS:

$ sudo yum install -y gcc-c++ make

$ curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash –

$ sudo yum install -y nodejs

Cài đặt forever package (dùng để chạy ngầm project NodeJS):

$ sudo npm install forever -g

Tạo thư mục cho project:

$ sudo mkdir -p /var/www/project-ci

Set quyền để gitlab-runner có thể đọc ghi và thực thi trong thư mục project:

$ sudo setfacl -m user:gitlab-runner:rwx /var/www/project-ci

 

Tạo GitLab repository và NodeJS demo project

Chúng ta tạo 1 GitLab repository mới sau đó clone về máy.

Thêm các file sau vào thư mục đã clone:

package.json

{
  "name": "project-ci",
  "version": "1.0.0",
  "description": "project to research Gitlab Runner",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Test OK\" && exit 0",
    "start": "node index.js"
  },
  "keywords": [],
  "author": "nghia.nt",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

index.js

const express = require('express');
const app = express();
const port = process.env.NODE_PORT || 3000;
app.get('/', function (req, res) {
  res.send('Hello World From Briswell Vietnam!');
});
app.listen(port, function () {
  console.log('Listening on port ' + port);
});

 

.gitignore

node_modules/
iisnode/
npm-debug.log*
.vscode/
.idea/
.env*
**/*.log
dist/

 

Sau đó push 3 file trên lên GitLab nhánh develop.

Đăng ký GitLab Runner với GitLab

Truy cập vào GitLab Project mục Settings > CI / CD. Ở phần Runners mục Set up a specific Runner manually chúng ta cần note lại 2 thông tin URL và Token.

 

Trở lại PuTTY chúng ta chạy command sau để đăng ký GitLab Runner:

$ sudo gitlab-runner register

Sau khi chạy command trên, trình wizard sẽ yêu cầu nhập thông tin URL và Token đã lấy ở trên:

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
k753PaGiosBxxxxxxx
Please enter the gitlab-ci description for this runner:
my-shell-runner
Please enter the gitlab-ci tags for this runner (comma separated):
my-shell-runner
Registering runner... succeeded                     runner=ajgHxcNz
Please enter the executor: virtualbox, docker+machine, kubernetes, docker, shell, ssh, docker-ssh+machine, docker-ssh, parallels:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

 

Sau khi đăng ký xong chúng ta trở lại trang Settings của GitLab để kiểm tra. Nếu xuất hiện thông tin Runner như hình là chúng ta đã đăng ký thành công.

Config stage, job cho GitLab Project

Trong source code của project tạo mới file .gitlab-ci.yml với nội dung sau:

# We have 2 stage Test and Deploy
stages:
  - test
  - deploy

# Config cache
cache:
  paths:
    - node_modules/

# Test job
test:
  # Docker image
  image: node:latest
  # Attach Test job to Test stage
  stage: test
  # Config to use GitLab Shared Runner with Executor Docker
  tags:
    - docker
  script:
    - npm install
    - npm run test
  # Defines the names of branches and tags the job runs for
  only:
    - develop

# Deploy job
deploy:
  type: deploy
  # Attach Deploy job to Deploy stage
  stage: deploy
  # Config to use our Runner with Executor Shell
  tags:
    - my-shell-runner
  script:
    # Only copy changed files to project folder
    - cp -r -u * $PROJECT_DIR
    - cd $PROJECT_DIR
    - npm install
    # Restart NodeJS service
    - forever stop index.js || true
    - forever start index.js
  only:
    - develop

 

Sau đó push file trên lên GitLab nhánh develop.

Bây giờ chúng ta phải thiết lập Environment variables. Trên trang GitLab, truy cập Settings > CI / CD > Variables sau đó nhấp vào Add Variable. Đừng quên bỏ chọn mục Protect variable.

Trên trang GitLab chúng ta truy cập vào CI / CD > Pipelines để kiểm tra.

Bây giờ từ trình duyệt web truy cập vào server với port 3000

Vậy là chúng ta đã deploy NodeJS project thành công lên EC2 instance tích hợp CI/CD sử dụng GitLab Runner rồi đó!

Nguồn tham khảo

https://opensource.com/article/18/8/what-cicd

https://docs.gitlab.com/ee/ci/quick_start/

https://docs.gitlab.com/runner/