
Giới thiệu
Đây là bài viết số 5 trong series K6 Performance Testing:
- K6 Performance Testing - Nhập môn
- K6 Performance Testing - Phân loại kiểm thử hiệu năng
- K6 Performance Testing - Giải mã & Định dạng kết quả
- K6 Performance Testing - Biến Số Liệu Thành Insight
Trong thế giới phát triển phần mềm ngày nay, CI/CD là một yếu tố then chốt giúp đẩy nhanh tốc độ phát hành ứng dụng. Chúng ta đã thấy rằng kiểm thử chức năng (Functional Testing) len lỏi vào quy trình CI/CD với các unit test, integration test được thực hiện mỗi khi mã nguồn thay đổi giúp sớm phát hiện lỗi trong phần mềm. Còn với Performance Testing thì sao, liệu công tác này có thể tham gia quá trình CI/CD, những lợi ích gì mà sự tích hợp này mang lại cho quy trình phát triển phần mềm?
Trong bài viết này, chúng ta sẽ cùng nhau khám phá phương pháp tích hợp kiểm thử hiệu năng trong CI/CD để sớm phát hiện những vấn đề về hiệu năng, nâng cao tính ổn định và hiệu năng của ứng dụng trước khi triển khai tới môi trường Production. Và để mang lại trải nghiệm thực tế, bài viết sẽ hướng dẫn bạn từng bước để tích hợp kiểm thử hiệu năng bằng công cụ K6 vào GitLab CI/CD
Giới thiệu về K6 và GitLab CI/CD
- K6: Là một công cụ kiểm thử hiệu năng mã nguồn mở, hiện đại, dựa trên JavaScript. K6 được thiết kế để dễ sử dụng, có khả năng mở rộng cao và thân thiện với nhà phát triển. Với khả năng viết kịch bản kiểm thử bằng JavaScript, K6 cho phép các nhà phát triển dễ dàng viết và duy trì các bài kiểm thử hiệu năng. Vui lòng tham khảo chi tiết về K6 trong tại bài viết K6 Performance Testing - Nhập môn.
- GitLab CI/CD: Công cụ này là một nền tảng CI/CD (Tích hợp liên tục và triển khai liên tục) cho phép bạn tự động hóa toàn bộ vòng đời phát triển phần mềm, dễ dàng tích hợp vào các quy trình đảm bảo chất lượng dự án, sản phẩm. Ở phần sau của bài viết sẽ cung cấp tới bạn về các thành phần chính của GitLab CI/CD.
Lợi ích của việc tích hợp K6 với GitLab CI/CD
Việc tích hợp kiểm thử hiệu năng vào quy trình CI/CD của GitLab mang lại nhiều lợi ích đáng kể:
- ✅ Phát hiện sớm các vấn đề về hiệu năng: bằng cách chạy các bài kiểm thử hiệu năng tự động sau mỗi lần thay đổi mã nguồn hoặc theo lịch trình tự động, bạn có thể phát hiện và đưa ra phương án khắc phục các điểm nghẽn hiệu suất ngay trong quá trình phá triển, trước khi chúng trở thành các vấn đề nghiêm trọng trong môi trường Production.
- ✅ Phản hồi nhanh chóng: Các nhà phát triển nhận được phản hồi tức thì về tác động hiệu suất của các thay đổi trong mã nguồn ứng dụng, giúp họ chủ động xác định và cập nhật mã nguồn.
- ✅ Đảm báo chất lượng liên tục: Kiểm thử hiệu năng trở thành một phần không thể thiếu của quy trình phát triển, đảm bảo rằng hiệu suất ứng dụng luôn được duy trì theo các cam kết đã đề ra.
- ✅ Tự động hóa và giảm thiểu lỗi thủ công: Loại bỏ hoặc giảm thiểu các thao tác thủ công, từ đó giảm thiểu sai sót và tiết kiệm đáng kể thời gian kiểm thử.
- ✅ Tăng cường sự tự tin khi triển khai: Với các bài kiểm thử hiệu năng được tự động hóa và đạt chất lượng, đội ngũ phát triển sẽ tự tin hơn khi triển khai và phát hành các phiên bản mới của ứng dụng.
- ✅ Theo dõi xu hướng hiệu suất: Lưu trữ kết quả kiểm thử theo thời gian giúp đội ngũ phát triển theo dõi xu hướng hiệu suất, xác định các thay đổi có thể gây ra suy giảm và cải thiện hiệu suất.
Kiến trúc tổng thể
Trước hết, chúng ta hãy hình dung bức tranh toàn cảnh khi tích hợp K6 Performance Testing vào quy trình CI/CD.
- Kích hoạt quá trình kiểm thử: ứng dụng, hệ thống sau khi được CI/CD pipeline đóng gói và triển khai thành công sẽ là đầu vào của quy trình kiểm thử.
- Thực thi kịch bản kiểm thử: trong quá trình kiểm thử hiệu năng, các kịch bản và cấu hình kiểm thử sẽ được tải xuống từ kho mã nguồn, đồng thời môi trường K6 cũng được thiết lập tự động để chuẩn bị cho việc thực thi các kịch bản kiểm thử.
- Thông báo & Báo cáo: kết quả kiểm thử sẽ được tự động thông báo và báo cáo tới đội ngũ phát triển và kiểm thử thông qua các công cụ ChatOps (ví dụ: Slack, Microsoft Teams, Email, v.v.)
- Lưu trữ & Hiển thị kết quả: kết quả sẽ được lưu trữ trên Prometheus và trực quan hóa trên Grafana, giúp kiểm thử viên tiếp tục phân tích, diễn giải chi tiết kết quả kiểm thử.
Trên đây là một mô hình tích hợp phổ biến giữa CI/CD & Performance Testing, giúp đẩy nhanh tốc độ kiểm thử và tăng cường độ tin cậy của ứng dụng, dịch vụ trước khi phân phối tới người dùng cuối.
Trong bài viết này, chúng ta sẽ tập trung vào khía cạnh cách xây dựng Testing Pipeline thông qua tích hợp K6 trong giải pháp GitLab CI/CD.
Tích hợp Performance Testing với GitLab CI/CD
Time to practice! 🚀🚀🚀
Trong phần này, chúng ta sẽ tích hợp K6 với GitLab CI/CD, hoàn thành bước đầu trong bức tranh tích hợp kiểm thử hiệu năng với Performance Testing.
Bước 1: Chuẩn bị GitLab accounts & repository
1.1. GitLab Account
Đăng nhập(https://gitlab.com/users/sign_in/) nếu bạn có tài khoản, Đăng ký(https://gitlab.com/users/sign_up) nếu chưa có
1.2. GitLab repository
Mình đã chuẩn bị một repository đơn giản k6-cicd-simple, trong đó bao gồm 2 tệp tin mà chúng ta cần chú ý:
my_script.js
: một kịch bản K6 với tham số cấu hình của phân loại smoke test. Bạn có thể tham khảo các bài viết trước trong series để hiểu rõ hơn về nội dung trong kịch bản này..gitlab-ci.yml
: định nghĩa GitLab CI/CD pipeline, ở bước số 2 chúng ta sẽ tìm hiểu có gì trong testing pipeline.
1.3. Tạo repository trên tài khoản cá nhân
Là tiền đề cho việc cấu hình GitLab CI/CD, chúng ta sẽ cần sở hữu riêng repository.
Trên trang GitLab đã đăng nhập tài khoản cá nhân, chúng ta tạo mới GitLab Project có tên k6-cicd-simple
, lưu ý rằng, hãy để project này rỗng bằng cách bỏ chọn các tùy chọn trong phần Project Configuration.
Sau khi repository mới được tạo, hãy lưu trữ lại đường dẫn SSH hoặc HTTPS theo phương thức kết nối ưa thích của bạn.
Trên máy tính cá nhân, mở terminal / command line và thực hiện lệnh clone mã nguồn mà mình đã chuẩn bị:
# clone repository
git clone https://gitlab.com/Hoang_Phu/k6-cicd-simple
# truy cập vào trong repository
cd k6-cicd-simple
Tiếp theo, chúng ta sẽ tạo liên kết giữa repository trên máy cá nhân với repository trên GitLab cá nhân bằng các lệnh sau:
# xóa liên kết với remote repository
git remote remove origin
# thêm liên kết mới tới gitlab repository của bạn thông qua đường dẫn SSH hoặc HTTPS đã đề cập lưu trữ
git remote add origin <ssh/https url>
# kiểm tra liên kết
git remote -v
# ví dụ về kết quả của câu lệnh, hiển thị đường liên kết fetch và push
# origin git@gitlab.com:Hoang_Phu/k6-cicd-simple.git (fetch)
# origin git@gitlab.com:Hoang_Phu/k6-cicd-simple.git (push)
# push mã nguồn tới repository của bạn
git push origin main
Sau khi đẩy mã nguồn thành công, chúng ta thêm một bước nhỏ xác nhận rằng các tệp tin đã được lưu trữ trên repository k6-cicd-simple trong tài khoản gitlab cá nhân.
Bước 2: Cấu hình GitLab CI/CD
2.1. Các thành phần chính trong GitLab CI/CD
Có gì trong GitLab CI/CD? Dưới đây là một loạt các câu hỏi và trả lời giúp bạn nắm rõ nhiệm vụ của các thành phần:
- ❓Pipeline là gì?
- 💬Chúng ta đề cập tới một khái niệm chung về hàng loạt các công việc được sắp xếp có trình tự từ việc tiếp nhận dữ liệu đầu vào tới điểm kết thúc sẽ tạo ra kết quả.
- ❓Nếu pipeline của tôi gồm nhiều bước, tôi cần làm gì?
- 💬Tổ chức trong pipeline sẽ chia thành các stage (giai đoạn), trong mỗi stage là chi tiết các job (tác vụ)
- ❓Pipeline được thực thi trong tài nguyên tính toán nào?
- 💬Trong GitLab CI/CD, khái niệm GitLab Runner được đề cập tới là tài nguyên cung cấp khả năng tính toán cho các job. GitLab Runner có thể là một máy chủ, máy ảo, hoặc thậm chí là một Container. Về chi tiết, các GitLab Runner sẽ tạo ra các Executor là môi trường trực tiếp để tự động thực thi các câu lệnh trong job.
- ❓Tôi đã thiết kế pipeline ở dạng mô hình, tiếp theo tôi cần định nghĩa chi tiết pipeline ở đâu để GitLab CI/CD sẵn sàng thực thi các công việc trong pipeline?
- 💬Tệp tin
.gitlab-ci.yml
ở thư mục gốc của repository là nơi chúng ta định nghĩa các công việc mong muốn.
- 💬Tệp tin
- ❓Định nghĩa pipeline như thế nào?
- 💬Pipeline của GitLab dựa trên ngôn ngữ YAML, cú pháp được định nghĩa bởi GitLab, vui lòng tham khảo cú pháp đầy đủ của GitLab CI/CD tại tài liệu chính hãng https://docs.gitlab.com/ci/yaml/
- ❓Làm sao để kích hoạt pipeline?
- 💬GitLab CI/CD hỗ trợ đa dạng phương thức kích hoạt từ thủ công cho tới tự động hóa dựa trên các event như push commit, HTTP call,…
2.2. Bật tính năng CI/CD trong GitLab Repo
Trong bài viết này, chúng ta sẽ sử dụng các runner được quản lý bởi GitLab thay vì cài đặt và quản lý các runner riêng. Những runner này mặc định được kích hoạt sẵn sàng sử dụng trong các repository.
Hãy kiểm tra và chắc chắn rằng các trong repository, lựa chọn sử dụng các runner quản lý bởi GitLab đã được kích hoạt.
Trên GitLab repository k6-cicd-simple
:
→ Thực hiện truy cập Settings
→ Truy cập cài đặt CICD
→ Mở phần Runner
→ Đảm bảo lựa chọn Enable instance runners for this project đã được kích hoạt
→ Chúng ta có thể thấy một số runner quản lý bởi GitLab ở trạng thái online.
2.3. Cấu hình GitLab-CI file
Dưới đây là nội dung của Testing Pipeline đơn giản đã có trong repository k6-cicd-simple
tại tệp tin .gitlab-ci.yml
:
stages:
- performance_test
performance_test:
stage: performance_test
image:
name: grafana/k6:latest
entrypoint: [""]
script:
- echo "Running performance tests with k6"
- k6 run --out csv=result.csv my_script.js || true
artifacts:
paths:
- result.csv
expire_in: 1 week
- Trong khối
stage
, chúng ta chỉ định trình tự các stage được thực thi. Ở đây, pipeline của chúng ta chỉ định nghĩa một stage duy nhất có tên làperformance_test
. - Trong khối
performance_test
, khối này tương ứng là định nghĩa của một job.performance_test**:**
: Đây là tên của job. Tên job phải là duy nhất trong cùng một file.gitlab-ci.yml
.stage: performance_test
: Chỉ định rằng job này thuộc về stageperformance_test
đã được khai báo ở trên. Điều này có nghĩa là job này sẽ chạy khi đến giai đoạnperformance_test
của pipeline.image**:**
: Xác định Docker image mà GitLab Runner sẽ sử dụng để chạy job này.name: grafana/k6:latest
: Chỉ định sử dụng Docker image chính thức của K6 từ Grafana, với phiên bản mới nhất (latest
). Runner sẽ kéo image này về và tạo một executor dưới dạng container để thực thi các lệnh trongscript
.entrypoint: [""]
: Docker imagegrafana/k6
có mộtENTRYPOINT
mặc định. Việc ghi đèentrypoint
thành một chuỗi rỗng[""]
là cần thiết. Điều này cho phép chúng ta thực thi các lệnhk6
trực tiếp trong phầnscript
của job mà không bịENTRYPOINT
mặc định của image can thiệp.
script:
: Chứa danh sách các lệnh shell sẽ được thực thi tuần tự trong môi trường container của job.echo "Running performance tests with k6"
: Lệnh này chỉ đơn giản in ra một thông báo trong log của job, giúp theo dõi quá trình chạy.k6 run --out csv=result.csv my_script.js || true
: Đây là lệnh chính để chạy bài kiểm thử hiệu năng bằng K6. Trong đó, K6 sẽ xuất kết quả của bài kiểm thử ra một tệp tin có định dạng CSV và có tênresult.csv
. Lưu ý rằng,|| true
là một phần quan trọng để tránh việcscript
trả về lỗi gây ra job thất bại, khiến pipeline thất bại. Trong kiểm thử hiệu năng, K6 có thể trả về mã lỗi nếu các ngưỡng (thresholds) được cấu hình bị vi phạm (ví dụ: tỷ lệ lỗi quá cao, độ trễ vượt ngưỡng). Thêm|| true
sẽ đảm bảo rằng job vẫn được đánh dấu là thành công trên GitLab CI/CD ngay cả khi K6 báo lỗi ngưỡng. Điều này cho phép pipeline tiếp tục và bạn vẫn có thể xem đượcartifacts
(kết quả CSV) để phân tích, thay vì dừng đột ngột
artifacts:
: Định nghĩa các file hoặc thư mục được tạo ra bởi job mà bạn muốn lưu trữ và có thể tải về sau này từ giao diện GitLab.paths:
: Danh sách các đường dẫn đến các file/thư mục cần lưu.result.csv
: Chỉ định rằng fileresult.csv
(được tạo ra bởi lệnh K6) sẽ được lưu trữ như một artifact. Bạn có thể tải file này về để phân tích chi tiết sau khi job hoàn thành.
expire_in: 1 week
: Cấu hình thời gian mà artifact sẽ được lưu trữ trên GitLab. Sau 1 tuần, fileresult.csv
này sẽ tự động bị xóa khỏi máy chủ GitLab để tiết kiệm không gian lưu trữ.
Bước 3. Kích hoạt Pipeline
Trong bước số 3, chúng ta sẽ thử nghiệm cả 2 phương thức kích hoạt GitLab Pipeline thủ công và tự động. 🛠️🛠️🛠️
3.1. Kích hoạt thủ công
Truy cập GitLab repository k6-cicd-simple
,
→ Tại menu Build chúng ta sẽ chọn Pipelines.
→ Trên màn hình danh sách pipeline, chúng ta click vào nút New pipeline.
→ Chọn nhánh main, sau đó click nút New pipeline để hoàn tất kích hoạt Testing Pipeline thủ công.
→ Màn hình tự động chuyển hướng tới chi tiết của pipeline.
→ Ở bước 3.3 sẽ hướng dẫn bạn theo dõi chi tiết kết quả của GitLab Pipeline.
3.2. Kích hoạt tự động dựa trên push commit
Quay trở lại repository trên máy tính cá nhân, chúng ta sẽ tạo ra commit mới và push thay đổi tới repository lưu trữ trên GitLab. GitLab CI/CD khi phát hiện ra sự kiện push commit, sẽ tự động kích hoạt Pipeline.
→ Cập nhật tệp tin README.md
bằng cách thêm một dòng - Khởi chạy pipeline tự động.
→ Chạy các lệnh dưới đây để tạo và push commit:
git add .
git commit -am "make new changes"
git push origin main
3.3. Xem kết quả pipeline
Truy cập GitLab repository k6-cicd-simple
,
→ Tại menu Build chúng ta sẽ chọn Pipelines.
→ Trong danh sách các pipeline, click vào biểu tượng ở cột Status để vào xem chi tiết của một pipeline
→ Trong tab Pipeline, chúng ta sẽ thấy trình tự các stage và job đã định nghĩa trong tệp tin .gitlab-ci.yml
. Với ví dụ này, stage performance_test
sẽ chứa job performance_test
.
→ Click vào job để xem thông tin chi tiết của job gồm: log, thời gian chạy, runner,…
→ Trong mục Job artifacts, click vào tùy chọn Browser để xem các tệp tin kết quả kiểm thử.
→ Bạn có thể tải xuống tệp tin để xem kết quả kiểm thử.
Tổng kết
✨ Tích hợp K6 Performance Testing với GitLab CI/CD là một bước tiến quan trọng để đảm bảo hiệu suất ứng dụng của bạn luôn được theo dõi và cải thiện. Thông qua bài viết, bạn đã hiểu các lợi ích then chốt như phát hiện sớm vấn đề hiệu suất, đảm bảo chất lượng liên tục, và tăng cường sự tự tin khi triển khai.
💎 Chúng ta đã bước một chân vào giải pháp tự động hóa kiểm thử hiệu năng bằng cách tích hợp K6 với GitLab CI/CD. Chi tiết, chúng ta đã thực hành từ việc chuẩn bị môi trường, cấu hình file .gitlab-ci.yml
đến việc kích hoạt và theo dõi pipeline.
📈 Việc áp dụng giải pháp này không chỉ tự động hóa quy trình kiểm thử hiệu năng mà còn tạo ra một “lưới an toàn” vững chắc, giúp ứng dụng của bạn luôn đạt hiệu suất tối ưu trước khi đến tay người dùng. Hãy bắt đầu tích hợp ngay hôm nay để đưa quy trình phát triển của bạn lên một tầm cao mới!
Bình luận