2017-02-10 57 views
9

我使用詹金斯管道与声明语法,目前与以下阶段:使用轻量级执行人的声明流水线阶段(代理无)

  1. 准备
  2. 生成(两个并联组步骤)
  3. 测试(也两个步骤并行套)
  4. 向如果/何处部署
  5. 部署

对于步骤1,2,3和5,我需要和代理(执行者),因为他们在工作区上做实际工作。对于第4步,我不需要一个,并且我希望在等待用户输入时不会阻止可用的执行程序。这似乎被称为传统脚本语法的“轻量级”或“轻量级”执行程序,但我无法找到任何有关如何使用声明性语法实现此功能的信息。

到目前为止,我已经试过:

  1. 在管道选项直接设置一个代理,然后在舞台上设置agent none。这不起作用,并且流水线正常运行,在等待输入的同时阻止执行程序。它在文档中也提到它不起作用,但我认为我会无论如何给它一个镜头。
  2. 在管道选项中设置agent none,然后为#4以外的每个阶段设置代理。不幸的是,但预计,这会为每个阶段分配一个新的工作空间,这反过来又要求我存储和取消存储。这是混乱的,并且在并行阶段(2和3)给我带来了更多问题,因为我不能在parallel构造之外拥有代码。我假设平行步骤在同一个工作区中运行,因此在两者中存储/清除会产生不幸的结果。

这里是我的Jenkinsfile的轮廓:

pipeline { 
    agent { 
     label 'build-slave' 
    } 
    stages { 
     stage("Prepare build") { 
      steps { 
       // ... 
      } 
     } 
     stage("Build") { 
      steps { 
       parallel(
        frontend: { 
         // ... 
        }, 
        backend: { 
         // ... 
        } 
       ) 
      } 
     } 
     stage("Test") { 
      steps { 
       parallel(
        jslint: { 
         // ... 
        }, 
        phpcs: { 
         // ... 
        }, 
       ) 
      } 
      post { 
       // ... 
      } 
     } 
     stage("Select deploy target") { 
      steps { 
       script { 
        // ... code that determines choiceParameterDefinition based on branch name ... 
        try { 
         timeout(time: 5, unit: 'MINUTES') { 
          deployEnvironment = input message: 'Deploy target', parameters: [choiceParameterDefinition] 
         } 
        } catch(ex) { 
         deployEnvironment = null 
        } 
       } 
      } 
     } 
     stage("Deploy") { 
      when { 
       expression { 
        return binding.variables.get("deployEnvironment") 
       } 
      } 
      steps { 
       // ... 
      } 
     } 
    } 
    post { 
     // ... 
    } 
} 

我在这里失去了一些东西,或者是它只是不可能在目前的版本?

回答

8

设置agent none在顶层,然后agent { label 'foo' }在每一个阶段,与agent none再上input阶段似乎有望为我工作。

即执行某些工作的每个阶段都在同一个代理上运行,而input阶段不会在任何代理上使用执行程序。

pipeline { 
    agent none 
    stages { 
     stage("Prepare build") { 
      agent { label 'some-agent' } 
      steps { 
       echo "prepare: ${pwd()}" 
      } 
     } 
     stage("Build") { 
      agent { label 'some-agent' } 
      steps { 
       parallel(
        frontend: { 
         echo "frontend: ${pwd()}" 
        }, 
        backend: { 
         echo "backend: ${pwd()}" 
        } 
       ) 
      } 
     } 
     stage("Test") { 
      agent { label 'some-agent' } 
      steps { 
       parallel(
        jslint: { 
         echo "jslint: ${pwd()}" 
        }, 
        phpcs: { 
         echo "phpcs: ${pwd()}" 
        }, 
       ) 
      } 
     } 
     stage("Select deploy target") { 
      agent none 
      steps { 
       input message: 'Deploy?' 
      } 
     } 
     stage("Deploy") { 
      agent { label 'some-agent' } 
      steps { 
       echo "deploy: ${pwd()}" 
      } 
     } 
    } 
} 

然而,存在不保证使用流水线内的相同试剂标签将总是最终使用相同的工作区中,例如作为第一个构建等待input时同一作业的另一个构建。

构建步骤后,您将不得不使用stash。正如你注意到的那样,目前parallel通常不能正常执行,所以你必须另外使用script块,以便在并行步骤之前/之前编写脚本管道片段来存储/去除散列。

+0

很高兴知道这实际上是有保证的,特别是因为我想使用多个构建从站。我似乎无法找到关于它的文档中的任何内容,除了一些提及它正在为docker实例实施的内容。 – runemoennike

+1

@runemoennike它不能保证;我已经编辑了我的答案以反映这一点,并且提及您可以使用'script'块来存放/去掉以解决(并行)是“steps”中唯一项的(当前)要求。 –

+0

好的,谢谢! – runemoennike