- vừa được xem lúc

Hướng Dẫn Sử Dụng Maven Publish và GitHub Actions Để Publish Thư Viện Kotlin Multiplatform Lên GitHub Packages

0 0 7

Người đăng: Hiếu Đỗ

Theo Viblo Asia

Giới Thiệu

Chào mừng các bạn đến với hướng dẫn siêu chi tiết về cách publish một thư viện Kotlin Multiplatform lên GitHub Packages. Nếu bạn đã từng cảm thấy bối rối với việc này, thì đừng lo, chúng ta sẽ cùng nhau vượt qua mọi khó khăn!

Bước 1: Thêm Plugin maven-publish

Đầu tiên, chúng ta cần thêm plugin maven-publish vào file build.gradle.kts của module mà bạn muốn publish. Đoạn code này giống như việc thêm một chút gia vị vào món ăn của bạn, giúp nó trở nên hoàn hảo hơn.

plugins { ... id("maven-publish")
}

Bước 2: Cấu Hình publishing Trong build.gradle.kts

Tiếp theo, chúng ta sẽ thêm đoạn code dưới đây vào file build.gradle.kts vừa thêm plugin. Đoạn code này giống như việc chuẩn bị nguyên liệu cho món ăn của bạn, đảm bảo mọi thứ đều sẵn sàng.

publishing { repositories { maven { url = uri("<package-url>") credentials { username = findProperty("gpr.user") as String? ?: System.getenv("USERNAME_GITHUB") password = findProperty("gpr.token") as String? ?: System.getenv("TOKEN_GITHUB") } } } publications.withType<MavenPublication>().forEach { publication -> val targetName = publication.name.substringAfterLast(":") val artifactId = if (targetName == "kotlinMultiplatform") { "\"<artifact-id>\"" } else { "<artifact-id>-$targetName".lowercase() } publication.groupId = "<group-id>" publication.artifactId = artifactId publication.pom { name.set(rootProject.name) description.set(findProperty("publicationDescriptionLibrary") as String) url.set(findProperty("publicationUrl") as String) licenses { license { name.set(findProperty("publicationLicenseName") as String) url.set(findProperty("publicationLicenseUrl") as String) } } scm { url.set(findProperty("publicationScmUrl") as String) connection.set(findProperty("publicationScmConnection") as String) developerConnection.set(findProperty("publicationScmDeveloperConnection") as String) } developers { developer { id.set(findProperty("publicationDeveloperId") as String) name.set(findProperty("publicationDeveloperName") as String) } } } }
}

Giải Thích Chi Tiết

  • repositories { maven { ... } }: Đây là nơi chúng ta định nghĩa repository mà chúng ta sẽ publish thư viện của mình. URL và thông tin đăng nhập được lấy từ các biến môi trường hoặc các thuộc tính được định nghĩa trong project.
    • Thông thường url sẽ có dạng: https://maven.pkg.github.com/<github-user>/<repo-name>
  • publications.withType<MavenPublication>().forEach { ... }: Chúng ta duyệt qua tất cả các publication và cấu hình chúng.
  • publication.groupId, publication.artifactId: Đặt groupId và artifactId cho publication.
    • artifactId cho các target sẽ có dạng <artifact>cho common, và <artifact>-android, <artifact>-iosx64, <artifact>-js, <artifact>-jvm cho các target khác của module.
  • publication.pom { ... }: Cấu hình POM (Project Object Model) cho publication, bao gồm tên, mô tả, URL, license, SCM (Source Control Management), và thông tin developer.

Bước 3: Viết File publish.yml Để Publish Lên GitHub Packages

Cuối cùng, chúng ta sẽ viết file publish.yml để sử dụng GitHub Actions publish thư viện của chúng ta lên GitHub Packages. Đây là bước cuối cùng, giống như việc nấu chín món ăn và dọn ra bàn.

name: Publish Package on: push: tags: [ 'v*' ] env: JAVA_VERSION: '17' GRADLE_CACHE_PATH: | ~/.gradle/caches ~/.gradle/wrapper USERNAME_GITHUB: ${{ github.actor }} TOKEN_GITHUB: ${{ secrets.GITHUB_TOKEN }} jobs: publish: name: Publish Package runs-on: macos-latest permissions: contents: read packages: write steps: - uses: actions/checkout@v4 - name: Cache Gradle packages uses: actions/cache@v3 with: path: ${{ env.GRADLE_CACHE_PATH }} key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: ${{ runner.os }}-gradle- - name: Setup Java uses: actions/setup-java@v4 with: java-version: ${{ env.JAVA_VERSION }} distribution: 'temurin' cache: gradle - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Publish package run: ./gradlew publish

