私はBookStoreJenkinsを通して展開する必要があるSpring Bootプロジェクトを持っています。ローカルマシン(macOS)にインストールされたDockerと、次のように作成されたJenkinsfile
pipeline
{
agent
{
docker
{
image 'maven:3-Alpine'
//This exposes application through port 8081 to outside world
args '-u root -p 8081:8081 -v /var/run/docker.sock:/var/run/docker.sock '
}
}
stages
{
stage('Build')
{
steps
{
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test')
{
steps {
//sh 'mvn test'
sh 'echo "test"'
}
post {
always {
//junit 'target/surefire-reports/*.xml'
sh 'echo "test"'
}
}
}
stage('Deliver for development')
{
when {
branch 'development'
}
steps {
sh './jenkins/scripts/deliver-for-development.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
}
}
stage('Deploy for production')
{
when {
branch 'production'
}
steps {
sh './jenkins/scripts/deploy-for-production.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
}
}
stage('Deliver') {
when {
branch 'production'
}
steps {
sh 'bash ./jenkins/deliver.sh'
}
}
}
}
Jenkinsでマルチブランチパイプラインを作成し、実行しようとすると、次のエラーが発生しました
/Users/Shared/Jenkins/Home/workspace/BookStore_master-VPWQ32ZZPV7CVOXNI4XOB3VSGH56MTF3W34KXKZFJKOBMSGLRZQQ@tmp/durable-70dd5a81/script.sh: line 2: docker: command not found
script returned exit code 127
これは、ローカルマシンで使用可能なdockerとして奇妙に見えますが、以下に示すように、適切な詳細を含むGlobal Tool Configurationセクションも構成されています。私はいくつかの投稿を調べましたが、これまでのところ解決策はありませんでした。
Global Tool ConfigurationセクションからDockerとMavenの値を取得し、以下に示すように環境PATHに追加することで、これを解決できました
更新Jenkinsfile:
node {
stage('Initialize')
{
def dockerHome = tool 'MyDocker'
def mavenHome = tool 'MyMaven'
env.PATH = "${dockerHome}/bin:${mavenHome}/bin:${env.PATH}"
}
stage('Checkout')
{
checkout scm
}
stage('Build')
{
sh 'uname -a'
sh 'mvn -B -DskipTests clean package'
}
stage('Test')
{
//sh 'mvn test'
sh 'ifconfig'
}
stage('Deliver')
{
sh 'bash ./jenkins/deliver.sh'
}
}
私は同じ問題を抱えていましたが、このスレッドのおかげで解決できました https://stackoverflow.com/a/50029962/6943587 。
Dockerラベルを指定する必要があります。これは、どのスレーブにdockerがあるかを示しています。これを行うには、私が知っている2つの方法があります。
Dockerスレーブラベルを使用して、エージェントをdockerイメージとして設定します。
// Jenkinsfile
pipeline {
// Assign to docker slave(s) label, could also be 'any'
agent {
label 'docker'
}
stages {
stage('Docker node test') {
agent {
docker {
// Set both label and image
label 'docker'
image 'node:7-Alpine'
args '--name docker-node' // list any args
}
}
steps {
// Steps run in node:7-Alpine docker container on docker slave
sh 'node --version'
}
}
stage('Docker maven test') {
agent {
docker {
// Set both label and image
label 'docker'
image 'maven:3-Alpine'
}
}
steps {
// Steps run in maven:3-Alpine docker container on docker slave
sh 'mvn --version'
}
}
}
}
Jenkinsのドキュメント here に従って、「パイプラインモデル定義」の下のJenkins設定で「dockerラベル」を設定します。これは、このラベルを持つスレーブでのみパイプラインビルドを実行します。その後、次のようにパイプラインを作成できます...
// Jenkinsfile
pipeline {
// "Top-level" agent is assigned to docker slaves via Jenkins pipeline configuration
agent none
stages {
stage('Docker node test') {
agent {
docker {
image 'node:7-Alpine'
args '--name docker-node' // list any args
}
}
steps {
// Steps run in node:7-Alpine docker container on docker slave
sh 'node --version'
}
}
stage('Docker maven test') {
agent {
docker {
image 'maven:3-Alpine'
}
}
steps {
// Steps run in maven:3-Alpine docker container on docker slave
sh 'mvn --version'
}
}
}
}
お役に立てれば
Jenkinsfileは、将来削除または編集される可能性のあるJenkinsパイプライン構成に依存せずに、Dockerエージェントを実行するマシンを構成するため、オプション1よりもオプション1が優先されます。
[グローバルツール設定]セクションで自動インストールオプションを選択したため、Jenkinsはシステム内のdockerを探しません。
この問題は、[グローバルツール設定]セクションでdockerの自動インストールオプションをオフにすることで解決できます。
スクリーンショットの例を以下に示します。
自動化されたdockerインストーラーに問題があるようです。 CentOS 7のdockerで同じ問題が発生しました。
https://download.docker.com/linux/static/stable/x86_64/ からdocker cli実行可能ファイルをダウンロードし、それらをHostのjenkins dockerボリューム(/ var/lib/docker/volumesに抽出しました)/jenkins_home/_data/docker)。次に、Dockerコンテナのシェルを使用して/ var/jenkins_home/dockerから/ usr/binにコピーしました。
実行可能ファイルをコピーした後、ビルドは期待どおりに機能しました。