🐺

GaugeプロジェクトをGitHubPackagesで共通ライブラリ化する

2024/11/08に公開

課題感

様々なプロジェクトで同じようなステップを作成する、もしくはそのような可能性がある

目的

Gaugeで作成したE2Eプロジェクトを共通ライブラリにして再利用可能な状態にしたい

解決策

GitHub Packagesによる共通化

環境

  • Gauge
  • Gradle
  • GitHub Organization (Private)

対応フロー

箇条書きで書くと以下のような手順

作成したE2EをGitHub Packagesに登録する

今回はGitHub Packages利用して指定した範囲のソースコードをパッケージ化する

GitHub Packagesについて

GitHub Packages は、コンテナーやその他の依存関係を含むパッケージをホストおよび管理するためのプラットフォームです。 GitHub Packagesは、ソースコードとパッケージを 1 か所にまとめ、統合された権限管理と支払いを提供し、GitHub 上でのソフトウェア開発を一元化できるようにします。

https://docs.github.com/ja/packages/learn-github-packages/introduction-to-github-packages

今回プロジェクトはgradleで管理していますが、GitHub packagesのサポート対象になっています。
他にもnpm,gem,mvnなど利用可能です。

https://docs.github.com/ja/packages/learn-github-packages/introduction-to-github-packages#support-for-package-registries

build.gradleファイルの設定

gradle groovyを利用した例

plugins {
    id("maven-publish")
}
publishing {
    repositories {
        maven {
            name = "GitHubPackages"
            url = uri("https://maven.pkg.github.com/OWNER/REPOSITORY")
            credentials {
                username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
                password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
            }
        }
    }
    publications {
        mavenJava(MavenPublication) {
            groupId = 'com.owner'
            artifactId = 'hoge'
            version = '1.0.0'
            from(components.java)
        }
    }
}
tasks.withType(Jar) {
    from sourceSets.main.output // src.main配下のファイル群がGitHub Packagesに登録されます。
}

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#example-using-gradle-groovy-for-a-single-package-in-a-repository

packageの管理にはPAT()が必要なため必要なスコープを付与する
※付与する際に、classicで付与する。

You need an access token to publish, install, and delete private, internal, and public packages.

https://docs.github.com/ja/packages/working-with-a-github-packages-registry/working-with-the-gradle-registry#authenticating-to-github-packages

より具体的なPATに関する権限についてはこちら
https://docs.github.com/ja/packages/learn-github-packages/about-permissions-for-github-packages#about-scopes-and-permissions-for-package-registries

Gradle Maven Publish Plugin

Maven Publish プラグインは、ビルド成果物を Apache Maven リポジトリに公開する機能を提供してくれている。

https://docs.gradle.org/current/userguide/publishing_maven.html

Custom MavenArtifact

パブリケーションに含めるカスタム MavenArtifact を作成することも可能です。

artifactで指定したtaskの出力を公開する実装例

plugins {
    id 'maven-publish'
}

task sourceJar(type: Jar) {
  from sourceSets.main.allSource
  archiveClassifier.set("sources")
}

publishing {
  publications {
    maven(MavenPublication) {
      artifact sourceJar // sourceJarタスクの出力を公開する
    }
  }
}

コンシューマー側でソースのダウンロードも可能になります。

https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPublication.html#org.gradle.api.publish.maven.MavenPublication:artifact(java.lang.Object)

Tasks or Task

例ではtaskで定義されていますがtasksでも実装できます。

tasks.register("hello", TaskType) {
    doLast {
        println "Hello, World!"
    }
}

https://docs.gradle.org/current/userguide/more_about_tasks.html

Taskの種類は他にもたくさん用意されています。

https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html

GitHub Packagesに登録したライブラリをコンシューマー側でinstallする

登録したライブラリをinstallするには、他ライブラリをinstallする場合と同様に指定します。

dependencies {
    testImplementation 'com.owner:hoge:1.0.0'
}

PATも必要になるので設定していきます。

repositories {
    maven {
        name = "GitHubPackages"
        url = uri("https://maven.pkg.github.com/OWNER/REPOSITORY")
        credentials {
            username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
            password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
        }
    }
}

この状態でbuildを行うと、IDE(IntelliJ)などでinstallされていることが確認できます。

※IntelliJでは、ファイルツリーView > External Libralies配下にダウンロードされます。

GitHub Packagesに登録したライブラリのステップを利用する

今回GitHub Packagesに登録したStep群は、buildを行いダウンロードさえ完了していれば
specファイルからライブラリのSTEPを呼び出すことができます。

## Google検索
* Googleを開く // 共通ライブラリのSTEP

Other

ストレージについて

プラン Storage データ転送 (月あたり)
GitHub Free 500MB 1GB
GitHub Pro 2GB 10 GB

https://docs.github.com/ja/billing/managing-billing-for-your-products/managing-billing-for-github-packages/about-billing-for-github-packages#github-packages-の課金について

使用料の確認

設定のBilling and Plansから確認できる

https://docs.github.com/ja/billing/managing-billing-for-your-products/managing-billing-for-github-packages/viewing-your-github-packages-usage#organizationの-github-packages-の使用状況を表示する

利用上限の管理

設定のBilling and Plans > Manage spending limitからアラートの設定や上限管理が可能

https://docs.github.com/ja/billing/managing-billing-for-your-products/managing-billing-for-github-packages/managing-your-spending-limit-for-github-packages#organizationの-github-packages-に対する利用上限を管理する

Discussion