Có GitHub Actions rồi, cần gì CircleCI nữa?

Gần đây Github mới giới thiệu một tính năng mới được gọi là GitHub Actions, hỗ trợ CI/CD và tôi đã nghĩ đến việc migrate toàn bộ dự án đang sử dụng CI của mình lên đó. Tôi đã được sử dụng bản beta của Github Actions và thử chuyển ứng dụng React Native từ CircleCI lên Github Actions. Và đây là cách nó chạy:

Picking an operating environment

Github hiện đang hỗ trợ thực thi các task trên macOS, môi trường chỉ được lựa chọn khi build ứng dụng iOS. Với Android, bạn có 2 lựa chọn là:

  • Sử dụng Docker Image (sử dụng container option)
  • Chạy một process trên máy raw Ubuntu.

Sau khi gặp vài vấn đến với quyền trong Docker Image tôi quyết định tiếp tục với môi trường Ubuntu 18.04.

Using Actions or run raw commands?

Workflows được chia thành các bậc: Workflow -> Jobs -> Steps. Mỗi step cho phép bạn định nghĩa một command (ví dụ:- run: pod install) hoặc sử dụng một Action đã được người khác chuẩn bị trước và chạy trong một Docker container. Tôi đã thử với các actions cho yarn, fastlanebundle, nhưng theo cá nhân tôi, tôi sẽ tự gõ và sử dụng các bash command.

Installing Ruby, Node, Fastlane etc.

Trong đây có liệt kê các software hỗ trợ bạn cài đặt trên Ubuntu hoặc macOS machine. Phiên bản mặc định của Node trên macOS khá cũ (v6.17.0) và ruby command thì không có sẵn trên Ubuntu. Vì vậy, để sử dụng, bạn cần cài đặt node, ruby, gem, bundle trước.

Using secrets and environment variables

Không giống như CircleCI, bạn phải định nghĩa biến mỗi trường cho mỗi step và chúng không sử dụng chung trong workflow được =)) Tôi đã định nghĩa chúng trong file thay vì encode chúng thành chuỗi base64 ở trong Secrets setting trong Github repo, và sử dụng chúng trong env section ở trong mỗi step.

Sudo or not sudo

Tôi nhận thấy Github Actions hạn chế nhiều quyền trên các filesystem so với dưới môi trường local và so với CircleCI. Tôi phải sử dụng sudo cho nhiều command trên Ubuntu như gem install bundler hay npx jetify hoặc fastlane android beta.

Setting up the iOS keystore

Khi sử dụng Fastlane, có một vài setup_ci command sẽ tạo temporary keychain trên macOS. Việc này là bắt buộc, nếu không thì bản build sẽ bị kẹt lại. Tuy nhiên, trên Github Actions thì Fastlane không nhận biết được việc này như các CI provider khác và nó bỏ qua yêu cầu này. Vì thế bạn cần chắc chắn mình đã set force: true để tránh gặp phải nó.

Syncing certificates and provisioning profiles

Trước đây tôi có sử dụng Fastlane Match để auto-sync iOS certificates với Github repo. Để làm được việc này, tôi tạo ra 1 deploy key trên Github và thêm chúng vào CircleCI, việc này giúp tôi có thể clone private repository đó về CircleCI. Trớ trêu thay là không dễ dàng gì để clone private Github repo trên Github Actions (Thật khó hiểu phải không =)) chức năng của Github lại không dễ dàng thực hiện trên Github) bởi vì bạn không thể thêm SSH keys vào nó. Vì thế tôi phải chuyển certificates đó lên 1 nơi lưu trữ khác mà được hỗ trợ bởi Fastlane MatchGoogle Cloud Storage Buckets.

Increasing the number of watchers

Khi bạn đóng gói ứng dụng Javascript sử dụng Metro, bản build sẽ bị fail với error code ENOSPC: no space left on device. Lỗi này khá khó hiểu, việc bạn phải làm là tăng số lượng file watchers trên máy lên (có thể sử dụng command echo fs.inotify.max_user_watches=52488 | sudo tee - a /etc/sysctl.conf && sudo sysctl -p). Vấn đề này không xuất hiện trên CircleCI.

