解決したい問題点
Jenkins pipelineで agentにDocker Containerを指定・実行した場合、
WorkspaceをCleanしているのにかかわらず、前回実行時のファイルが残っている。
この問題を解決するための記事です。
結論
私は ws("${WORKSPACE}/${BUILD_NUMBER}/${EXECUTOR_NUMBER}")
を活用して、ディレクトリの分離を行いました。
pipeline {
stages {
stage("docker agent sample") {
agent {
docker {
image 'hoge.com/sample-run:latest'
label env.NODE_LABEL
args "--rm -v /etc/hosts:/etc/hosts:ro -v ${WORKSPACE}:${WORKSPACE}" // ホストの/etc/hostsを読み取り専用でマウント
}
}
steps {
ws("${WORKSPACE}/${BUILD_NUMBER}/${EXECUTOR_NUMBER}") {
script {
resultText = "Currrent dir is ${WORKSPACE}/${BUILD_NUMBER}/${EXECUTOR_NUMBER}"
writeFile(file: "result.log", text: resultText)
archiveArtifacts artifacts: "result.log", allowEmptyArchive: true
}
}
}
}
}
}
原因
JenkinsがContainerを起動するときに -w ${WORKSPACE}
が強制的に付与されます
$ docker run -t -d -u 0:0 --rm -v /etc/hosts:/etc/hosts:ro -w $WORKSPACE --volumes-from xxxxx -e ******** hoge.com/sample-run:latest cat
かつ、docker argで指定したとしても、パメーターをオーバーライドしてくるので、下記の様に-w オプションを付与しても 効果なしです
agent {
docker {
image 'hoge.com/sample-run:latest'
label env.NODE_LABEL
args "-w ${WORKSPACE}/${BUILD_NUMBER}/${EXECUTOR_NUMBER}"
}
}