Jenkins 2.0で複数のコンテナーで構成されるDocker対応ビルドを実行する方法を探しています。
Docker Compose in Pipeline、またはパイプライン用のCloudBees dockerプラグインをネイティブサポートする予定はありますか。
または、明示的な呼び出しsh docker-compose...
?たぶんtry... finally
サービスのライフサイクルをさらに制御します。
編集:最初の答えはジェンキンスでドッカーコンテナを構築する方法を提案することでした。これはここで必要なものではありません。私(EngineerDollery)は、アプリをデプロイしてエンドツーエンドのテストを実行できるように、composeを使用してジェンキンスでターゲットプラットフォームを立ち上げたいと考えています。
Jenkinsバグ追跡 で検索した後、 JENKINS-35025 はdocker-compose.yml
は、 maven build を使用して、Dockerコンテナでジョブを実行するときに考慮されます。
Jenkinsを使用したCIパイプラインの作成 も参照してください。これは、Jenkinsサーバーにdocker-composeがインストールされていることを前提としています。
注:1年後(2017年8月)、 docker-composeはDocker Pipelineプラグインではまだサポートされていません
手動インストール
docker-cli
およびdocker-compose
ホストのバージョンと同じバージョンが今のところソリューションです...
以下は、内部でdockerを実行するjenkinsコンテナーを実行するファイルです。
docker run \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
getintodevops/jenkins-withdocker:lts
参照: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
私は同様の問題に直面しています、私はこれを見つけました https://reinout.vanrees.org/weblog/2017/10/03/docker-compose-in-jenkins.html 何が関係しているか分からない。
私の問題は開発中のテストであり、Jenkinsでのテストも自動化します。また、docker-composeを使用していくつかのphpスクリプトとmysqlサーバーを起動し、分離されたテストを実行します(現時点ではphpunit)。
私はこれを達成できると思いました
docker network create
を使用)docker run mysql --network=netname --name=mysqlmachine
mysqlmachine
をホストとして参照するjenkinsによってスクリプトを実行します。しかし、これは、dbデータをセットアップし、dbデータをクリーンアップする必要があることを意味します。また、不要な場合でも常にmysqlmachineに残し、RAMリソースを消費します。パイプラインを定義するJenkinsfileのdocker start mysqlmachine
およびdocker stop mysqlmachine
コマンドで最後の問題を解決できます。
しかし、再び、ジェンキンスが実行されているドッカーにシェルを実行すると、docker
コマンドが見つかりません
私にとっては、より良いものを見つけることができないまで、実行可能なソリューションです
更新: https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin ソリューションを試してみますが、ほとんど必要なものがあります
更新08.02:Alexander Zeitlerが示唆するように、使用
agent {
docker {
image 'pdmlab/jenkins-node-docker-agent:6.11.1'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
jenkinsファイルでは、docker-composeコマンドの使用を許可します:docker内のdocker、これはほとんどの場合、dockerの近くのdockerです: DockerのDocker-ボリュームが機能しない:第1レベルのコンテナ内のファイルがいっぱい、 2段目は空
しかし、私はジェンキンスを特別な方法で実行する必要のない別のアプローチを使用することを好みました。
パイプラインは言う:
stage('Test') {
steps {
sh './build_docker.sh jenkinstests'
}
}
build_docker.shは次のことを行います。
jenkinstests)
docker volume create idealodbconn
docker run -v idealodbconn:/data --name helper busybox true
docker cp ./dbconn/db249.json helper:/data
docker rm helper
docker-compose -f services/docker-compose-jenkins.yml up \
--abort-on-container-exit \
--exit-code-from idealoifapi
docker-compose -f services/docker-compose-jenkins.yml rm -f
docker volume rm idealodbconn
;;
また、--abort-on-container-exit
は、docker-compose-jenkins.ymlに定義された1つのコンテナが終了すると終了すると言い、--exit-code-from idealoifapi
はidealoifapiイメージから終了コードを取得すると言います。
以上です。不足している部分は、おそらくdocker-compose-jenkins.ymlのボリュームの使用であり、外部にあります:true:
volumes:
idealodbconn:
external: true