Deploy App NodeJS với GitLab CI/CD

Xu hướng CI/CD giúp cung cấp các framework, workflow giúp tiết kiệm thời gian, nguồn lực trong quá trình release (delivery). Chúng ta cùng tìm hiểu qua bài viết ngay nào :D


1036
1.4k shares, 1036 points

Project GitLab

Trước khi làm bất cứ điều gì, chúng ta phải tạo một dự án GitLab:

nodejs gitlab
GitLab Project Dashboard

Bạn có thể tạo một dự án bằng cách nhấp vào nút New project. Tài liệu GitLab minh họa chính xác cách tạo project. Dưới đây là ví dụ về việc tạo một repo GitLab. Bạncần thay thế URL repo bằng URL repo dự án của bạn.

$ git clone git@gitlab.com:seulkiro/node-heroku-dpl.git
Cloning into 'node-heroku-dpl'...
warning: You appear to have cloned an empty repository.
$ cd node-heroku-dpl

Bây giờ, chúng ta thêm README và .gitignore vào project.

$ touch README
$ touch .gitignore
$ git add .
$ git commit -m "Initial commit"
[master (root-commit) db56d33] Initial commit
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 README
$ git push -u origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 228 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitlab.com:seulkiro/node-heroku-dpl.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

App Express NodeJS

Sau khi đã tạp project, điều tếp theo là tạo app NodeJS. Tôi sẽ tạo app Express để làm ví dụ cho bài viết này.

Tạo một dự án hoàn toàn mới và cài đặt express.

$ npm init -y
$ npm install --save express

Nó sẽ hỏi một loạt các câu hỏi để thiết lập dự án nếu thiếu flag -y. Để sử dụng mặc định, ta sẽ thêm -y. Bạn có thể thay đổi các tùy chọn này sau bằng cách sửa đổi trong file package.json.

Bây giờ, tạo entry point của ứng dụng bằng cách thêm các đoạn code bên dưới vào index.js trong thư mục gốc của dự án.

const express = require("express");
const app = express();
app.get("/", (req, res) => {
  res.send({ hello: "world" });
});
const PORT = process.env.PORT || 5000;
app.listen(PORT, function() {
  console.log(`App listening on port ${PORT}`);
});

Trên đây là một ứng dụng NodeJS siêu đơn giản với route đáp ứng yêu cầu GET với một đối tượng JSON.

Hãy chạy thử ứng dụng và xem cách nó hoạt động tại localhost

$ node index.js
App listening on port 5000

Mở trình duyệt và truy cập http://localhost:5000/. Bạn sẽ thấy object JSON hello world xuất hiện.

{
  hello: "world"
}

Setup App Heroku

Bây giờ, chúng ta tạo một app Heroku. Đây sẽ là app vaf môi trường mà chúng ta sẽ triển khai ứng dụng NodeJS của mình với GitLab CI / CD.

nodejs gitlab
Heroku Dashboard

Để tạo rất đơn giản chỉ cần nhấn Create new app tại dashboard của Heroku. Bạn chỉ cần điền tên app. Nó sẽ được sử dụng trong file config GitLab CI / CD để chỉ định app Heroku bạn muốn triển khai.

Lưu ý : Trước khi thiết lập GitLab CI / CD. Chúng ta cần chỉnh phiên bản NodeJS và NPM nào sẽ sử dụng khi app NodeJS được triển khai.

Chúng ta có thể làm điều này bằng cách sửa đổi tệp package.json. Bằng cách thêm các phần enginesscripts giống như bên dưới.

...
"engines": {
  "node": "8.1.1",
  "npm": "5.0.3"
},
"scripts": {
 "start": "node index.js"
},
...

Engines cho Heroku biết rằng các phiên bản cụ thể của Node và NPM sử dụng cho ứng dụng. Vì Heroku sử dụng NPM để khởi động ứng dụng. Vì vậy, start cần phải được thêm trong scripts. Sửa đổi phần scripts mặc định thành npm start .

Sau khi thay đổi, bạn có thể chạy ứng dụng bằng lệnh sau.

$ npm start
> node-heroku-dpl@1.0.0 start /Users/seulkiro/dev/node-heroku-dpl
> node index.js
App listening on port 5000

File Config GitLab CI/CD

Chúng ta cần tạo file config GitLab CI / CD trong thư mục gốc của project, GitLab sử dụng nó để quản lý các công việc như CI / CD, ví dụ: test, deploying(triển khai) hoặc environment product(môi trường sản phẩm).

