3

Я совершенно новый для трубопроводов Jenkins 2.Jenkins 2 Pipelines - Как смоделировать трубопровод непрерывной подачи

я играл с Дженкинс 1 трубопроводами со следующей точки зрения:

enter image description here

Вы могли бы начать определенный этап непосредственно, скажем, что я мог бы выбрать для запуска от стадии выпуска, пропуская тест.

У меня есть довольно простое определение Дженкинс 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. Как вы устанавливаете ручные этапы?

UPDATE: Реальная цель позади моих вопросов является моделирование трубопровода в непрерывной поставки как следующее с Дженкинс 2 трубопроводов:

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

Это поведение я хочу:

Этап строительства (любой пользователь может его запустить), когда он заканчивается, автоматически запускается t он Этап принятия. Это невозможно вручную отключить, только автоматически после успешного завершения этапа сборки.

От приемочной Stage мне нужно, что только авторизованные пользователи могут вручную запустить QA Stage и сценическую.

Бизнес-поток был бы: разработчиком удаётся построить сцену, ее код будет построен и упакован. Начало приема начинается с использования упакованного кода для запуска кучи автоматических тестов.

В этот момент, когда Приемка этап закончил хорошо, две вещи могут случиться:

  1. Может QA этап необходим для запуска больше тестов (огурца, ручной и т.д.). Некоторый авторизованный пользователь уволил бы этот этап.
  2. Когда владелец продукта счастлив, он может решить начать этап производства, чтобы развернуть код в производственной среде.

Я изо всех сил пытаюсь моделировать это с помощью трубопроводов Jenkins 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 этап будет называться «одобрить-приветствие», и он будет ждать, пока кто-то одобрит сборку, щелкнув по ней в представлении.

4) How do you setup manual stages? 

Я полагаю, на это ответил ответ 3?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация/пояснения.

EDIT :: Вы можете найти дальнейшие ответы ниже:

сборки Stage (любой пользователь может запустить его), когда он закончит это вызывает автоматически Приемка этап.

Очевидно, что этап сценического этапа и этапа приема будет определен как нормальный этап в трубопроводе Дженкинса. Так что ваш код будет просто как:

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 
    } 

В этот момент, когда Приемка этап закончил хорошо, две вещи могут случиться:

  1. Может QA этап необходим для запуска больше тестов (Огурцы, руководство и т. Д.). Некоторый авторизованный пользователь запустит этот этап.

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

Чем вы можете взять значение сверху и управлять потоком снова. Как:

Если значение прод верно, чем приступить к производства стадии Если значение ца верно, чем перейти к QA-Manual стадии так же, как мой выше примере кода FASTFORWARD_TO_GREETING.

EDIT 2

Далее отвечая на вопросы в разделе комментариев:

1) Как и где я могу указать параметры, такие как FASTFORWARD_TO_GREETING

параметров, как FASTFORWARD_TO_GREETING будет определяться как Уровень работы parameter

2) На этапе продвижения вам необходимо выбрать между ManualQA и Production. Если пользователь выбирает ManualQA, он запускает этот этап пропуска Production. После этого я хочу, чтобы пользователь был пропущен, если он хочет, чтобы продвигался на стадию производства. Если бы вы могли предоставить полное определение , то это было бы здорово.

Это можно было обработать после этапа MaualQA с помощью другого шага ввода, но на этот раз с одним параметром. Таким образом, после этапа продвижения, будет этап ManualQA и чем после того, как что ниже входного шага:

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

3) Как я могу определить, если пользователь имеет разрешение на запуск стадии или нет. В идеале я хотел бы сделать это на основе ролей.

Я не уверен, как это сделать с ролями, но я считаю, что любой, у кого есть доступ администратора или работает, будет иметь доступ для запуска/одобрения этого этапа, но я я не уверен на 100%, если он может быть каким-то образом изменен.

+0

Привет Маниш, спасибо за помощь мне с этим. Реальной целью, которую я хочу достичь, является моделирование непрерывного трубопровода. Я обновил вопрос с информацией. Надеюсь, ты поможешь мне справиться с этим. – codependent

+0

@codependent Я обновил ответ. Дайте мне знать, если вам нужна помощь. –

+0

Огромное вам спасибо, он приближается к тому, что мне нужно. Осталось всего три оставшихся сомнения: 1) Как и где указать параметры, такие как FASTFORWARD_TO_GREETING?2) На этапе продвижения вам нужно выбирать между ManualQA и Production. I пользователь выбирает ManualQA, он запускает этот этап пропускания Production. После этого я хочу, чтобы пользователь был выпущен, если он хочет продвигаться на стадию производства. Если бы вы могли предоставить полное определение конвейера, было бы здорово. Наконец 3) Как я могу определить, имеет ли пользователь разрешения для запуска стадии или нет. В идеале я хотел бы сделать это на основе ролей. См. Еще один вопрос: – codependent

2

Это полный непрерывный нагнетательный трубопровод построен с показаниями, которые я получил от принятого Anwer:

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