Сценарій конвеєра Дженкінса або декларативний конвеєр


95

Я намагаюся перетворити мій робочий процес проекту старого стилю на конвеєр на основі Дженкінса. Переглядаючи документи, я виявив, що існує два різних синтаксиси з іменем scriptedта declarative. Наприклад, declarativeнещодавно (кінець 2016 року) веб- синтаксис Jenkins . Хоча є новий випуск синтаксису, Дженкінс все ще підтримує також синтаксис сценаріїв.

Зараз я не впевнений, у якій ситуації найкраще збігається кожен із цих двох типів. scriptedсинтаксис скоро буде застарілим? Тож чи declarativeбуде майбутнє трубопроводу Дженкінса?

Усі, хто може поділитися думками щодо цих двох типів синтаксису.


1
Я не бачу нічого з приводу застарілого сценарію, і це би насторожило, враховуючи розрив між декларативним та сценарієм.
Matt Schuchard,

Відповіді:


86

Коли вперше було створено трубопровід Дженкінса, в якості основи був обраний Гроовий. Дженкінс вже давно поставляється з вбудованим двигуном Groovy, щоб забезпечити розширені можливості сценарію як для адміністраторів, так і для користувачів. Крім того, впроваджувачі Jenkin Pipeline встановили, що Groovy є міцною основою, на якій можна побудувати те, що зараз називається DSL "Сценарій трубопроводу".

Оскільки це повністю функціональне середовище програмування, Scripted Pipeline пропонує величезну кількість гнучкості та розширюваності для користувачів Jenkins. Крива навчання Groovy зазвичай не бажана для всіх членів даної команди, тому Декларативний конвеєр був створений, щоб запропонувати більш простий і висловлюваний синтаксис для написання Дженкінса Трубопровід.

Обидва вони принципово одна і та ж підсистема трубопроводів. Вони обидва довговічні реалізації "Трубопровід як код". Вони обидва можуть використовувати кроки, вбудовані в Pipeline або надані плагінами. Обидва можуть використовувати спільні бібліотеки

Однак вони відрізняються між собою синтаксисом та гнучкістю. Декларація обмежує доступне користувачеві більш сувору та заздалегідь визначену структуру, що робить його ідеальним вибором для більш простих конвеєрів безперервної доставки. Сценарій надає дуже мало обмежень, оскільки єдині обмеження структури та синтаксису, як правило, визначаються самим Groovy, а не будь-якими системами, специфічними для трубопроводу, що робить його ідеальним вибором для досвідчених користувачів та тих, хто має більш складні вимоги. Як випливає з назви, Декларативний трубопровід заохочує декларативну модель програмування. Тоді як сценарії трубопроводів слідують більш імперативній моделі програмування.

Скопійовано з https://jenkins.io/doc/book/pipeline/syntax/#compare


5
Я намагався перенести низку декларативних конвеєрних завдань на сценарій конвеєра, оскільки вони були "ідеальним вибором для досвідчених користувачів та тих, хто має більш складні вимоги". Існує майже нульова документація для сценарію сценарію. Жоден. Це майже марно, як це. Це велика різниця, яку люди повинні знати.
капустя

6
@cauchy є однакова документація як для сценаріїв, так і для декларування, але оскільки сценарій призначений для просунутих користувачів, його не той, який відображається першим, але вся документація містить документацію як сценарії, так і декларативні трубопроводи та приклади. Вам просто потрібно перемкнути відрізок синтаксису під кожним прикладом документації декларативного конвеєра
Ilhicas

1
@Ilhicas де? У посібнику користувача немає жодних "перемикань". У вас є посилання? Навіть кроки на конвеєрному сценарії просто говорять про відсутність відмінностей із декларативним трубопроводом та посиланнями на документи декларативного конвеєра, що вводить в оману.
капустяний

3
@cauchy приклад jenkins.io/doc/book/pipeline , внизу є перемикач, який переходить до jenkins.io/doc/book/pipeline/# , який розширює сценарій, що відповідає сценарію декларативного конвеєра
Ilhicas

Проблема покладається на те, що ви не прочитали належним чином документацію. "Ось приклад Jenkinsfile із використанням синтаксису декларативного конвеєра - його еквівалент скриптового синтаксису можна отримати, натиснувши посилання" Переключити сценарій конвеєра "нижче:" Це в Офіційній документації! Читайте, тоді ви можете робити такі твердження .. якщо вони справджуються ..
Ілхікас

57

Інша річ, яку слід врахувати, це те, що декларативні трубопроводи мають крок сценарію () . Це може запустити будь-який сценарій конвеєра. Тож моя рекомендація полягатиме в тому, щоб використовувати декларативні трубопроводи, а за потреби використовувати script()для сценаріїв сценаріїв. Тому ви отримуєте найкраще з обох світів.


3
Чи є у вас приклади використання блоку script () у декларативному конвеєрі? Це посилання не має.
користувач2023861

Якщо ви виявили, що кілька разів використовуєте scriptблок у декларативному конвеєрі, вам слід задуматися про використання сценарію конвеєра до кінця.
Кру

Моя перевага - це декларитивний трубопровід над сценаріями сценаріїв, як згадував @CodyK. Так, я погоджуюся, що це декілька складних ситуацій, в яких ми можемо використовувати сценарії сценаріїв. Однак спрощене планування завжди зменшує складність і більшість часу прокладе шлях до більш простого декларативного трубопроводу.
НІК

18

