web-dev-qa-db-ja.com

ローカルのJenkinsマルチブランチパイプラインにDockerコマンドが見つかりません

私は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

7
Jadda

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'
        }
}
1
Jadda

私は同じ問題を抱えていましたが、このスレッドのおかげで解決できました https://stackoverflow.com/a/50029962/6943587

Dockerラベルを指定する必要があります。これは、どのスレーブにdockerがあるかを示しています。これを行うには、私が知っている2つの方法があります。

(オプション1-推奨)Jenkinsfileでdockerラベルを設定します

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'
      }
    }
  }
} 

(オプション2)構成にdockerラベルを設定する

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が優先されます。

2
Nickofthyme

[グローバルツール設定]セクションで自動インストールオプションを選択したため、Jenkinsはシステム内のdockerを探しません。

この問題は、[グローバルツール設定]セクションでdockerの自動インストールオプションをオフにすることで解決できます。

  • dockerインストーラーのダウンロード、
  • それをインストールして
  • jenkinsへのインストーラーのパスを指定します。

スクリーンショットの例を以下に示します。

グローバルツール設定の下のjenkinsでのdockerインストーラーパスのセットアップ

0
Ayush Verma

自動化された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にコピーしました。

実行可能ファイルをコピーした後、ビルドは期待どおりに機能しました。

0
PankajSays