Contents
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:

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.

Để 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 engines và scripts 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.

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

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.

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.

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.

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.

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

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

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

Bài viết này được sưu tầm và tổng hợp từ nhiều nguồn trên Internet.
Nếu có gì không hiểu thì inbox messenger bên dưới mình hỗ trợ thêm nhé.