如何使用Jenkins管道在Docker容器中安装Jenkins工作区

lvt*_*llo 13 jenkins docker jenkins-pipeline

我在码头工人中使用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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是从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]
Run Code Online (Sandbox Code Playgroud)

它似乎工作,因为maven没有安装在我的主机上,所以它是从容器内部执行的,但它突然创建了一个新的工作空间(@2)而不是使用我克隆存储库的现有工作空间.我不想立即克隆回购在我的容器,因为我想多个阶段,所有不同的容器,但在我的工作空间我的git回购所有执行.

我做错了什么或如何解决这个问题?我以为这可能是因为代理步骤.我的第一步可以在任何代理(任何从属)上运行,docker步骤将在docker容器中运行,但当然必须在执行的同一个slave als上运行git clone.

Ram*_*ath 11

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'
                }
            }
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

即使使用多节点设置,也可以使用此管道.cloudbees的Docker插件也将您的工作区安装为docker工作区.因此,除非它们位于工作区之外,否则无需安装任何卷.

  • 据我所知,唯一使用 `docker.image(...){...}` 语法的 docker 插件是 `Docker Pipeline` 插件 ( https://plugins.jenkins.io/docker-workflow/ ) ,由“carroll”维护。这是您指的“Cloudbees 的 Docker 插件”吗?如果不是,您指的是哪个插件? (2认同)

小智 8

谢谢,以前的解决方案对我有用。我的节点容器版本和$ {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'
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我一直在寻找-v $ {PWD}部分:) (2认同)
  • 对于像我这样使用它但不起作用的人(“groovy.lang.MissingPropertyException:没有这样的属性:PWD for class:groovy.lang.Binding”),请确保您使用单引号,否则 Jenkins 会处理它就像一个可模板化的“GString” ex。/sf/answers/2622563891/ (2认同)

lvt*_*llo 7

我最后的解释是帮助自己解决问题:这篇文字帮助我解决了它。我必须确保管道上的所有步骤都使用与我执行 git clone 的初始步骤相同的代理:

Addit reuseNodetrue 解决了它:

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
                }
            }
Run Code Online (Sandbox Code Playgroud)