Jenkins 2 Pipelines - 如何建模连续交付管道

时间:2016-09-27 10:45:06

标签: jenkins jenkins-plugins jenkins-pipeline continuous-delivery jenkins-2

我对Jenkins 2管道全新。

我使用以下视图玩过Jenkins 1管道:

enter image description here

你可以直接开始某个阶段,假设我可以选择从发布阶段开始运行,跳过测试。

我有一个非常简单的Jenkins 2管道定义:

stage('Preparation'){
    echo """
         Preparing
         something
         """
}
stage('Greeting') { 
    parallel 'hello1':{
        node{
            echo 'hello world 1'
        }
    }, 'hello2':{
        node{
            echo 'hello world 2'
        }
    }
}

在管道页面中,我有“立即构建”,它从准备开始运行所有阶段。

我的问题是:

  1. 我如何运行我更喜欢的舞台?例如问候而不是从准备开始?
  2. 如何定义阶段之间的依赖关系?我的意思是在另一个完成之后调用的阶段
  3. 有没有办法限制某个用户可以启动的阶段?想象一下,我只希望特定用户启动问候语阶段。
  4. 如何设置手动阶段?
  5. 更新我的问题背后的真正目标是使用 Jenkins 2管道建模持续投放渠道,如下所示:

    Build stage --> AUTO --> Acceptance Stage --> MANUAL --> Production Stage
                                              --> MANUAL --> QA Stage
    

    这是我想要的行为:

    构建阶段(任何用户都可以启动它)完成后会自动触发验收阶段。这个不能手动激活,只能在成功完成构建阶段后自动激活。

    接受阶段我需要只有授权用户才能手动触发质量检查阶段生产阶段

    业务流程将是:开发人员点击Build Stage,其代码已构建和打包。验收阶段开始,使用打包的代码运行一系列自动化测试。

    此时,当Acceptance Stage完成OK时,可能会发生两件事:

    1. 可能需要QA Stage来运行更多测试(黄瓜,手册等)。一些授权用户会解雇这个阶段。
    2. 当产品所有者满意时,他可以决定启动生产阶段以在生产环境中部署代码。
    3. 我正在努力用Jenkins 2管道对此进行建模。

2 个答案:

答案 0 :(得分:5)

您的一些问题没有直接的答案,但可以通过一些额外的编码来实现。虽然某些人可能会找到其他方法来实现,但让我尝试一下我的想法:

1) How can I run the stage I prefer? For instance Greeting instead of starting from Preparation?

这可以通过添加布尔参数FASTFORWARD_TO_GREETING而不是使用执行构建时提供的值来操作构建流来实现。所以你的代码现在看起来像:

if (FASTFORWARD_TO_GREETING == 'false') {
stage('Preparation'){
    echo """
         Preparing
         something
         """
}
}

stage('Greeting') { 
    parallel 'hello1':{
        node{
            echo 'hello world 1'
        }
    }, 'hello2':{
        node{
            echo 'hello world 2'
        }
    }
}


2) How do you define the dependencies between stages? I mean the stage called after another one completes

阶段是连续执行的,因此如果首先定义阶段,则首先启动并完成阶段,然后再进入下一阶段。然而,在并行步骤中,这并不成立,因为所有步骤将并行执行。因此,在您的示例代码中,您定义的依赖关系是阶段"准备"将首先执行,而不仅仅是#34; hello1"和" hello2"步骤将并行执行。然而,无法保证哪个" hello world1"或者"你好世界2"会被打印出来。

3) Is there a way to limit the stages that a certain user can start? Imagine that I only want a specific user to launch the Greeting stage.

您可以在某个阶段之前进行手动审批步骤。例如,在您的代码中,您希望执行阶段准备工作,而不是希望在执行阶段问候语之前进行手动批准,您的代码将如下所示:

stage('Preparation'){
    echo """
         Preparing
         something
         """
}
stage concurrency: 1, name: 'approve-greeting'
input id: 'greeting-deploy', message: 'Proceed to Greeting?', ok: 'Deploy'

stage('Greeting') { 
    parallel 'hello1':{
        node{
            echo 'hello world 1'
        }
    }, 'hello2':{
        node{
            echo 'hello world 2'
        }
    }
}

在执行构建之后会发生什么,舞台准备工作将会执行,但之后作业将等待手动批准继续。在詹金斯管道视图中,阶段将被称为"批准问候"并且它会等到某人通过在视图中单击它来批准构建。

4) How do you setup manual stages?

我相信在答案3中已经回答了这个问题?

