web-dev-qa-db-ja.com

Jenkinsパイプラインを使用して、DockerコンテナーにJenkinsワークスペースをマウントする方法

DockerでJenkinsを使用しています。ホストの/var/jenkins_home/var/jenkins-dataがマウントされています。私のJenkinsはdockerコマンド(ソケットの数)を実行でき、gitプラグインとパイプラインプラグインをインストールしました。

これで、testというパイプラインジョブと次のパイプラインができました。

pipeline {
    agent any
    stages {
        stage('Clone') {
            steps {
                git branch: 'master', url: 'https://github.com/lvthillo/maven-hello-world.git'
            }
        }

        stage('Build in Docker') {
            agent {
                docker {
                    image 'maven:3.5.2'
                    args '-v /var/jenkins_home/workspace/test:/opt/maven -w /opt/maven'
                }
            }

            steps {
                sh 'pwd'
                sh 'mvn -v'
                sh 'mvn clean install'
            }
        }
    }
}

私が達成したいのは、githubから公開リポジトリを複製することです。これは機能します。次のステップでは、Dockerコンテナー(maven)を起動し、現在のディレクトリ、mavenバージョンを印刷して、クリーンインストールを実行します。

3つのコマンドの出力は次のとおりです。

[test@2] Running Shell script
+ pwd
/var/jenkins_home/workspace/test@2
[Pipeline] sh
[test@2] Running Shell script
+ mvn -v
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T07:58:13Z)
Maven home: /usr/share/maven
Java version: 1.8.0_151, vendor: Oracle Corporation
Java home: /usr/lib/jvm/Java-8-openjdk-AMD64/jre
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "4.4.86-boot2docker", Arch: "AMD64", family: "unix"
[Pipeline] sh
[test@2] Running Shell script
+ mvn clean install

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.179 s
[INFO] Finished at: 2018-01-12T12:12:00Z
[INFO] Final Memory: 5M/31M
[INFO] ------------------------------------------------------------------------
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/var/jenkins_home/workspace/test@2). Please verify you invoked Maven from the correct directory. -> [Help 1]

Mavenがホストにインストールされていないため動作するようですが、コンテナー内から実行されますが、リポジトリを複製した場所から既存のワークスペース(@2)を使用する代わりに、突然新しいワークスペースを作成しています。コンテナーが異なる複数のステージが必要ですが、すべてがワークスペースのgitリポジトリで実行されるため、コンテナーのリポジトリをすぐに複製したくありません。

私は何を間違っているのですか、これをどのように修正できますか?エージェントのステップのせいだと思っていました。最初のステップは任意のエージェント(任意のスレーブ)で実行できます。DockerステップはDockerコンテナで実行されますが、git cloneが実行された同じスレーブalsで実行する必要があります。

14
lvthillo
pipeline {
agent any
stages {
    stage('Clone') {
        steps {
            git branch: 'master', url: 'https://github.com/lvthillo/maven-hello-world.git'
            stash name:'scm', includes:'*'
        }
    }

    stage('Build in Docker') {
        steps {
            unstash 'scm'
            script{
                docker.image('maven:3.5.2').inside{ 
                    sh 'pwd'
                    sh 'mvn -v'
                    sh 'mvn clean install'
                }
            }
        }
    }
}
}

このパイプラインは、マルチノード設定でも使用できます。 cloudbeesによるDockerプラグインは、ワークスペースをDockerワークスペースとしてもマウントします。したがって、ボリュームがワークスペースの外にない限り、ボリュームをマウントする必要はありません。

12
Ram Kamath

おかげで、以前の解決策は私にとってうまくいきます。ノードコンテナーのバージョンとパラメーターとしての$ {PWD}

stage('Build Solution') { 
        agent {
            docker {
                image 'node:6-Alpine'
                args '-v ${PWD}:/usr/src/app -w /usr/src/app'
                reuseNode true
            }
        }
        steps {
            sh 'npm install'
        }
    }
9
Yuriy Shpool

私の最後の説明は問題を解決するのに役立ちました:これは text が解決するのに役立ちました。パイプラインのすべてのステップで、git cloneを実行した最初のエージェントと同じエージェントを使用していることを確認する必要がありました。

Addit reuseNode true解決しました:

stage('Build in Docker') {
            agent {
                docker {
                    image 'maven:3.5.2'
                    args '-v /var/jenkins_home/workspace/test:/opt/maven -w /opt/maven'
                    reuseNode true
                }
            }
2
lvthillo

Mavenから返されたエラーメッセージは、実行が起動されたディレクトリでpom.xmlファイルが見つからなかったことを示しています。

同じ問題があり、プロジェクトpom.xmlを含むディレクトリにcdで解決しました。

0