JetBrains Space ヘルプ

Docker

前提条件

  • Docker イメージを定義する Dockerfile は、プロジェクトソースに保存されます。

実行環境

Docker の CI/CD シナリオ

Docker ビルドを実行する方法

オートメーションでは、実行環境に応じて、Docker イメージを構築および公開するための 2 つの異なる方法が提供されます。

job.host.dockerBuildPush

job.host.dockerBuildPush を使用すると、セルフホストまたは Space Cloud ワーカーで Docker ビルドを実行できます。技術的には、これは docker build および docker push コマンドを実行する job.host.shellScript ブロックの DSL ラッパーです。

job.kaniko に対する長所:

  • Windows Docker イメージをビルドすることができます (ホストマシンが Windows 上で実行されている場合)。

  • イメージの依存関係の構築がより簡単かつ迅速になります – 必要なツールをすべてホストマシンにプレインストールできるため、同じ host ステップを使用してイメージを構築して公開するだけでなく、このイメージに必要なアーティファクトを構築することもできます。

    job.kaniko の場合は、別の手順でイメージアーティファクトを構築し、ファイル共有経由で job.kaniko に提供する必要があります。

  • Kaniko では、クラシックな Docker と比べて動作が異なる場合があります。

job.kaniko

job.kaniko を使用すると、プリインストールされた蟹子(英語)ツールを使用してコンテナーで Docker ビルドを実行できます。技術的には、これは特別なイメージに基づいてコンテナー内で実行される job.container ステップです。host.dockerBuildPush ではなく job.kaniko を使用する主な理由は、後者を使用できない場合です。例: 会社がオンプレミスの Space を使用しており、セルフホスト型ワーカーの使用を許可していない場合。

Docker イメージをビルドして Space パッケージに公開する

以下のジョブは、最初に ./docker/config/Dockerfile で定義されたイメージを構築し、次に公開します。レジストリが同じプロジェクトに属している場合、オートメーションジョブでは Space Packages レジストリでの認証が必要ないことに注意してください。

