0

🚀 Chapter 3 — Scale: Phần A — Multiple Pipelines

Online Boutique hiện có 11 microservices, trong đó frontend là service cung cấp web UI, còn cartservice, checkoutservice, productcatalogservice, paymentservice... đảm nhiệm các chức năng phía sau.

Ở chapter này sẽ chỉ làm mẫu với 4 service:

Service Vai trò Có thể kiểm tra bằng UI
frontend Web UI ⭐⭐⭐⭐⭐
productcatalogservice Danh sách/sản phẩm ⭐⭐⭐⭐⭐
cartservice Giỏ hàng ⭐⭐⭐⭐⭐
checkoutservice Checkout ⭐⭐⭐⭐⭐

Nhưng có một điểm quan trọng: Online Boutique chính thức được thiết kế để chạy cả hệ thống microservices, nên nếu chỉ deploy 4 service thì frontend sẽ thiếu dependency.

Vì vậy ở 3A, ta sẽ chạy toàn bộ Online Boutique trên một EC2, nhưng chỉ có 4 service sẽ được tôi làm mẫu, phần còn lại bạn hãy tự thực hành.

Ý tưởng về CI/CD ở phần này là như sau:

  • CI: Mỗi service có một workflow riêng nằm trong .github/workflows, thực thi bởi GitHub Actions Runner. Workflow thực hiện Checkout → Test → Docker Build để đảm bảo service có thể build thành công.
  • CD: Sau khi CI thành công, chính GitHub Actions workflow tiếp tục thực hiện bước deploy. Runner kết nối SSH tới AWS EC2, pull source code mới và chạy CLI docker để cập nhật service trên server.

Mục tiêu

Từ Chapter 2:

1 Application
     ↓
1 CI/CD Pipeline

Sang Chapter 3A:

Online Boutique
      ↓
Multiple Microservices
      ↓
Multiple CI/CD Pipelines

Cuối chapter:

GitHub
   │
   ├── frontend
   │      ↓
   │   frontend-ci-cd.yml
   │
   ├── productcatalogservice
   │      ↓
   │   productcatalog-ci-cd.yml
   │
   ├── cartservice
   │      ↓
   │   cartservice-ci-cd.yml
   │
   └── checkoutservice
          ↓
      checkout-ci-cd.yml

Mỗi pipeline sẽ:

Git Push
   ↓
Test
   ↓
Docker Build
   ↓
Deploy
   ↓
AWS EC2

1. Kiến trúc

Ta sử dụng:

                    GitHub
                       │
          ┌────────────┼────────────┐
          ↓            ↓            ↓
      frontend       cart       productcatalog
          │            │            │
          ↓            ↓            ↓
      Pipeline      Pipeline      Pipeline
          │            │            │
          └────────────┼────────────┘
                       ↓
                      EC2
                       │
              Online Boutique
                       │
              ┌────────┴────────┐
              ↓                 ↓
          Web Browser       Microservices

EC2 chạy toàn bộ application.

GitHub Actions chỉ chịu trách nhiệm build/deploy những service mà ta muốn quản lý trong Chapter 3A.


2. Chuẩn bị EC2

Tạo một EC2:

OS: Ubuntu 24.04
Instance: t3.large
Storage: 30 GB

Không nên dùng t3.micro cho Online Boutique, vì toàn bộ hệ thống có nhiều service và sẽ khá nặng.

Security Group:

22    SSH     My IP
80    HTTP    0.0.0.0/0

Không cần mở:

3000
5000
6379
...

3. SSH vào EC2

ssh -i ./chapter3-key.pem ubuntu@<EC2_PUBLIC_IP>

4. Cài Docker

sudo apt update
sudo apt install -y docker.io docker-compose-v2 git

Kiểm tra:

docker --version
docker compose version

Cho user sử dụng Docker:

sudo usermod -aG docker $USER

Sau đó:

exit

SSH lại:

ssh -i ./chapter3-key.pem ubuntu@<EC2_PUBLIC_IP>

Kiểm tra:

docker ps

5. Clone Online Boutique

git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
cd microservices-demo

Repo chính thức hiện cung cấp Kubernetes manifests và Helm chart; Online Boutique được thiết kế để chạy trên Kubernetes.

Để giữ Chapter 3A không nhảy sang EKS/Kubernetes, ta sẽ dùng Docker-based deployment cho lab này.


6. Kiểm tra source

ls src

Bạn sẽ thấy:

adservice
cartservice
checkoutservice
currencyservice
emailservice
frontend
loadgenerator
paymentservice
productcatalogservice
recommendationservice
shippingservice

7. Chọn 4 service

Ta tập trung vào:

