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プラグインを使用することはできません。
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
次のワークフローを実装できます。
docker exec container cmd ...
ビルドおよびテストコマンドを発行します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を確認できます。スクリプト 、 コンテナ内で実行されるスクリプト 、および ドッカーファイル 使用された画像。