はじめに
Jenkinsを使って、Mavenコンテナ内でビルドしていました。
どうせならDocker imageまでも一気通貫でやりたくて作成。
思っていたよりも作成に時間がかかった。
リポジトリ構成
src
Dockerfile
Jenkinsfile
pom.xml
gitリポジトリにソースと上記のファイルを格納しています。
Dockerfile
FROM tomcat:jdk14-openjdk
COPY target/*.war /usr/local/tomcat/webapps/
ビルドでできたwarファイルをwebapps配下に格納しています。
コードと同じリポジトリで管理します。
Jenkinsfile
pipeline {
agent any
stages {
stage('delete_workspace') {
steps {
deleteDir()
}
}
stage('build') {
agent {
docker {
label 'master'
image 'maven:3.6.3-openjdk-14'
}
}
steps {
// Run Maven on a Unix agent.
sh "mvn clean package"
}
post {
success {
archiveArtifacts 'target/*.war'
}
}
}
stage('docker build') {
agent { label 'master'}
steps {
sh 'docker build -t test-tomcat:0.1 .'
}
//// 事後に削除する場合。
// post {
// always {
// deleteDir()
// }
// }
}
}
}
Declarative Pipelineで作成。
stage
エージェント指定
pipeline {
agent any
stages {
agent any がないとジョブが失敗したので記載している。
delete_workspace
stage('delete_workspace') {
steps {
deleteDir()
}
}
事前にworkspaceを削除、事後に必ずやるパターンもあるがジョブにエラーが出たとき、削除されると個人的に切り分けが困るので、ジョブの事前にやる派です。
build
agent {
docker {
label 'master'
image 'maven:3.6.3-openjdk-14'
}
}
マスターノードにてでmavenコンテナを起動しています。
地味にノードの指定がこの位置だと気づくのに時間がかりました。
steps {
// Run Maven on a Unix agent.
sh "mvn clean package"
}
post {
success {
archiveArtifacts 'target/*.war'
}
}
maven ビルドして、成果物を保存しています。
docker build
stage('docker build') {
agent { label 'master'}
steps {
sh 'docker build -t test-tomcat:0.1 .'
}
//// 事後に削除する場合。
// post {
// always {
// deleteDir()
// }
// }
}
マスターでdockerを起動したので、agentをマスターに指定。
ホストのworkspace配下にmavenコンテナでビルドした成果物とDockerfileが格納されているので、
そのままdocker build を実行。
まとめ
コンテナないでビルドしてもホストのworkspaceにビルド結果が残るのを知らなかったので、
すっごく作成に時間がかかった。
また、jenkinsでdockerを利用して色々やるにはScripted Pipelineで書かなければいけないことがわかった。
jenkinsに限っては、pipelineで頑張るより、Ansibleやdocker-composeのコマンドを呼び出すほうがシンプルだし、
保守性も高いのではと感じた。実際はどっちなのだろうか。
参考文献