frontend
productcatalogservice
cartservice
checkoutservice

Lý do:

frontend
   ↓
Hiển thị UI
   ↓
product catalog
   ↓
cart
   ↓
checkout

Khi deploy thành công, bạn có thể mở browser và thấy kết quả ngay.


8. Tạo GitHub repository riêng

Fork/copy source sang repository của bạn.

Ví dụ:

online-boutique-cicd

Sau đó:

git remote remove origin
git remote add origin git@github.com:<USERNAME>/online-boutique-cicd.git

Kiểm tra:

git remote -v

9. Tạo docker compose và push source

services:
  cartservice:
    build:
      context: ./src/cartservice
    container_name: cartservice
    environment:
      REDIS_ADDR: redis-cart:6379
    ports:
      - "7070:7070"
    depends_on:
      - redis-cart

  redis-cart:
    image: redis:alpine
    container_name: redis-cart
    ports:
      - "6379:6379"

  productcatalogservice:
    build:
      context: ./src/productcatalogservice
    container_name: productcatalogservice
    environment:
      PORT: 3550
      DISABLE_PROFILER: "1"
    ports:
      - "3550:3550"

  paymentservice:
    build:
      context: ./src/paymentservice
    container_name: paymentservice
    environment:
      PORT: 50051
      DISABLE_PROFILER: "1"
    ports:
      - "50051:50051"

  checkoutservice:
    build:
      context: ./src/checkoutservice
    container_name: checkoutservice
    environment:
      PORT: 5050
      PRODUCT_CATALOG_SERVICE_ADDR: productcatalogservice:3550
      CART_SERVICE_ADDR: cartservice:7070
      PAYMENT_SERVICE_ADDR: paymentservice:50051
      SHIPPING_SERVICE_ADDR: shippingservice:50051
      EMAIL_SERVICE_ADDR: emailservice:5000
      CURRENCY_SERVICE_ADDR: currencyservice:7000
    ports:
      - "5050:5050"
    depends_on:
      - productcatalogservice
      - cartservice
      - paymentservice
git add .
git commit -m "initial online boutique"
git push -u origin main

10. Tạo GitHub Actions

mkdir -p .github/workflows

11. Frontend CI/CD

Tạo:

touch .github/workflows/frontend-ci-cd.yml

Flow:

Push frontend
      ↓
Test
      ↓
Docker Build
      ↓
SSH EC2
      ↓
Deploy frontend

Workflow:

name: Frontend CI/CD

on:
  push:
    branches:
      - main
    paths:
      - "src/frontend/**"
      - ".github/workflows/frontend-ci-cd.yml"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build Docker image
        run: |
          docker build \
            -t online-boutique-frontend \
            src/frontend

      - name: Deploy to EC2
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd ~/online-boutique
            git pull origin main
            docker compose build frontend
            docker compose up -d frontend

Lưu ý: ở bước thực hành chính thức, ta sẽ tạo docker-compose.yml trên EC2/repository để các service có thể kết nối với nhau.


12. Cartservice CI/CD

Tạo:

touch .github/workflows/cartservice-ci-cd.yml
name: Cartservice CI/CD

on:
  push:
    branches:
      - main
    paths:
      - "src/cartservice/**"
      - ".github/workflows/cartservice-ci-cd.yml"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build Docker image
        run: |
          docker build \
            -t online-boutique-cartservice \
            src/cartservice

      - name: Deploy to EC2
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd ~/online-boutique
            git pull origin main
            docker compose build cartservice
            docker compose up -d cartservice

13. Product Catalog CI/CD

Tạo:

touch .github/workflows/productcatalog-ci-cd.yml
name: Product Catalog CI/CD

on:
  push:
    branches:
      - main
    paths:
      - "src/productcatalogservice/**"
      - ".github/workflows/productcatalog-ci-cd.yml"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build Docker image
        run: |
          docker build \
            -t online-boutique-productcatalog \
            src/productcatalogservice

      - name: Deploy to EC2
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd ~/online-boutique
            git pull origin main
            docker compose build productcatalogservice
            docker compose up -d productcatalogservice

14. Checkout CI/CD

Tạo:

touch .github/workflows/checkoutservice-ci-cd.yml
name: Checkoutservice CI/CD

on:
  push:
    branches:
      - main
    paths:
      - "src/checkoutservice/**"
      - ".github/workflows/checkoutservice-ci-cd.yml"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build Docker image
        run: |
          docker build \
            -t online-boutique-checkoutservice \
            src/checkoutservice

      - name: Deploy to EC2
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            cd ~/online-boutique
            git pull origin main
            docker compose build checkoutservice
            docker compose up -d checkoutservice