Нещодавно я перейшов на декларативний з сценарію з агентом kubernetes. До липня 18 року декларативні трубопроводи не мали повної можливості вказувати кубернетні стручки. Однак із додаванням yamlFileкроку тепер ви можете прочитати шаблон свого стручка з файлу yaml у вашому репо.

Потім ви можете, наприклад, використовувати великий плагін kubernetes vscode для перевірки шаблону стручка, а потім прочитати його у вашому Jenkinsfile і використовувати контейнери в необхідних кроках.

pipeline {
  agent {
    kubernetes {
      label 'jenkins-pod'
      yamlFile 'jenkinsPodTemplate.yml'
    }
  }
  stages {
    stage('Checkout code and parse Jenkinsfile.json') {
      steps {
        container('jnlp'){
          script{
            inputFile = readFile('Jenkinsfile.json')
            config = new groovy.json.JsonSlurperClassic().parseText(inputFile)
            containerTag = env.BRANCH_NAME + '-' + env.GIT_COMMIT.substring(0, 7)
            println "pipeline config ==> ${config}"
          } // script
        } // container('jnlp')
      } // steps
    } // stage

Як було сказано вище, ви можете додати блоки сценаріїв. Приклад шаблону стручка зі спеціальними jnlp та docker.

apiVersion: v1
kind: Pod
metadata:
  name: jenkins-pod
spec:
  containers:
  - name: jnlp
    image: jenkins/jnlp-slave:3.23-1
    imagePullPolicy: IfNotPresent
    tty: true
  - name: rsync
    image: mrsixw/concourse-rsync-resource
    imagePullPolicy: IfNotPresent
    tty: true
    volumeMounts:
      - name: nfs
        mountPath: /dags
  - name: docker
    image: docker:17.03
    imagePullPolicy: IfNotPresent
    command:
    - cat
    tty: true
    volumeMounts:
      - name: docker
        mountPath: /var/run/docker.sock
  volumes:
  - name: docker
    hostPath:
      path: /var/run/docker.sock
  - name: nfs
    nfs:
      server: 10.154.0.3
      path: /airflow/dags

1
Це найкорисніша відповідь, яку я бачив за весь рік: Д дякую
Тревор Рудольф

14

Декларативний, здається, є більш надійним варіантом і тим, який рекомендують люди. це єдиний, який може підтримувати редактор Visual Pipeline. він підтримує перевірку. і в кінцевому підсумку ви маєте більшу силу сценарію, оскільки ви можете повернутися до сценарію в більшості контекстів. іноді хтось придумує варіант використання, коли вони не можуть зробити те, що хочуть, з декларативом, але це, як правило, люди, які вже деякий час використовують сценарій, і ці прогалини у функціях, швидше за все, скорочуються в часі.

більше контексту: https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/


4
Не існує такого поняття, як більш стійкі до майбутнього, вони служать різній аудиторії та цілям, і обидва мають однакову базову систему, про що йдеться у кількох інших відповідях тут. Декларативне обмежує користувача, сценарій дає їм занадто багато свободи, тому для застосування кожного вам потрібно бути на різних рівнях знань.
Ілгікас,

3
я погоджуюсь з тобою. ця відповідь була найкращою на той час, коли я її писав, але я радий, що автори дженкінів зараз задокументували відмінності і дали зрозуміти, що сценарій не зникне найближчим часом. :)
burnettk

7

Документація Дженкінса правильно пояснює та порівнює обидва типи.

Цитую: "Сценарійний трубопровід пропонує величезну кількість гнучкості та розширюваності для користувачів Дженкінса. Крива навчання Groovy зазвичай не бажана для всіх членів даної команди, тому Декларативний конвеєр був створений, щоб запропонувати більш простий і висловлюваний синтаксис для авторство трубопроводу Дженкінса.

Обидва вони в основному одна і та ж підсистема трубопроводу ".

Детальніше читайте тут: https://jenkins.io/doc/book/pipeline/syntax/#compare


1
  1. Декларативний конвеєр визначається в блоці, позначеному "трубопровід", тоді як сценарій сценарію визначений у "вузлі".
  2. Синтаксис - декларативний конвеєр має "етапи", "кроки"
  3. Якщо збірка не вдається, декларативний дає вам можливість перезапустити збірку з цього етапу ще раз, що не відповідає дійсності сценарію
  4. Якщо у сценарії є якісь проблеми, декларатив повідомить вас, як тільки ви створите роботу, але у випадку сценарію він пройде етап "Окей" і викине помилку на етап "Не гаразд"

Ви також можете посилатися на це. Дуже добре читати -> https://e.printstacktrace.blog/jenkins-scripted-pipeline-vs-declarative-pipeline-the-4-practical-differences/ @ Szymon.Stepniak https://stackoverflow.com/users/ 2194470 / szymon-stepniak? Tab = профіль


0

Декларативного Pipeline далеко перевершує Scripted трубопроводу . Декларативний конвеєр може виконати все, що може зробити сценарій конвеєра, використовуючи сценарій-крок і має багато додаткових функцій.

Крім того, Декларативний трубопровід має підтримку різних технологій, таких як Docker або Kubernetes (див. Тут ).

Декларативний трубопровід також є більш надійним доказом. Він ще в розробці, а нові функції, такі як нещодавно представлена функція Matrix , були додані зовсім недавно в кінці 2019 року.

tl; dr - Декларативний трубопровід може зробити все, що може зробити, і навіть більше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.