Chỉnh .gitlab-ci.yml như sau:

image: node:latest
stages:
  - production
production:
  type: deploy
  stage: production
  image: ruby:latest
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl --provider=heroku --app=node-heroku-dpl --api-key=$HEROKU_API_KEY
  only:
    - master

Về cơ bản, file YAML yêu cầu GitLab sử dụng trình chạy docker NodeJS để deploy app Heroku mỗi lần code được push. Và shell script được xác định theo script sẽ được thực thi bởi người push.

Lưu ý đoạn script shell cuối cùng. Nó sử dụng dpl, công cụ deploy liên tục, để deploy app lên Heroku.

Cuối cùng, tùy chọn api-key đặt khóa API Heroku. Việc đưa trực tiếp key API vào file không phải là một cách tốt. Để bảo vệ trên Gitlab chúng ta cần làm như sau:

Vào project GitLab của bạn. Tiếp tục vào Settings > CI/CD > Secret Variables, và đây là nơi bạn có thể lưu trữ Heroku API KEY hoặc bất kỳ biến môi trường nào khác. Các biến này có thể được truy cập bằng $ENVIRONMENT_VARIABLE trong tệp YAML, tức là .gitlab-ci.yml.

nodejs gitlab
Setting HEROKU_API_KEY Environment Variable for Runner

Nhân tiện, key API Heroku được tìm thấy trong cài đặt tài khoản.

Heroku API Key under Account Settings

Deploy Heroku

Trước khi chúng ta tạo app NodeJS và cài đặt Express, nó đã cài đặt một loạt các module liên quan trong thư mục node_modules. Để không push chúng lên repo. Chúng ta có thể bỏ qua chúng bằng cách thêm vào tập tin .gitignore.

$ echo node_modules > .gitignore

Ngoài ra, để làm cho CI / CD xảy ra khi push, shared runners phải được bật trong cài đặt project, Settings > CI/CD > Runners settings, trừ khi bạn có kế hoạch sử dụng riêng bạn.

nodejs gitlab
Ensuring that shared runners are enabled

Hãy commit và push tất cả lên Gitlab

$ git add .
$ git commit -a -m "Initial app deploying to Heroku"
[master 808c82c] Initial app deploying to Heroku
 5 files changed, 417 insertions(+)
 create mode 100644 .gitlab-ci.yml
 create mode 100644 index.js
 create mode 100644 package-lock.json
 create mode 100644 package.json
$ git push
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 4.59 KiB | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
To gitlab.com:seulkiro/node-heroku-dpl.git
   db56d33..808c82c  master -> master

Validation

Việc push sẽ khởi động deploy Heroku. Tổng quan về project GitLab sẽ chỉ ra rằng đang được deploy với biểu tượng tạm dừng màu cam.

Project Overview with an Active Deployment

Nhấp vào nút tạm dừng màu cam sẽ đưa bạn đến pipeline(đường ống). Bạn sẽ có thể xem các log.

Deployment Log

Deploy sẽ thành công ngay sau đó. Lưu ý rằng shared runners có thể không được deploy nếu nó không có sẵn.

Happy Deployment

Bây giờ, hãy kiểm tra dashboard Heroku. App đã được triển khai.

Heroku Dashboard

Bạn sẽ có thể mở ứng dụng bằng cách nhấp vào nút Open app .

App in Production!

Conclusion

GitLab CI / CD rất dễ cài đặt và hữu ích cho việc triển khai các thay đổi của bạn với các môi trường khác nhau như : ở dưới local, hoặc product.

Though I didn’t talk about testing in this post, it would be another great thing about CI/CD because you can test your changes before any deployment. Failure would stop the deployment flow entirely, and you would get notified for it too!

Mặc dù tôi đã không nói về việc test trong bài viết này, nhưng đây sẽ là một điều tuyệt vời khác về CI / CD vì bạn có thể kiểm tra các thay đổi của mình trước khi deploy. Khi thất bại nó sẽ dừng hoàn toàn luồng triển khai và thông báo cho bạn.

Tham khảo thêm về:

Test tại đây: Unit test là gì – Jest testing NodeJS cho người mới bắt đầu

Về NodeJS: Tối ưu bảo mật app NodeJS tốt hơn


Like it? Share with your friends!

1036
1.4k shares, 1036 points

What's Your Reaction?

hate hate
667
hate
confused confused
2665
confused
fail fail
1666
fail
fun fun
1332
fun
geeky geeky
999
geeky
love love
3330
love
lol lol
333
lol
omg omg
2664
omg
win win
1665
win