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

标签 docker jenkins jenkins-pipeline

我在 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 克隆我的公共(public) repo。这行得通。在下一步中,我想启动一个 docker 容器(maven)并打印当前目录、maven 版本并执行全新安装。

三个命令的输出是:

[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),而不是使用现有的工作区我克隆了 repo 。我不想立即在我的容器中克隆 repo,因为我想要多个阶段,所有阶段都使用不同的容器,但都在我的工作区中的 git repo 上执行。

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

最佳答案

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

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

关于docker - 如何使用 Jenkins 管道在 docker 容器中安装 Jenkins 工作区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48226183/

相关文章:

c# - 在 docker 机器上调试时 MySql 连接被拒绝

jenkins - Jenkins 电子邮件扩展插件发送的电子邮件未收到?

jenkins - 在带有 docker 代理的 jenkins 管道中使用 git

java - Jenkins + Maven 发布插件 : release:branch + Git - Unable to commit files

node.js - 在 Jenkins 管道上缓存 NPM 依赖项

PHPMD @bin_dir@ 错误

jenkins - 基于隐藏文件是否存在的条件阶段

php - 带有 Laravel Excel : Your requirements could not be resolved to an installable set of packages 的 Laravel 7

docker - 从 SaltStack 中的私有(private) Docker 注册表中提取图像

Docker:如何使用 docker-compose 而不使用 iptables 来防止来自 docker 网络的传出流量?