Thiết lập CI/CD pipeline để tự động build và deploy Angular App lên Firebase từ GitHub

Thiết lập CI/CD pipeline để tự động build và deploy Angular App lên Firebase từ GitHub

{tocify} $title={Table of Content}

Giới thiệu

  • CI/CD (Continuous Integration/Continuous Delivery) - Tích hợp liện tục / Phân phối liên tục.
  • CI/CD Pipeline cho phép chúng ta tự động hóa phần lớn quy trình build và deploy code, giúp quá trình này nhanh hơn và an toàn hơn.
  • Phần CI bao gồm việc tự động hóa xây dựng, đóng gói và thử nghiệm các ứng dụng của chúng ta. Đối với hầu hết các phần, điều này được tự động hóa bởi Angular. Và, khi chúng ta đã viết các bài kiểm tra đơn vị của mình, chúng cũng dễ dàng được tích hợp vào quy trình.
  • Phần CD là phần phân phối tự động cho ứng dụng của chúng ta. Trong trường hợp ở đây là việc deploy lên Firebase.
  • Trong bài này, chúng ta sẽ tự động hóa CI/CD Pipeline bằng GitHub Action. Có nghĩa là mỗi khi chúng ta thực thi lệnh git push origin master GitHub sẽ tự động khởi động quá trình build, đóng gói, test và deploy. Chúng ta sẽ bao gồm:

> Deployment Setup
  - Writing Our Deployment (YAML)
  - Secret Keys (With GitHub)

Chuẩn bị

  • Đầu tiên bạn cần có một ứng dụng Angular đã được deploy lên Firebase Hosting theo cách thủ công bằng firebase deploy - nếu bạn chưa thực hiện việc này, hãy làm theo hướng dẫn này.
  • Đã cài đặt firebase-tools (npm i -g firebase-tools)

Thực hiện

Tạo và lưu Firebase Token

GitHub yêu cầu FIREBASE_TOKEN để có thể triển khai ứng dụng Angular lên Firebase. Tạo token cho firebase ci:
  • Install npm i -g firebase-tools
  • Chạy lệnh firebase login:ci - Lệnh này trả về 1 token để sử dụng cho CI server
Sau khi done, bạn sẽ thấy kết quả như sau:
Waiting for authentication...

✔ Success! Use this token to login on a CI server:

1/A29..............y

Example: firebase deploy --token "\$FIREBASE_TOKEN"
Mở repo github, Settings > Secrets , sau đó click New repository secret và copy token vừa tạo (1/A29..............y) paste vào phần Value.

Tạo thư mục GitHub Actions

Cách 1: Tạo workflow bằng command line dưới local và push lên GitHub

  • Thư mục GitHub Actions là nơi lưu trữ các file YAML cho các quy trình CI/CD.

YAML là ngôn ngữ tuần tự hóa dữ liệu (Data Serialization Language), biểu diễn dữ liệu dưới dạng text giúp con người dễ đọc hiểu, tương tự như JSON và XML. Nó sử dụng định dạng thụt đầu dòng (giống python) để xác định cấu trúc. File YAML lưu với phần mở rộng .yml hoặc .yaml, các file này được sử dụng để làm file cấu hình cho nhiều ứng dụng như Docker, PHP,...

  • Tạo thư mục .github trong thư mục gốc của project:

cd project-name
mkdir .github
cd .github
mkdir workflows
touch workflows/main.yml
// Các lệnh trên sẽ tạo ra: .github/workflows/main.yml

Thư mục .github/workflows khi được đẩy lên GitHub sẽ được GitHub đọc và sử dụng làm thư mục GitHub Action.

Cách 2: Tạo workflow trên GitHub

Tại repo github của bạn, chọn tab Actions và nhấp vào link Set up a workflow yourself để tạo workflow đầu tiên.


Bạn sẽ thấy rất nhiều mẫu sample action có sẵn. Chọn 1 cái và đổi lại tên thành main.yml và nội dung của file main.yaml như sau:
name: CI - Build and Deploy to Firebase

