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" } } } }

関連ページ:

セルフホスト型ワーカー

セルフホスト型ワーカーは、Windows、Linux、macOS 上の独自のマシンで実行できる軽量エージェントです。セルフホスト型ワーカーは Space Automation に接続し、ジョブとプロジェクトのソースコードを取得してジョブを実行し、結果を Space にレポートします。セルフホスト型ワーカーを使用すると、コンテナーでは不可能な CI/CD ワークフローを実行できます。例:Windows 上で完全な .NET フレームワークアプリケーションを構築します。特定のハードウェアを使用する...

実行環境

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

プロジェクトに参加する

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

Helm チャート

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