如果您需要进一步的信息/解释,请告诉我。

编辑 ::请在下面找到进一步的答案:

  

构建阶段(任何用户都可以启动它),当它完成触发时   自动接受阶段。

显然,Build Stage和Acceptance Stage都将被定义为Jenkins管道中的正常阶段。所以你的代码很简单:

node {
    //define any variable here
    // Get source code from repo using checkout to directory say stackoverflow
    // Get source code from repo for acceptance test using checkout to directory say stackoverflow-test
    //Define any tool like Maven etc. location if required.
    dir('stackoverflow') {
      stage name: 'build'
        //Do required steps
    }
    dir('stackoverflow-test') {
      stage name: 'Acceptance'
        //Do required steps here 
    }
  

此时,当Acceptance Stage完成OK时,可以做两件事   发生:

     
      
  1. 可能需要QA Stage来运行更多测试(黄瓜,手册等)。   一些授权用户会解雇这个阶段。

  2.   
  3. 当产品所有者满意时,他可以决定启动生产阶段以在生产环境中部署代码。

  4.   

这可以通过输入选项来完成,所以在上面的代码之后你现在可以编写:

    stage 'promotion'
      def userInput = input(
      id: 'userInput', message: 'Let\'s promote?', parameters: [
      [$class: 'BooleanParameterDefinition', defaultValue: false, description: 'Production', name: 'prod'],
      [$class: 'BooleanParameterDefinition', defaultValue: false, description: 'ManualQA', name: 'qa']
      ])
      echo ("Env: "+userInput['prod'])
      echo ("Target: "+userInput['qa'])

您可以从上面获取值并再次操作流程。喜欢:

如果prod的值为true,则继续生产阶段, 如果qa的值为true,则继续执行 QA-Manual 阶段,就像上面的FASTFORWARD_TO_GREETING示例代码一样。

编辑2

进一步回答评论部分的问题:

  

1)我如何或在何处指定FASTFORWARD_TO_GREETING

等参数

FASTFORWARD_TO_GREETING等参数将定义为作业级别parameter

  

2)在推广阶段,您必须在ManualQA和之间进行选择   生产。如果用户选择ManualQA,则运行该跳过阶段   生产。在它之后我想要用户被提出,如果他想   促进生产阶段。如果你能提供完整的定义   这条管道很棒。

这可以在MaualQA阶段之后使用另一个输入步骤进行操作,但这次仅使用一个参数。因此,在阶段推广之后,会有阶段ManualQA,然后是以下输入步骤:

def userInput1 = input(
 id: 'userInput', message: 'Let\'s promote?', parameters: [
 [$class: 'BooleanParameterDefinition', defaultValue: false, description: 'Production', name: 'prod']
])
  

3)如何确定用户是否有权运行舞台或   不。理想情况下,我想根据角色

来做

我不确定如何使用角色,但我相信任何具有管理员访问权限或运行该作业的人都可以访问运行/批准该阶段,但我不能100%确定是否可以以某种方式修改。< / p>

答案 1 :(得分:2)

这是一个完整的连续交付管道,其中包含了我从接受的答案中获得的指示:

node{
    def user
    def userInput
    def mvnHome = tool 'M3'

    wrap([$class: 'BuildUser']) {
        user = env.BUILD_USER_ID
    }

    stage('Commit Stage'){
        echo 'Downloading from Git...'
        git 'https://github.com/codependent/spring-nio-rest.git'
        'Building project...'
        sh "${mvnHome}/bin/mvn clean install -DskipTests"
    }

    stage('Acceptance Stage') { 
        echo """
             Getting image from Nexus...OK
             Deploying image...OK
             Executing tests...OK
             """
        userInput = input(id: 'userInput', message: 'Select the next stage:', parameters: [
            [$class: 'BooleanParameterDefinition', defaultValue: false, description: 'Run QA tests', name: 'QA'],
            [$class: 'BooleanParameterDefinition', defaultValue: false, description: 'Run performance tests', name: 'performance']
        ])
    }

    if(userInput['QA']){
        stage('QA Stage') { 
         echo """
             Getting image from Nexus...OK
             Deploying image...OK
             Executing QA tests...OK
             """
        }
    }

    if(userInput['performance']){
        stage('Performance Stage') { 
         echo """
             Getting image from Nexus...OK
             Deploying image...OK
             Executing Performance tests...OK
             """
        }
    }

    stage('Production Stage') { 
        input message: 'Are you sure you want to deploy to Production?', submitter: 'codependent'
        echo 'Deploying to Production...OK'
    }
}