job("Build and push Docker") { host("Build and push a Docker image") { dockerBuildPush { // by default, the step runs not only 'docker build' but also 'docker push' // to disable pushing, add the following line: // push = false // path to Docker [[[context|https://docs.docker.com/engine/reference/commandline/build/#extended-description]]] (by default, context is working dir) context = "docker" // path to Dockerfile relative to the project root // if 'file' is not specified, Docker will look for it in 'context'/Dockerfile file = "docker/config/Dockerfile" // [[[build-time variables|https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg]]] args["HTTP_PROXY"] = "http://10.20.30.2:1234" // [[[image labels|https://docs.docker.com/config/labels-custom-metadata/]]] labels["vendor"] = "mycompany" // to add a raw list of additional build arguments, use // extraArgsForBuildCommand = listOf("...") // to add a raw list of additional push arguments, use // extraArgsForPushCommand = listOf("...") // [[[image tags|https://docs.docker.com/engine/reference/commandline/tag/]]] tags { // use current job run number as a tag - '0.0.run_number' +"mycompany.registry.jetbrains.space/p/prjkey/mydocker/myimage:1.0.${"$"}JB_SPACE_EXECUTION_NUMBER" } } } }
job("Build and push Docker") { // special step that runs a container with the Kaniko tool kaniko { // build an image build { // path to Docker [[[context|https://docs.docker.com/engine/reference/commandline/build/#extended-description]]] (by default, context is working dir) context = "docker" // path to Dockerfile relative to 'context' // this option is equivalent to the Kaniko's --dockerfile argument dockerfile = "config/Dockerfile" // [[[build-time variables|https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg]]] args["HTTP_PROXY"] = "http://10.20.30.2:1234" // [[[image labels|https://docs.docker.com/config/labels-custom-metadata/]]] labels["vendor"] = "mycompany" } // push the image to a Space Packages repository (doesn't require authentication) push("mycompany.registry.jetbrains.space/p/prjkey/mydocker/myimage") { // [[[image tags|https://docs.docker.com/engine/reference/commandline/tag/]]] tags { // use current job run number as a tag - '0.0.run_number' +"0.0.\$JB_SPACE_EXECUTION_NUMBER" } // see [[[example|https://www.jetbrains.com/help/space/automation-environment-variables.html#example]]] on how to use branch name in a tag } } }

イメージの依存関係を作成し、Docker イメージをビルドして Space パッケージに公開する

以下のジョブは、Gradle ビルドによって ./build ディレクトリにアーティファクトが生成されることを示しています。次に、ジョブはアーティファクトを含む Docker イメージをビルドします。たとえば、アーティファクトは DockerfileADD ディレクティブを使用して追加できます (図示せず)。Dockerfile はプロジェクトルートにあります。

job("Build and push Docker") { // both 'host.shellScript' and 'host.dockerBuildPush' run on the same host host("Build artifacts and a Docker image") { // Gradle build creates artifacts in ./build shellScript { content = """ ./gradlew build """ } dockerBuildPush { // Note that if Dockerfile is in the project root, we don't specify its path. // We also imply that Dockerfile takes artifacts from ./build and puts them to image // e.g. with 'ADD /build/app.jar /root/home/app.jar' val spaceRepo = "mycompany.registry.jetbrains.space/p/prjkey/mydocker/myimage" tags { +"$spaceRepo:0.${"$"}JB_SPACE_EXECUTION_NUMBER" +"$spaceRepo:lts" } } } }

job.kaniko の場合、ジョブには 2 つのステップが含まれている必要があります。最初のステップ (job.container) はアーティファクトを構築してファイル共有に配置し、2 番目のステップ (job.kaniko) はファイル共有からファイルを取得してイメージを構築します。

job("Build and push Docker") { container(displayName = "Run gradle build", image = "amazoncorretto:17-alpine") { // run gradle build and copy artifacts to the file share shellScript { content = """ ./gradlew build cp -r build ${'$'}JB_SPACE_FILE_SHARE_PATH """ } } kaniko { // This is a shellScript that runs before 'docker build' and 'docker push'. // Here we use it to copy the Gradle output from the file share to the // context directory ('build'). Initially, the 'build' directory in this // container is empty (we ran 'gradlew build' in another step, i.e. container). beforeBuildScript { content = "cp -r ${'$'}JB_SPACE_FILE_SHARE_PATH build" } // We imply that Dockerfile takes artifacts from ./build and puts them to image // e.g. with 'ADD /build/app.jar /root/home/app.jar' build { context = "build" } push("mycompany.registry.jetbrains.space/p/prjkey/mydocker/myimage") { val spaceRepo = "mycompany.registry.jetbrains.space/p/prjkey/mydocker/myimage" tags { +"$spaceRepo:0.${"$"}JB_SPACE_EXECUTION_NUMBER" +"$spaceRepo:lts" } } } }

Docker イメージをリモートレジストリに公開する (Docker Hub)

以下の例は、Docker Hub へのイメージの公開を示しています。ただし、認証が必要な外部レジストリの場合も手順は同じです。

認証が必要なレジストリに公開するには、スクリプトはまずこのリポジトリにログインする必要があります。これを行うには、スクリプト自体で docker login を実行するか、レジストリへの接続を作成して dockerRegistryConnections ブロックで使用します (推奨)。

  1. Docker Hub で、Write 権限を持つアクセストークンを作成します(英語)。作成したトークンを安全な場所に保存します。

    Docker Hub token
  2. Docker Hub への接続を作成します。

    1. 目的のプロジェクトを開きます

    2. プロジェクトのサイドバーメニューで、設定を選択し、次に Docker レジストリ接続を選択します。

    3. 新規接続をクリックし、接続設定を指定します。

      • キー : ジョブ内でこの接続を参照するために使用する一意の接続名 (例: docker_hub または some_registry)

      • Docker レジストリサーバー : リモート Docker レジストリの URL。Docker Hub の場合は index.docker.io です

      • ユーザー名パスワード : 以前に作成したユーザー名とパスワード (トークン)。

  3. プロジェクトの .space.kts を編集します。

    job("Publish to Docker Hub") { host("Build artifacts and a Docker image") { // Before running the scripts, the host machine will log in to // the registries specified in connections. dockerRegistryConnections { // specify connection key +"docker_hub" // multiple connections are supported // +"one_more_connection" } dockerBuildPush { labels["vendor"] = "mycompany" tags { +"myrepo/hello-from-space:1.0.${"$"}JB_SPACE_EXECUTION_NUMBER" } } } }

job.kaniko はホストマシンから分離されたコンテナーで実行されるため、dockerRegistryConnections を使用して Docker Hub にログインすることはできないことに注意してください。代わりに、config.json ファイルで Docker Hub 資格情報を指定する必要があります。

  1. Docker Hub で、Write 権限を持つアクセストークンを作成します(英語)。作成したトークンを安全な場所に保存します。

    Docker Hub token
  2. Space で、2 つのシークレットを作成します

    • dockerhub_user : Docker Hub ユーザー名。

    • dockerhub_token : 手順 1 で作成した Docker Hub トークン。

  3. プロジェクトの .space.kts を編集します。

    job("Publish to Docker Hub") { kaniko("Docker build and push") { // assign project secrets to environment variables env["HUB_USER"] = Secrets("dockerhub_user") env["HUB_TOKEN"] = Secrets("dockerhub_token") // put auth data to Docker config beforeBuildScript { content = """ B64_AUTH=${'$'}(echo -n ${'$'}HUB_USER:${'$'}HUB_TOKEN | base64 -w 0) echo "{\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"${'$'}B64_AUTH\"}}}" > ${'$'}DOCKER_CONFIG/config.json """ } build { labels["vendor"] = "mycompany" } //in push, specify repo_name/image_name push("myrepo/hello-from-space") { tags{ +"1.0.\$JB_SPACE_EXECUTION_NUMBER" } } } }

関連ページ:

セルフホスト型ワーカー

A self-hosted worker is a lightweight agent that you can run on your own machine on Windows, Linux, or macOS. The self-hosted worker connects to Space Automation, gets jobs and the project source code, runs the jobs, and reports results back to Space...

実行環境

Space Automation の実行環境は、ワーカーのコンセプトに基づいています。ワーカーは、Space Automation に接続し、ジョブとソースコードを取得し、ジョブを実行して、結果を Space にレポートする軽量エージェントです。ワーカーは、Space Automation Cloud の仮想マシン、独自のセルフホストマシン、および Docker コンテナーで実行できます。次の表は、考えられる実行環境をまとめたものです。Space クラウドワーカー (オンプレミスの Space で...

プロジェクトに参加する

あるプロジェクトに貢献を開始したい場合は、そのプロジェクトに参加する必要があります。つまり、そのプロジェクトのメンバーになる必要があります。貢献しようとしているプロジェクトに移動します。すでにメンバーである場合は、プロジェクトのページのプロジェクトメンバーにリストされます。そうでない場合は、プロジェクト管理者に連絡してメンバーシップを依頼してください。プロジェクト管理者を確認するには、プロジェクトページでメンバーウィジェットをクリックします。プロジェクトを探す:すべてのプロジェクトは名前で見つ

Helm チャート

前提条件 Helm チャートは、プロジェクトソースの別のディレクトリに保存されます。チャートを Space パッケージに公開する場合は、プロジェクトに Docker レジストリがあることを確認してください。対象イメージ Helm を含む任意のイメージ。例: アルパイン /helm。Helm チャートを操作する場合の一般的な CI/CD タスクは、それをレジストリに公開することです。Space Automation を使用すると、チャートを Space Package または任意の外部レジストリに公開でき...