web-dev-qa-db-ja.com

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

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

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

ケース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プラグインを使用することはできません。

18
marcv81

Jenkinsでdockerビルドを実行する最も簡単な方法は、パイプラインジョブを使用することです。 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

3
velsim

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

  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を確認できます。スクリプトコンテナ内で実行されるスクリプト 、および ドッカーファイル 使用された画像。

2
maxschlepzig