如何使用Jenkins管道在Docker容器中挂载Jenkins工作区 [英] How to mount Jenkins workspace in docker container using Jenkins pipeline

查看:204
本文介绍了如何使用Jenkins管道在Docker容器中挂载Jenkins工作区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Docker中使用Jenkins. /var/jenkins_home安装在主机上的/var/jenkins-data上.我的Jenkins可以执行docker命令(套接字数量),并且我已经安装了git插件和管道插件.

I'm using Jenkins in docker. The /var/jenkins_home is mounted on /var/jenkins-data on my host. My Jenkins can execute docker commands (mount of sockets) and I've installed the git plugin and pipeline plugin.

现在我有一个名为test的管道作业和以下管道:

Now I have a pipeline job named test and the following pipeline:

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版本并执行全新安装.

What I want to achieve is cloning my public repo from github. This works. In the next step I want to start a docker container (maven) and print the current directory, the maven version and perform a clean install.

这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存储库上执行.

It seems to work because maven is not installed on my host, so it's executed from inside the container, but it's suddenly creating a new workspace (@2) instead of using the existing one from where I cloned the repo. I don't want to clone the repo in my container immediately because I want multiple stages, all with different containers, but all executed on my git repo in my workspace.

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

What am I doing wrong or how can I fix this? I was thinking it was maybe because of the agent step. my first step can run on any agent (any slave), the docker step will run in the docker container, but must of course run on that same slave als where the git clone was executed.

推荐答案

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工作空间,因此,除非它们在工作空间之外,否则无需挂载任何卷.

You can use this pipeline even with a multi-node setup. Docker plugin by cloudbees mounts your workspace as a docker workspace too.Hence, it is not necessary to mount any volume unless they are outside the workspace.

这篇关于如何使用Jenkins管道在Docker容器中挂载Jenkins工作区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