Giới thiệu
Có thể bạn đã nghe nói về CI/CD (Continuous Integration & Continuous Delivery). Hai thuật ngữ chỉ một phương pháp tiêu chuẩn được áp dụng giúp việc release phần mềm được gọn hơn, nhanh chóng và đáng tin cậy hơn. Vầy Github Actions là gì? Đây là một công cụ CI/CD để tự động hóa quy trình phát triển phầm mềm một cách dễ dàng. Có rất nhiều công cụ về CI/CD như Jenkins, CircleCI, TeamCity, TravisCI giúp bạn tự động hóa quy trình làm việc của mình, nhưng việc cài đặt Github Actions cho repo của bạn trên Github rất đơn giản. Trong bài này, chúng ta sẽ thảo luận về cách bắt đầu với nó.
Bắt đầu
Khi bạn mở repository của bạn trên Github, bạn sẽ thấy tab "Actions". Vì chúng ta chưa có bất kỳ action nào được thiết lập, nên trang sẽ trông giống thế này Chúng ta sẽ bắt đầu bằng cách tạo 1 tệp YAML thường được sử dụng cho các cấu hình. Bạn có thể thực hiện điều này bằng cách nhấn vào link “setup a workflow yourself” trong tab Actions (xem ảnh chụp màn hình ở trên) hoặc tạo file trong IDE của bạn. Trước tiên, chúng ta tạo 1 thư mục .github/workflows ở rootowr repository, và trong thư mục đó, chúng ta tạo 1 tệp có tên là first-workflow.yml.
Trong tệp này, chúng ta sẽ các định các action mà chúng ta cần thực hiện. Chúng ta sẽ định nghĩa 3 action bao gồm chạy unit test, build APK, và upload APK lên máy chủ Github.
Bây giờ hãy mở First-workflow.yml và paste đoạn code sau.
# This is a basic workflow to help you get started with Actions name: Android CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: test: name: Run Unit Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Unit tests run: bash ./gradlew test --stacktrace build: name: Generate APK runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build Debug APK run: bash ./gradlew :app:assembleDebug - name: Upload APK uses: actions/upload-artifact@v2 with: name: App path: ${{ github.workspace }}/app/build/outputs/apk/debug/app-debug.apk
Chúng ta sẽ đề cập đến ý nghĩa của từng dòng một.
Đầu tiên, chúng tôi đặt tên cho quy trình làm việc của mình bằng dòng sau.
name: Android CI
Chúng ta có thể có nhiều tệp workflow trong thư mục .github/workflows và mỗi workflow chạy song song trên một container khác nhau.
Tiếp theo, chúng ta cung cấp thông tin về khi nào kích hoạt workflow này bằng các dòng sau:
on: push: branches: [ master ] pull_request: branches: [ master ]
Ở đây chúng ta xác định rằng worflow này sẽ chạy khi có 1 commit được đẩy lên nhánh master hoặc khi có 1 pull request được tạo ra đối với nhánh master.
Bây giờ, chúng ta xác định các công việc (jobs). Như tên gọi của nó, jobs sẽ thực hiện 1 số action. Chúng ta đã xác định 2 jobs, là test và build.
Hãy xem job đầu tiên: test
test: name: Run Unit Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Unit tests run: bash ./gradlew test --stacktrace
Chúng ta đặt tên cho công việc này là "Run Unit Tests" với key name. Sau đó, chúng ta xác định công việc này sẽ chạy trên máy ảo nào. Chúng ta có thể chọn máy ảo từ "ubuntu", "windows" hoặc "macOS". Ở đây, chúng ta đã chọn chạy công việc này trên phiên bản mới nhất của Ubuntu (hệ điều hành dựa trên Linux) với key là runs-on.
Bây giờ, chúng ta xác định các bước cần thực hiện trong công việc này bằng cách sử dụng khối steps:
- Bước đầu tiên là kiểm tra repository mà chúng ta đã định nghĩa các action.
- Bước hai, chúng ta thiết lập phiên bản Java 8 để chạy các unit test. Chúng ta thực hiện điều này bằng cách sử dụng actions/setup-java@v1. Đó là một action được định nghĩa trước mà máy chủ Github sử dụng để thiết lập môi trường java cho chúng ta.
- Ở bước ba, chúng ta run các bài test với action run sử dụng công cụ ở dòng lệnh gradle wrapper
Bây giờ, khi bạn commit file này và push nó lên nhánh master, bạn sẽ thấy quy trình bắt đầu chạy và nếu tất cả các unit test của bạn đều thành công, bạn sẽ thấy một cái gì đó giống như thế này.
Chúc mừng, như vậy workflow đầu tiên của bạn đã được kích hoạt và chạy thành công.
Bây giờ hãy xem công việc thứ hai: Build.
build: name: Generate APK runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build Debug APK run: bash ./gradlew :app:assembleDebug - name: Upload APK uses: actions/upload-artifact@v2 with: name: App path: ${{ github.workspace }}/app/build/outputs/apk/debug/app-debug.apk
Nó bắt đầu với tên công việc là "Generate APK" và chúng ta xác định máy ảo nó chạy trên giống như chúng ta đã làm test job.
Bây giờ chúng ta sẽ xác định các bước:
- Kiểm tra repository và thiết lập java được thực hiện theo cách chúng ta đã làm trước đó. Chúng ta đã định nghĩa lại nó vì job này sẽ chạy trong một container khác song song với container đầu tiên.
- Tiếp theo, chúng ta xây dựng tệp APK với hành động run: hành động sử dụng dòng lệnh gradle wrapper.
- Sau đó, chúng ta tải lên tệp APK bằng action được định nghĩa trước đó là "action/upload-artifact@v2". Ở đây, chúng ta xác định tên của artifact sẽ được hiển thị trên trang Artifacts Github và đường dẫn nơi tệp APK được tạo ra trong bước trước.
Sau khi bạn commit file này và đẩy nó lên nhánh master, workflow sẽ bắt đầu thực hiện, và tệp APK sẽ được build và tải lên, bạn sẽ thấy tương tự thế này.
Để xem và tải xuống tệp APK đã được tạo ra và tải lên, chúng ta có thể nhấp vào tên của quy trình là "Android CI" (trong trường hợp của chúng ta). Chúng ta sẽ thấy màn hình như sau.
Chúng ta có thể thấy link có tên là "App" dưới phần Artifacts. Nếu chúng ta nhấp vào đó, một tệp zip sẽ được tải xuống chứa tệp APK.
Kết luận
Đó là tất cả. Bạn đã định nghĩa luồng CI/CD một cách rất đơn giản, giúp làm cho quá trình phát triển phần mềm của bạn trở nên nhanh chóng và đáng tin cậy.
Tôi hy vọng qua bài viết này bạn đã nắm được cách thiết lập và sử dụng Github Actions.
Tài liệu tham khảo: https://blog.mindorks.com/github-actions-for-android/
Reference: GitHub Actions Documentation