Giải Thích Chi Tiết

  • on: push: tags: [ 'v*' ]: Kích hoạt workflow khi có tag mới bắt đầu bằng v.
  • env: Định nghĩa các biến môi trường như phiên bản Java, đường dẫn cache của Gradle, và thông tin đăng nhập GitHub.
  • jobs: Định nghĩa các job trong workflow.
    • publish: Job này sẽ publish package lên GitHub Packages nếu có tag mới bắt đầu bằng v.

Release Process

Đây là quy trình phát hành phiên bản mới của dự án. Quy trình này bán tự động, dựa vào cả các bước thủ công và các pipeline CI/CD tự động.

Các Bước Phát Hành

  • Tạo Nhánh Phát Hành: Bắt đầu bằng việc tạo một nhánh mới từ main (hoặc nhánh mặc định của bạn) có tên là releases/vX.X.X, trong đó X.X.X là số phiên bản mới.
git checkout main
git pull origin main
git checkout -b releases/vX.X.X
  • Cập Nhật Phiên BảnChangelog: Cập nhật số phiên bản trong các thư viện của dự án và file CHANGELOG.mdđể phản ánh phiên bản mới và tóm tắt các thay đổi. Sử dụng các nhãn và tiêu đề PR để hướng dẫn các mục trong changelog.
# Update version in relevant files
# Update CHANGELOG.md

Push Nhánh Phát Hành: Push nhánh phát hành mới tạo lên repository từ xa.

git push origin releases/vX.X.X
  • Tạo Tag Phát Hành: Khi nhánh phát hành đã được push và tất cả các kiểm tra CI đều thành công, tạo một tag cho phiên bản phát hành.
git tag vX.X.X
  • Push Tag: Push tag lên repository từ xa. Hành động này có thể kích hoạt các pipeline CI/CD được thiết kế để deploy/phát hành phiên bản mới.
git push origin vX.X.X
  • Kích Hoạt CI: Nếu pipeline CI/CD của bạn không tự động kích hoạt khi push tag, hãy kích hoạt thủ công pipeline để build, test, và deploy/phát hành phiên bản mới như đã cấu hình.

Kết Luận

Vậy là chúng ta đã hoàn thành hướng dẫn publish một thư viện Kotlin Multiplatform lên GitHub Packages. Đây là ví dụ kết quả khi bạn publish thành công. Tham khảo thêm tại github Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về quy trình và cảm thấy tự tin hơn khi thực hiện. Chúc bạn thành công và đừng quên chia sẻ thành quả của mình với mọi người nhé! Nếu bạn có bất kỳ câu hỏi nào, đừng ngần ngại để lại bình luận. Tôi luôn sẵn sàng giúp đỡ!

Happy coding! 🚀

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cấu hình CI/CD với Github (phần 2): Trigger một work flow

Events trigger. Bạn có thể cấu hình cho workflows chạy khi có một sự kiện nào đó xảy ra trên GitHub, theo một lịch có sẵn hoặc cũng có thể là một sự kiện nào đó xảy ra ngoài GitHub.

0 0 80

- vừa được xem lúc

Khi Github Actions và CircleCI song kiếm hợp bích thì đỉnh không gì bằng [Phần 2]

Cách thức thực hiện. Có thể nói ưu điểm của Github Actions chính là số lượng trigger nhiều. Việc khởi động CircleCI sẽ gọi API của CircleCI từ phía Github Actions và kích hoạt trigger. Cho nên, ở setting của repository, hãy cài OFF cho Webhook.

0 0 49

- vừa được xem lúc

Khi Github Actions và CircleCI song kiếm hợp bích thì đỉnh không gì bằng [Phần 1]

(Sau đây xin được dịch lại bài báo nọ, ngôi xưng là "Chế"). .

0 0 48

- vừa được xem lúc

Cấu hình CI/CD với Github (phần 4): Các mẫu job cơ bản

Sau đây là một số mẫu Github action cơ bản mà các bạn có thể sử dụng để tạo một flow hoàn chỉnh, phụ thuộc vào yêu cầu của từng dự án khác nhau. .

0 1 130

- vừa được xem lúc

Cách tạo một trang blog cá nhân miễn phí dành cho dev

Vào một ngày đẹp trời, bỗng dưng mình nảy ra ý định làm một trang blog cá nhân thay vì viết Blog trên các nền tảng có sẵn. .

0 0 42

- vừa được xem lúc

Cài đặt đơn giản automating publishing Flutter app lên Google Play bằng Github Actions

Introduction. Mỗi developer hay gặp phải các công việc lặp đi lặp lại gây ra sự nhàm chán.

0 0 45