首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在声明性管道中等待用户输入而不阻塞重量级执行器

如何在声明性管道中等待用户输入而不阻塞重量级执行器
EN

Stack Overflow用户
提问于 2017-03-02 16:49:47
回答 5查看 36.8K关注 0票数 29

我正在将现有的构建管道重构为jenkins声明性管道(多分支管道),并且在处理构建传播时遇到了问题。

在打包和存储所有相关文件之后,管道应该等待用户输入触发部署。

如果我只是添加一个输入步骤,当前的构建节点就会被阻塞。由于这个执行器很重,我想把这个步骤移到一个更轻量级的机器上。

最初,我把这个工作作为一个脚本化的管道,只创建了两个不同的node('label')块。有什么方法可以让我用声明式语法做类似的事情吗?

代码语言:javascript
复制
node('spine') { 
    stage('builder') {
        sh 'mvn clean compile'
        stash name: 'artifact', includes: 'target/*.war'
    }
}
node('lightweight') {
    stage('wait') {
        timeout(time:5, unit:'DAYS') {
            input message:'Approve deployment?'
        }
    }
    // add deployment stages
}

我已经试过几件事了:

在顶层配置代理并向传播步骤添加额外的代理配置,但是当顶层定义的构建节点未停止时,有两个执行器阻塞。

在顶层设置agent none并按步骤配置代理。然后git签出在第一个节点上不存在。

编辑1

我按照您的建议重新配置了我的管道,它现在如下所示:

代码语言:javascript
复制
pipeline {
agent none
tools {
    maven 'M3'
}
stages {
    stage('Build') {
        agent { label 'spine' }
        steps {
            checkout scm // needed, otherwise the workspace on the first step is empty
            sh "mvn clean compile"
        }
    }
    stage('Test') {
        agent { label 'spine' }
        steps {
            sh "mvn verify" // fails because the workspace is empty aggain
            junit '**/target/surefire-reports/TEST-*.xml'
        }
    }
}
}

此构建将失败,因为工作区不会在步骤之间继续运行,因为它们不会在同一个执行器上运行。

编辑2

显然,这些步骤有时运行在同一个执行器上,有时不运行。(我们根据需要在mesos/dcos集群上生成生成奴隶,因此更改executor中间构建将是一个问题)

我希望jenkins只使用当前的执行器运行,只要代理定义中的标签没有改变。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-03-02 19:04:33

参见最佳做法7:不要:在节点块中使用输入。在声明性管道中,节点选择通过agent指令完成。

文档这里描述了如何定义对线的none,然后使用阶段级agent指令在所需的节点上运行阶段。我也尝试了相反的方法(在某个节点上定义一个全局代理,然后在舞台级为输入定义none ),但这是行不通的。如果管道分配了一个从级,则不能在一个或多个特定阶段释放该从属程序。

这是我们的管道的结构

代码语言:javascript
复制
pipeline {
  agent none
  stages {
    stage('Build') {
      agent { label 'yona' }
      steps {
        ...
      }
    }
    stage('Decide tag on Docker Hub') {
      agent none
      steps {
        script {
          env.TAG_ON_DOCKER_HUB = input message: 'User input required',
              parameters: [choice(name: 'Tag on Docker Hub', choices: 'no\nyes', description: 'Choose "yes" if you want to deploy this build')]
        }
      }
    }
    stage('Tag on Docker Hub') {
      agent { label 'yona' }
      when {
        environment name: 'TAG_ON_DOCKER_HUB', value: 'yes'
      }
      steps {
        ...
      }
    }
  }
}

通常,构建阶段在标记为"yona“的构建从上执行,但是输入阶段在主程序上运行。

票数 37
EN

Stack Overflow用户

发布于 2018-12-13 17:01:39

另一种方法是使用表达式指令和beforeAgent,它跳过了“决定”步骤,避免了对"env“全局的干扰:

代码语言:javascript
复制
pipeline {
    agent none

    stages {
        stage('Tag on Docker Hub') {
            when {
                expression {
                    input message: 'Tag on Docker Hub?'
                    // if input is Aborted, the whole build will fail, otherwise
                    // we must return true to continue
                    return true
                }
                beforeAgent true
            }

            agent { label 'yona' }

            steps {
                ...
            }
        }
    }
}
票数 21
EN

Stack Overflow用户

发布于 2019-07-25 15:32:45

我知道这个线程是旧的,但是我相信除了存储之外,解决“编辑2”问题的一个解决方案是使用嵌套阶段。

https://jenkins.io/blog/2018/07/02/whats-new-declarative-piepline-13x-sequential-stages/#running-multiple-stages-with-the-same-agent-or-environment-or-options

根据这一页:

..。如果在管道中使用多个代理,但希望确保使用相同代理的阶段使用相同的工作区,则可以使用带有代理指令的父阶段,然后在同一个工作区中运行其stages指令中的所有阶段。

下面是提供的例子:

代码语言:javascript
复制
pipeline {
    agent none

    stages {
        stage("build and test the project") {
            agent {
                docker "our-build-tools-image"
            }
            stages {
               stage("build") {
                   steps {
                       sh "./build.sh"
                   }
               }
               stage("test") {
                   steps {
                       sh "./test.sh"
                   }
               }
            }
            post {
                success {
                    stash name: "artifacts", includes: "artifacts/**/*"
                }
            }
        }

        stage("deploy the artifacts if a user confirms") {
            input {
                message "Should we deploy the project?"
            }
            agent {
                docker "our-deploy-tools-image"
            }
            steps {
                sh "./deploy.sh"
            }
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42561241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档