on:
  push:
    branches:
    - master
    - release/*

jobs:
  firebase-deploy:

    runs-on: ubuntu-latest

    steps:
     - uses: actions/checkout@master
     - uses: actions/setup-node@master
       with:
        node-version: '10.x'
     - run: npm install
     - run: npm run build --prod
     - uses: w9jds/firebase-action@master
       with:
         args: deploy --only hosting
       env:
         FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

Click vào Start commit để ở phía bên phải để commit new workflow của bạn. Vậy là xong phần thực hiện rồi đó.

Phân tích file main.yml

name

name: CI - Build and Deploy to Firebase

Dùng để đặt tên cho các phần khác nhau trong code của chúng ta (Optional)

Customize workflow trigger

on:
  push:
    branches:
    - master
    - release/*

Phần này là định nghĩa xem khi nào workflow sẽ hoạt động, ở đây nó sẽ chỉ trigger vào workflow khi có hành động push vào branch master hoặc release/. Bạn có thể thay đổi tùy theo yêu cầu của dự án nhé.

Customize job name

jobs:
  firebase-deploy:

Tên của job sẽ chạy, hiện tại là firebase-deploy. Bạn có thể thay đổi tùy ý sao cho dễ hiểu.

runs-on: ubuntu-latest

Chúng ta thực thi mọi thứ trên máy Ubuntu mới nhất ubuntu-latest.

Customize steps

steps:

Phần này sẽ khai bao của bước sẽ được thực hiện tuần tự khi workflow được kích hoạt.

Với mỗi step chúng ta có thể thêm khai báo name để chú thích rõ mục đích của step đó:

- name: Checkout
  uses: actions/checkout@master
- name: Initialize Node
  uses: actions/setup-node@master
- name: Install Dependencies
  run: npm install
- uses: actions/checkout@master

Lệnh này tương đương với: git checkout master. Để chỉ ra rằng, workflow sẽ được thực thi trên nhánh master.

- uses: actions/setup-node@master
       with:
        node-version: '10.x'

Cài đặt Node.js với version 10.x để chúng ta có thể sử dụng npm trong các bước sau.

- run: npm install

Chạy lệnh npm install để cài đặt các packages và dependencies trong file package.json.

- run: npm run build --prod

Chúng ta chạy lệnh này để biên dịch ứng dụng, npm run build sẽ được dịch thành ng build.

Giống như chúng ta đã làm với ng build - chúng ta thêm --prod vào npm run build để build cho môi trường production.

Trước khi chạy lệnh build, chúng ta có thêm thêm bước Testing như sau:

- name: Install Dependencies
   run: npm install
- name: Testing
   run: npm test
- name: Build
   run: npm run build --prod

Deploy to Firebase

- uses: w9jds/firebase-action@master
       with:
         args: deploy --only hosting
       env:
         FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

Chúng ta triển khai ứng dụng bằng cách sử dụng w9jds/firebase-action@master với 2 tham số deploy --only hosting (chỉ deploy cho Firebase Hosting) và FIREBASE_TOKEN (mã bảo mật Firebase của chúng ta) dùng để xác thực tài khoản Firebase - token này được lưu trữ trong repo của chúng ta.

  • ${{ secrets.FIREBASE_TOKEN }} cho phép chúng ta truy cập giá trị của FIREBASE_TOKEN từ Secrets của GitHub mà không cần lưu trực tiếp vào các file trong repo của chúng ta.

Test

Sau khi đã thiết lập thành công, bạn hãy thực hiện push một vài code thay đổi lên nhánh master hoặc release/* và kiểm tra. Bạn sẽ thấy code mới được deploy tự động lên Firebase Hosting. Bạn cũng có thể kiểm tra các lần CI chạy, các step trên github nữa.

Reference

Đăng nhận xét

Mới hơn Cũ hơn