15. GitHub Secrets

Vào:

Repository
→ Settings
→ Secrets and variables
→ Actions

Tạo:

EC2_HOST

Value:

<EC2_PUBLIC_IP>

Tạo:

EC2_SSH_KEY

Value:

-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

Không commit private key vào repository.


16. Push workflows

git add .github/workflows
git commit -m "add multiple CI/CD pipelines"
git push

Vào:

GitHub
→ Actions

Bạn sẽ thấy:

Frontend CI/CD
Cartservice CI/CD
Product Catalog CI/CD
Checkoutservice CI/CD

17. Kiểm tra Frontend

Thay đổi frontend:

echo "Chapter 3A" >> src/frontend/README.md
git add .
git commit -m "update frontend"
git push

GitHub Actions:

Frontend CI/CD
       ↓
    SUCCESS
       ↓
    Deploy
       ↓
      EC2

18. Kiểm tra UI

Trên EC2:

docker compose ps

Kiểm tra frontend:

docker ps | grep frontend

Sau đó mở:

http://<EC2_PUBLIC_IP>

Bạn sẽ thấy Online Boutique UI.

Online Boutique chính thức là web-based e-commerce app, với frontend là service cung cấp website; vì vậy đây là service tốt nhất để dùng làm “visual proof” cho pipeline. ([GitHub][1])


19. Kiểm tra Product Catalog

Sửa dữ liệu product:

nano src/productcatalogservice/products/products.json

Thay đổi tên một sản phẩm, ví dụ:

"Vintage Camera"

thành:

"Vintage Camera - CI/CD"

Sau đó:

git add .
git commit -m "update product catalog"
git push

Pipeline:

Product Catalog CI/CD
        ↓
       Build
        ↓
       Deploy
        ↓
       EC2

Refresh browser.

Bạn có thể thấy thay đổi sản phẩm trên UI.


20. Kiểm tra Cart

Sửa cartservice.

git add .
git commit -m "update cartservice"
git push

Pipeline:

Cartservice CI/CD
       ↓
      Build
       ↓
      Deploy

Mở Online Boutique:

Product
   ↓
Add to Cart
   ↓
Cart

Kiểm tra kết quả trực tiếp trên UI.


21. Kiểm tra Checkout

Sửa:

src/checkoutservice/

Sau đó:

git add .
git commit -m "update checkoutservice"
git push

Pipeline:

Checkoutservice CI/CD
        ↓
       Build
        ↓
       Deploy

Trên UI:

Product
   ↓
Add to Cart
   ↓
Cart
   ↓
Checkout
   ↓
Order

22. Kiểm tra điểm quan trọng nhất của Chapter 3A

Bây giờ bạn có:

.github/workflows/

frontend-ci-cd.yml
productcatalog-ci-cd.yml
cartservice-ci-cd.yml
checkoutservice-ci-cd.yml

Tất cả đều có logic gần giống nhau:

Checkout
   ↓
Build
   ↓
Deploy

Nhưng:

4 services
    ↓
4 pipelines
    ↓
4 lần copy/paste

Nếu tăng lên:

4 services
     ↓
10 services
     ↓
30 services
     ↓
50 services

thì vấn đề càng rõ.


23. Kết quả cuối Chapter 3A

Kiến trúc:

                         GitHub
                            │
             ┌──────────────┼──────────────┐
             │              │              │
             ↓              ↓              ↓
         Frontend         Cart       Product Catalog
             │              │              │
             ↓              ↓              ↓
        CI/CD #1       CI/CD #2       CI/CD #3
             │              │              │
             └──────────────┼──────────────┘
                            ↓
                           EC2
                            │
                    Online Boutique
                            │
                     ┌──────┴──────┐
                     ↓             ↓
                    UI         Microservices

Nhận xét

Ưu điểm:

  • Đơn giản, dễ hiểu và dễ triển khai.
  • Không cần Jenkins, CodeBuild, CodePipeline.
  • Mỗi service có pipeline độc lập.
  • Dễ kiểm tra CI/CD bằng GitHub Actions và Online Boutique UI.
  • Phù hợp để tạo nền tảng cho Chapter 3B.

Nhược điểm:

  • Copy-paste workflow giữa các service.
  • Khi thay đổi CI/CD logic phải sửa nhiều file.
  • Dễ xảy ra pipeline drift: các service có workflow khác nhau theo thời gian.
  • GitHub Actions Runner phải SSH trực tiếp vào EC2.
  • Chưa có artifact management, image registry, security scanning hay approval.
  • Khi số lượng service tăng lớn, cách này khó scale.

➠ Vấn đề này chính là lý do Chapter 3B cần Reusable Workflow.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.