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

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

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

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/orchestrated-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スクリプト、これスクリプトはコンテナ内で実行されます。そしてドッカー文書使用された画像です。

関連情報