Trong bài đăng này bạn sẽ học được cách tạo Lambda trigger cho multiple pipeline với cùng một monorepo. Ở đây sẽ sử dụng Codecommit làm monorepo
Monorepo
Trên thực tế sẽ có bạ đặt ra câu hỏi là tại sao phải sử dụng monorepo, mình cũng không rõ, có lẻ là để các service chia sẽ thư viện của nhau, mình từng gặp một dự án dùng Java và monorepo đấy có tận 12 service(12 bộ source dồn vào một repo), thế mới có khái niệm monorepo
Một vài vấn đề
Nếu mỗi service tách riêng ra và dùng repo riêng (polyrepo) thì mọi chuyện sẽ đơn giản, mỗi repo sẽ có một pipeline riêng, nhưng nếu gộp chung các reop lại thì bài toán đặt ra là làm thế nào để xác định được sự thay đổi code của service nào, để chỉ build lại service đó, thay vì build lại toàn bộ các service trong repo
Hướng giải quyết
Nếu sử dụng gitlab thì gitlab sẽ có cơ chế nhận biết sự thay đổi và trigger theo file, thay vì theo nhánh như codecommit. Giải pháp là kiểm tra sự thay đôi của file sau đó tìm ra thư mục gốc của nó, và build source trong thư mục đó.
Cách 1: Dùng bash script.
Cách này thì mình chưa test, bạn đọc có thể test thử, vì mình đã kiếm được một cách khác hay hơn. Cách này sẽ dùng script để tìm ra sự thay đổi của file và truy ra thư mục gốc, tuy nhiên cách này có nhược điểm là chỉ những micro service trong monorepo có cùng một cách build, và dùng chung một pipeline.
Đầu tiên mình sẽ tạo một mảng tương ứng giữa tên service (cũng là tên thư mục chứa service trong monorepo) và tên S3 bucket (ở đây mình build Frontend)
Sau đó mình dùng lênh `git diff ` để tìm ra file nào thay đôi và truy ra thư mục gộc của nó, tiếp theo là build và sync đến S3.
Cách 2: Dùng lambda handler event của codecommit.
Cách này sẽ dùng được cho nhiều trường hợp hơn, vì nó không cố định một pipeline. Mỗi khi có commit được push lên, codecommit sẽ trigger lambda, lambda sẽ tiến hành kiểm tra sự thay đổi của file
dựa vào commit id lúc đầu (được lưu ở parameter store) và commit id mới nhất, sau đó truy ra thư mục gốc và trigger pipeline tương ứng.
Kiến trúc monorepo
Trong ví dụ này, mình sẽ tạo ra hai thư mục là service_1 và service_2. tương ứng với pipeline codepipeline-service_1 và codepipeline-service_2 ở nhánh main, trong thư mục sẽ có một vài code HTML đơn giản.
bạn có thể mở rộng số service và số pipeline, vì cấu hình không được fix cứng và có thể thay đổi thông qua file monorepo-main.json
nếu bạn muốn tạo một nhánh khác thì chỉ đơn giản là đổi monorepo-main.json thành monorepo-.json tương ứng.
Code Lambda
Source code mình để ở đây
Mình đã tạo sẳn Cloudformation template, việc bạn cần làm là tạo một S3 bucket chứa file lambda.zip (file này chứa code lambda, bạn có thể giaỉ nén ra để xem code), khi lambda chạy nó sẽ đọc code từ bucket này.
Tên bucket này bạn sẽ truyền vào template thông qua param ở template-master.yaml
Deploy template
Bạn cần tạo một bucket để lưu template cho việc deploy cloudformation. dưới đây là cấu trúc repo, mình sẻ chia nhỏ các resoirce thành các template khác nhau và kết nối chúng lại bằng template master.
Tên của bucket này sẽ được dùng ở template-master.yaml
Sau đó bạn click vào template-master.yaml, copy link của nó.
Và tiến hành khởi tạo cloudformation bằng link template vừa copy.
sau đó nhấn Create
Testing
Sau khi deploy xong thì tiến hành kiểm tra thôi, mình sẽ tạo một commit bất kì. Kiểm tra pipeline hoạt động ngon lành.