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

cod*_*ent 3 jenkins continuous-delivery jenkins-plugins jenkins-pipeline jenkins-2

我是Jenkins 2管道的新手.

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

在此输入图像描述

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

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

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

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

我的问题是:

  1. 我怎样才能运行我更喜欢的舞台?例如问候而不是从准备开始?
  2. 你如何定义阶段之间的依赖关系?我的意思是在另一个完成后调用的阶段
  3. 有没有办法限制某个用户可以启动的阶段?想象一下,我只希望特定用户启动Greeting阶段.
  4. 你如何设置手动阶段?

更新:我的问题背后的真正目标是使用Jenkins 2管道建模连续交付管道,如下所示:

Build stage --> AUTO --> Acceptance Stage --> MANUAL --> Production Stage
                                          --> MANUAL --> QA Stage
Run Code Online (Sandbox Code Playgroud)

这是我想要的行为:

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

验收阶段我需要只有授权用户才能手动触发QA阶段生产阶段.

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

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

  1. 也许QA Stage需要运行更多测试(黄瓜,手册等).一些授权用户会触发这个阶段.
  2. 当产品所有者满意时,他可以决定启动生产阶段以在生产环境中部署代码.

我正在努力用Jenkins 2管道模拟这个.

Man*_*shi 5

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

1) How can I run the stage I prefer? For instance Greeting instead of starting from Preparation?
Run Code Online (Sandbox Code Playgroud)

这可以通过添加布尔参数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
Run Code Online (Sandbox Code Playgroud)

阶段是连续执行的,因此如果首先定义阶段,它将首先启动并完成,然后再进入下一阶段.然而,在并行步骤中,这并不成立,因为所有步骤将并行执行.因此,在您的示例代码中,您定义的依赖关系将首先执行"准备"阶段,而不是仅执行"hello1"和"hello2"步骤.然而,无法保证打印哪个"hello world1"或"hello world 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.
Run Code Online (Sandbox Code Playgroud)

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

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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此之后会发生什么,当您执行构建时,阶段准备将被执行但在此之后该作业将等待手动批准继续.在Jenkins管道视图中,该阶段将被称为"approve-greeting",它将等到某人通过在视图中单击它来批准构建.

4) How do you setup manual stages?
Run Code Online (Sandbox Code Playgroud)

我相信在答案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 
    }
Run Code Online (Sandbox Code Playgroud)

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

  1. 也许QA Stage需要运行更多测试(黄瓜,手册等).一些授权用户会触发这个阶段.

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

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

    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'])
Run Code Online (Sandbox Code Playgroud)

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

如果prod的值为true,则进入生产阶段,如果qa的值为true,则进入QA-Manual阶段,就像上面的FASTFORWARD_TO_GREETING示例代码一样.

编辑2

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

1)如何或在何处指定FASTFORWARD_TO_GREETING等参数

像FASTFORWARD_TO_GREETING这样的参数将被定义为作业级参数

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

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

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

3)如何确定用户是否具有运行阶段的权限.理想情况下,我想根据角色来做

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