JetBrains Space ヘルプ

Java および Kotlin 用の Gradle

前提条件

  • Java または Kotlin で書かれたプロジェクトがあります。

  • プロジェクトでは Gradle を使用します。Gradle ラッパー gradlew はプロジェクトのルートディレクトリに存在します。

  • アーティファクトを Space パッケージに公開する場合は、プロジェクトに Maven リポジトリがあることを確認してください。

対象イメージ

通常、プロジェクトを構築してテストを実行するために必要なのは、プロジェクトのルートディレクトリで gradle build コマンドを実行することだけです。オートメーションでこれを行うには 3 つの方法があります。

プロジェクトのビルド後の次のタスクは通常、ビルドアーティファクトの公開です。

(基本) プロジェクトをビルドし、Gradle ラッパーを使用してテストを実行する

Gradle プロジェクトを構築する最も簡単な方法は、プロジェクトルートで Gradle ラッパーを使用することです。コンテナーイメージには JRE/JDK 11 以降が必要であることに注意してください。例:

job("Build and run tests") { // run 'gradlew build' gradlew("amazoncorretto:17-alpine", "build") }

ラッパーが見つからない場合、ジョブは失敗します。

プロジェクトをビルドし、Kotlin スクリプトを使用してテストを実行する

ビルドスクリプトに Kotlin で記述された複雑なロジックが含まれている場合は、Space Gradle API を使用して Gradle コマンドを実行する必要があります。ベストプラクティスは、gradlew() 関数を呼び出して Gradle ラッパーを使用することです。これにより、Gradle が含まれていないコンテナーイメージを使用できるようになります (JRE/JDK は引き続き必要です)。

job("Build and run tests") { container(displayName = "Run gradle build", image = "amazoncorretto:17-alpine") { kotlinScript { api -> // here can be your complex logic api.gradlew("build") } } }

プロジェクトをビルドし、カスタムコンテナーイメージでテストを実行する

場合によっては、ビルドを実行するためにカスタム Docker イメージ (例: パッケージに保存されている) を使用する必要がある場合があります。このシナリオでは、自動化が内部でどのように機能するかを理解する必要があります。主なトリックは、テスト実行結果を受け取り、それを自動化に渡すことです。gradlew コマンドを使用してビルドを実行する場合 (前述のように)、これは init.gradle で初期化された特別なテスト結果リスナーによって解決されます。ブートストラップジョブには追加の手順が追加されます。つまり、この init.gradle ファイルを使用して Gradle を初期化します。カスタム Docker コンテナーを実行する場合は、これを手動で行う必要があります。つまり、Gradle 初期化をオートメーションスクリプトに追加します。

job("Build and run tests") { container(displayName = "Run gradle build", image = "mycompany.registry.jetbrains.space/p/pkey/mydocker/myimage") { shellScript { content = "gradle build --init-script $mountDir/system/gradle/init.gradle" } } }

Maven アーティファクトを Space パッケージに公開する

  1. プロジェクトの build.gradle ファイルを開きます。

  2. Maven プラグインへの参照を追加します。

    apply plugin: 'maven-publish'
  3. publishing セクションで、パッケージのプロパティを指定します (生成されるパッケージ名は groupId:artifactId になります)。例: .jar ファイルを公開したいとします (長さのため、セクションの内容は縮小されています)。

    publishing { publications { maven(MavenPublication) { groupId = 'org.company' artifactId = 'sample' version = "0.9-SNAPSHOT" from components.java pom { name = 'My Library' description = 'A description of my library' ... } } } }
  4. publishing セクションの repositories で、環境変数を使用してリポジトリ URL と資格情報を指定します。

    publishing { repositories { maven { credentials { // Automation has a special account for authentication in Space // account credentials are accessible via env vars username = "$System.env.JB_SPACE_CLIENT_ID" password = "$System.env.JB_SPACE_CLIENT_SECRET" } url = "https://maven.pkg.jetbrains.space/mycompany/p/projectkey/my-maven-repo" } } }

  5. プロジェクトの .space.kts ファイルを編集します。例:

    job("Build and publish") { container(displayName = "Run publish script", image = "gradle") { kotlinScript { api -> api.gradle("build") api.gradle("publish") } } }

Maven アーティファクトを外部リポジトリに公開する

アーティファクトを外部 Maven リポジトリに公開することは、Space Packages リポジトリに公開することとほぼ同じです。唯一の違いは、資格情報をシークレットとパラメーターストレージのリポジトリに保存する必要があることです。

  1. 1 – 3 から Maven アーティファクトを Space パッケージに公開するまでの手順を繰り返します。

  2. パラメーターとシークレットを作成するは、スクリプトが外部リポジトリにアクセスするために使用する必要があるユーザー名とパスワードを保存します。

    Secrets and parameters
  3. build.gradlepublishingrepositories では、環境変数を使用して外部リポジトリの URL と資格情報を指定します。

    publishing { repositories { maven { credentials { // we'll set these env vars in .space.kts username = "$System.env.USERNAME" password = "$System.env.PASSWORD" } url = "https://externalrepo.example.com/my-maven-repo" } } }

  4. プロジェクトの .space.kts ファイルを編集します。例:

    job("Build and publish") { container(displayName = "Run publish script", image = "gradle") { // env vars for build.gradle env["USERNAME"] = "{{ project:repo_user }}" env["PASSWORD"] = "{{ project:repo_password }}" kotlinScript { api -> api.gradle("build") api.gradle("publish") } } }

カスタムの場所にある Gradle ラッパー

デフォルトでは、プロジェクトの gradlew ラッパーはプロジェクトのルートディレクトリにあります。ラッパーを実行できるようにするために、オートメーションはジョブの実行中に gradlew ファイルの実行フラグを設定します。プロジェクト内で gradlew ファイルが別のディレクトリ ( ./subfolder/gradlew など) にある場合、オートメーションはフラグを自動的に設定しません。その結果、オートメーションがラッパーを実行しようとすると、ジョブは Permission denied で失敗します。課題を解決するには、以下の手順に従ってください。

  1. プロジェクトソース内の gradlew ファイルの実行フラグを設定します。例: git を使用する場合 (プロジェクトルートでコマンドを実行):

    git update-index --chmod=+x ./subfolder/gradlew git commit -m "Make gradlew executable" git push origin main
  2. プロジェクトの .space.kts ファイルで、gradlew ラッパーの場所を作業ディレクトリとして設定します。例:

    job("Run gradle build") { container(displayName = "Run gradlew from another dir", image = "gradle") { // path to gradlew relative to project root workDir = "subfolder" kotlinScript { api -> api.gradlew("build") } } }