Continuous Integration với TravisCI

Quincey Pham
ZaloPay Engineering
5 min readMar 18, 2020
CI workflow

Giới thiệu

Continuous Integration (CI) là quy trình tích hợp code một cách tự động khi có sự thay đổi nhỏ trong quá trình phát triển phần sản phẩm. Lợi ích của CI là phát triển sản phẩm nhanh hơn và chất lượng hơn, tiết kiệm thời gian của developer bằng cách tự động build và test cho những tính năng được tích hợp liên tục. TravisCI là một nền tảng CI cho cung cấp tất cả những lợi ích kể trên, đồng thời phản hồi kết quả lập tức cho người dùng, tự động deploy. Ở bài viết này, chúng ta cùng tìm hiểu các khái niệm cơ bản trong TravisCI và cách để apply TravisCI vào Github project.

Cách hoạt động

Trước hết ta cùng tìm hiểu một số thuật ngữ hay dùng trong TravisCI:

  • phase: các bước liên tục trong một job. Ví dụ `before_script` phase sau đó tới `script` phase.
  • job: tiến trình tự động thực hiện dãy các phase.
  • build: Một nhóm các job. Một build hoàn thành khi tất cả job trong build đó hoàn thành.
  • stage: Một nhóm các job chạy song song. Ví dụ, ta muốn chạy test trên các môi trường khác nhau và các test đó độc lập nên có thể để chúng chạy song song. Lưu ý, stage vẫn chạy tuần tự với các stage khác.

Để cấu hình TravisCI cho một repository trên Github, ta thêm file .travis.yaml cùng cấp với root directory của repository đó. Khi TravisCI đã được kích hoạt cho Github repository, Github sẽ trigger để TravisCI chạy các lệnh trong file .travis.yaml một khi có một commit mới đẩy lên hay một pull request được tạo. Ta có thể cấu hình các nhánh để thực hiện job trên đó. Ví dụ một file .travis.yaml :

ví dụ .travis.yaml cho python

Các bạn có thể tham khảo thêm các từ file khóa trong file.yaml của TravisCI tại đây

Khi chạy build, TravisCI trước tiên sẽ clone Github repository vào trong một môi trường ảo, sau đó thực thi các chuỗi các task để build và test code project của chúng ta. Nếu có một hay nhiều task fail, quá trình build bị coi là broken. Trạng thái job thực hiện trong quá trình build đó được coi là not passed. Các trạng thái not passed bao gồm:

  • errored: các lệnh trong `before_install`, `install` hay `before_script` phase trả về non-zero exit code. Lúc này, job sẽ dừng ngay lập tức.
  • failed: các lệnh trong `script` phase trả về non-zero exit code. Job vẫn thực hiện cho tới khi hoàn thành.
  • canceled: user hủy job trước khi nó hoàn thành.

Sau khi job được thực thi xong, TravisCI sẽ thông báo kết quả build đến developer qua mail hay qua IRC channel. Để mọi người dễ hình dung hơn, mình sẽ thử demo cho các bạn cách apply TravisCI vào project Golang trên Github.

Demo

Trong ví dụ này, mình sẽ áp dụng TravisCI để áp dụng vào project Golang mình đã viết, các bạn có thể xem tại đây. Để push được Docker image lên Docker Hub, ta cần credential cho tài khoản Docker trong TravisCI. Ở đây mình sẽ thêm biến môi trường là Docker username và Docker password vào TravisCI bằng cách vào mục settings của repo, tới mục Environment Variables và nhập các biến cần thiết:

Thêm biến môi trường trong TravisCI

Lúc này, ta có thể lấy biến môi trường bằng thông qua dấu $. File .travis.yaml cho project trông sẽ như thế này:

.travis.yaml — cannon

Ở đây mình định nghĩa quy trình CI của mình có 3 stages: build code, tới test code và sau đó là build Docker image để push lên Docker Hub. Như các bạn thấy ở trên, mình chỉ trigger build cho nhánh `feature/Integrate-TravisCI`. Bây giờ ta thử commit code và push lên nhánh đó:

git add .
git commit -m "Modify travis.yaml: add Docker credential"
git push origin feature/Integrate-TravisCI

Vào trang chủ của TravisCI, ta sẽ thấy có một build đang được kích hoạt, như hình dưới là build #10. Ngoài ra ta còn thấy được tên repository, commit message và nhánh đang được build:

Build được trigger

Như định nghĩa trong file .travis.yaml , build này sẽ bao gồm 3 stages chạy tuần tự:

  • Build: Compile code
  • Test: Chạy unit tests
  • Push-docker-registry: deliver Docker image lên storage (Docker Hub)
Các stages đang chạy

Và đây là kết quả sau khi quá trình build hoàn tất nếu không có job nào bị fail:

Build passed

Build status luôn được hiển thị thông qua Github badget:

Build status hiển thị qua badget

Ta cũng có thể nhận được thông báo trong mail sau khi build hoàn tất:

Notify qua mail

Cùng kiểm tra xem Docker image đã được push lên Docker Hub chưa:

DockerHub

Kết luận

TravisCI là một công cụ CI tuyệt vời, dễ sử dụng. So với Jenkins thay vì phải thiết lập server, TravisCI cung cấp dịch vụ web với UI bắt mắt, dễ dàng set up hơn , thích hợp cho các project nhỏ. Tuy nhiên, với các project lớn hơn, Jenkins lại khẳng định mình qua kho tính năng khổng lồ với các plugin độc đáo, đồng thời config được nhiều hơn là config qua file .yaml như TravisCI.

Bài viết đến đây là kết thúc, cảm ơn anh Thinh Dang đã hướng dẫn mình trong suốt quá trình làm việc và tìm hiểu.

--

--