JenkinsのDockerコンテナーでビルドを実行する方法


18

Jenkinsを使用して、DockerコンテナでC ++プロジェクトを構築しようとしています。Jenkinsでのビルド、またはJenkinsの外のコンテナでのビルドに問題はありません。

以下は私が試したものです。わかりやすくするために、ボリュームマッピングを省略しています。

事例1

次のコマンドは、シェルでビルドを正常に実行します。

docker run --rm --interactive=true --tty=true $IMAGE make

ただし、Jenkinsで「シェルの実行」ステップとして実行すると、Dockerは次のエラーを返します。

cannot enable tty mode on non tty input

事例2

次のコマンドは前のものと似ていますが、対話機能を無効にします。

docker run --rm $IMAGE make

Jenkinsはビルドを正常に実行できます。ただし、ビルドを中止すると深刻な問題が発生します。ビルドは直ちに中止としてマークされますが、コンテナはビルドが完了するまで実行を続けます。また、コンテナは終了後に削除されません

シェルで実行すると、コマンドは正常にビルドされますが、コマンドを中断することはできません。また、コンテナは終了後に削除されます。

質問

JenkinsのDockerコンテナでビルドをきれいに実行し、ビルドを中止する機能を保持する方法を誰もが知っていますか?

Docker呼び出しはスクリプト内にあり、簡単に抽出できないため、Jenkinsプラグインを使用することはオプションではありません。


1
たぶん、タスクをコンテナを削除するビルド後のジョブで?そして、ビルドを中止する場合、おそらくすべての偽のコンテナを停止して削除する特別なビルドがありますか?これは最適ではありませんが、少なくとも、簡単に設定できる回避策です。:-)
lgeorget

1
これはcleanの私の定義とは完全には一致しません:)しかし、私はその提案に感謝し、確かに有効な回避策です。
marcv81

回答:


3

Jenkinsでドッカービルドを実行する最も簡単な方法は、パイプラインジョブを使用することです。Docker環境とコンテナを制御できる多くの組み込みプラグインがあります。

いくつかの例は

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

詳細:https : //www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker


2

次のワークフローを実装できます。

  1. Dockerコンテナを作成し、簡単に参照できるように名前を指定します(たとえば、スクリプトで)
  2. 起動して、コンテナを実行し続けるエントリポイントとして何かを使用します
  3. docker exec container cmd ...ビルドおよびテストコマンドの発行に使用
  4. コンテナを停止します
  5. 画像を削除する

これdocker exec ...は、ネットワークマシンへのリモートシェルアクセスのようなものです。デフォルトでは、対話型ではなく、ttyも割り当てられません。これは、テストスイートのコンパイルと実行に適しています。コマンドは、コンテナ内で実行されたコマンドの終了ステータスを適切に転送します。

ビルドジョブは、次の方法で中止できます。

  • docker stop container (TERMとKILLを送信し、その間に待機します)、または
  • docker kill container、 あるいは
  • docker exec container pkill someexecutable

具体的なコマンドを使用したワークフロー:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

このワークフローを使用する実際の例については、この.travis.ymlファイル、実際のCIスクリプトコンテナ内で実行されているスクリプト、および使用済み画像のドッカーファイルを確認できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.