Cả một list các bản build, được phân theo workflow. Khá chậm để chuyển đến 1 bản build, có vẻ như Github Actions load 100 bản build trong 1 lần luôn

Watching the logs

Theo dõi logs cuộn trên màn hình thực sự đem lại cảm giác thú vị. Github Actions bắt đầu hỗ trợ streaming logs. Nhưng bạn chỉ có thể xem logs được in ra sau khi bạn reload lại trang ...

Như tôi đề cập ở trước, bản build bị kẹt trong quá trình signing, nhưng bởi vì tôi không mở trang Github Actions nào, nên tôi không thấy được logs, cách duy nhất để xem là tôi phải cancel bản build đó lại hoặc kệ cho nó chạy =))

Bản build chạy 32 phút. Chậm hay bị đơ =)) không thể biết nguyên nhân khi logs cũng chẳng xuất hiện.

Việc này thật sự khó chịu, Github cần phải cải thiện nó.

When to trigger workflows

Tôi không muốn khởi tạo việc build ứng dụng iOS, Android trên mỗi commit, nó sẽ mất rất nhiều thời gian, cũng như tôi không muốn mỗi commit lại release một lần. Tôi chỉ cần build khi tôi nghĩ app sẵn sàng được phân phối tới beta channels.

Có nhiều cách như đặt lịch build, hoặc là chọn build khi có các event như issue comment, tag, release, wiki update nhưng không thấy nút nào để Build now. Cách duy nhất để chủ động build là trigger build khi có ai đó rate star cho repository. Và bạn có thể unstar đi và star lại để trigger bản build =))

Unstar và star lại để trigger việc build

Pricing and usage

Đây có lẽ là điều mọi người quan tâm nhất. Nhưng hiện tại không có cách nào để bạn biết được bạn đã build hết bao nhiêu phút và giá của chúng là bao nhiêu (Có thể do trong thời điểm beta nên mọi thứ là miễn phí). Có thể giá của Github Actions sẽ rẻ hơn CircleCI kha khá.

Trong môi trường Linux/Docker, bạn sẽ có 2000 phút miễn phí (hoặc 3000 phút với tài khoản Pro). Gần đây CircleCI giảm thời gian miễn phí xuống từ 1500 phút còn 1000 phút mỗi tháng, và bây giờ cũng chia nhỏ giới hạn từng tuần còn 250 phút, và thực sự thời gian đó rất nhanh hết.

Build trên môi trường macOS có giá 8cent mỗi phút, tương đương với CircleCI là 39$ mỗi 500 phút và 8 cent cho mỗi phút ngoài quota. Nhưng trên Github Actions bạn sẽ trả theo từng phút, sẽ là rẻ hơn nếu bạn dùng ít hơn 500 phút. Bạn có thể sử dụng 3000 phút miễn phí trên macOS để tiết kiệm được thêm 400$ mỗi năm.

CircleCI offer bạn plan sử dụng 1x parallelization trên Linux và 2x parallelization trên macOS, điều đó nghĩa là bạn sẽ phải chờ rất lâu, nhưng trên Github Actions bạn có thể sở hữu 20 bản build đồng thời trên mỗi repository.

Tóm lại

Github Actions Beta vẫn chưa thực sự hoàn hảo, kha khá bug và những điều bất tiện trên UI, docs cũng như nền tảng.

CircleCI vẫn là sản phẩm tốt hơn, nhưng so về giá cả và khả năng tương thích, tôi vẫn sẽ chọn Github Actions. Github đã cải thiện rất nhiều điều nhỏ trong sản phẩm của mình và cải thiện Github Actions chỉ trong 8 tháng, để có được bản beta như này là thực sự đáng ngưỡng mộ. Tôi sẽ chuyển toàn bộ dự án của mình lên Github Actions bởi tôi tin chúng có thể nhanh hơn nữa, và Github rất biết lắng nghe yêu cầu tính năng từ user để cải thiện, giúp sản phẩm của mình tốt hơn.

Nguồn tham khảo