3

我对 Jenkins 2 管道完全陌生。

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

在此处输入图像描述

你可以直接启动某个阶段,比如说我可以选择从发布阶段开始运行,跳过Test。

我有一个非常简单的 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. 有没有办法限制某个用户可以开始的阶段?想象一下,我只希望特定用户启动 Greeting 阶段。
  4. 你如何设置手动阶段?

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

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

这是我想要的行为:

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

Acceptance Stage我需要只有授权用户才能手动触发QA StageProduction Stage

业务流程是:开发人员进入构建阶段,构建并打包其代码。验收阶段开始,使用打包的代码运行一堆自动化测试。

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

  1. 也许需要 QA 阶段来运行更多测试(Cucumber、手动等)。一些授权用户会触发这个阶段。
  2. 当产品负责人高兴时,他可以决定启动生产阶段以在生产环境中部署代码。

我正在努力使用 Jenkins 2 管道对此进行建模。

4

2 回答 2

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

阶段是按顺序执行的,因此如果首先定义一个阶段,它将首先启动并完成,然后再进入下一个阶段。然而,在并行步骤中,这并不成立,因为所有步骤都将并行执行。因此,在您的示例代码中,您定义的依赖项是“准备”阶段将首先执行,然后只有“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.

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

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'
        }
    }
}

之后会发生什么,当您执行构建时,阶段准备将被执行,但之后该作业将等待手动批准才能继续。在 Jenkins Pipeline 视图中,该阶段将被称为“approve-greeting”,它会等到有人通过在视图中单击它来批准构建。

4) How do you setup manual stages?

我相信这在答案 3 中得到了回答?

如果您需要更多信息/解释,请告诉我。

编辑:: 请在下面找到更多答案:

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

显然,构建阶段和验收阶段都将被定义为 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 阶段来运行更多测试(Cucumber、手动等)。一些授权用户会触发这个阶段。

  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'])

你可以从上面获取值并再次操纵流程。像 :

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

编辑 2

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

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

诸如 FASTFORWARD_TO_GREETING 之类的参数将被定义为作业级别参数

2) 在推广阶段,您必须在 ManualQA 和 Production 之间进行选择。如果用户选择 ManualQA,它将运行该阶段跳过生产。之后,如果他想提升到生产阶段,我希望用户得到提示。如果您可以提供管道的完整定义,那就太好了。

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

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

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

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

于 2017-02-03T03:54:01.477 回答
3

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

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'
    }
}
于 2017-02-06T12:31:04.497 回答