詹金斯管道工作在不同的文件夹中

时间:2018-01-30 18:55:28

标签: jenkins jenkins-pipeline

好吧所以我只是在学习詹金斯的管道,而且我遇到了一个小问题。 它正在一个目录中构建我的war文件,但是试图在另一个目录中构建docker镜像,这将导致失败。

所以简写日志很好地描述了这个问题:

[Pipeline] stage
[Pipeline] { (build war)
[Pipeline] node
Running on Jenkins in /root/.jenkins/workspace/Wunderbaren@2
[Pipeline] {

[Pipeline] stage
[Pipeline] { (build dockerimage)
[Pipeline] script
[Pipeline] {
[Pipeline] dir
Running in /root/.jenkins/workspace/Wunderbaren/backend
[Pipeline] {

Jenkinsfile:

pipeline {
    agent any
    stages {
        stage('build war') {
            agent {
                docker { image 'gradle:latest' }
            }
            steps {
                sh 'gradle war -b backend/build.gradle'
            }
        }
        stage('build dockerimage') {
            steps {
                script {
                    dir('backend/') {
                        def image = docker.build("munhunger/wunderbaren")

                        docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
                            image.push("${env.BUILD_NUMBER}")
                            image.push("latest")
                        }
                    }
                }
            }
        }
    }
}

我觉得奇怪的是,我有一个类似的项目,几乎完全相同的配置。仅在文件夹名称和docker标记方面有所不同。而且这似乎在100%的时间都有效,所以我觉得这个很丢失!

2 个答案:

答案 0 :(得分:3)

原来你需要重用节点:

stage('build war') {
    agent {
        docker { 
            image 'gradle:latest'
            reuseNode true
        }
    }
    steps {
        sh 'gradle war -b backend/build.gradle'
    }
}

我在https://go.cloudbees.com/docs/cloudbees-documentation/use/reference/pipeline/

找到的文档
  

<强> reuseNode   一个布尔值,默认为false。如果为true,则在同一工作空间中的管道顶层指定的节点中运行容器,而不是完全在新节点上运行。   此选项对docker和dockerfile有效,并且仅在单个阶段的代理上使用时有效。

答案 1 :(得分:1)

来自Jenkins Pipeline Documentation

  

代理部分指定整个管道或特定阶段在Jenkins环境中的执行位置,具体取决于代理部分的放置位置。该部分必须在顶级内部定义管道块,但阶段级使用是可选的。

我认为这意味着“构建战争”阶段将在与“构建泊坞窗图像”阶段不同的环境中执行。对于在不同作业中工作的类似语法,可能为两个阶段定义了相同的代理?