Jenkinsスクリプトパイプラインまたは宣言型パイプライン


95

古いスタイルのプロジェクトベースのワークフローを、Jenkinsに基づくパイプラインに変換しようとしています。通過する間にドキュメント私は2つの異なる名前の構文がある見つけscriptedとはdeclarativedeclarative最近のJenkins Web 構文リリースなど(2016年末)。新しい構文リリースがありますが、Jenkinsはスクリプト化された構文もサポートしています。

さて、これら2つのタイプのどちらがどの状況に最適であるかはわかりません。scripted構文はまもなく廃止されますか?ではdeclarative、ジェンキンスパイプラインの将来はどうなるのでしょうか?

これらの2つの構文タイプについて考えを共有できる人なら誰でも。


1
スクリプトが非推奨になることについては何も見当たらないので、宣言型とスクリプト型の機能のギャップを考えると、憂慮すべきことでしょう。
Matt Schuchard 2017

回答:


85

Jenkins Pipelineが最初に作成されたとき、Groovyが基盤として選択されました。Jenkinsには長い間、Groovyエンジンが組み込まれており、管理者とユーザーの両方に高度なスクリプト機能を提供しています。さらに、Jenkins Pipelineの実装者は、Groovyが、現在「スクリプトパイプライン」DSLと呼ばれるものを構築するための強固な基盤であることを発見しました。

スクリプトパイプラインは、完全な機能を備えたプログラミング環境であるため、Jenkinsユーザーに多大な柔軟性と拡張性を提供します。Groovyの学習曲線は、特定のチームのすべてのメンバーにとって一般的に望ましいものではないため、Jenkins Pipelineを作成するためのよりシンプルで独断的な構文を提供するために宣言型パイプラインが作成されました。

この2つは、基本的には基本的に同じパイプラインサブシステムです。どちらも「コードとしてのパイプライン」の永続的な実装です。どちらもパイプラインに組み込まれている、またはプラグインによって提供されるステップを使用できます。どちらも共有ライブラリを利用できます

ただし、構文と柔軟性に違いがあります。宣言型は、より厳密で事前定義された構造でユーザーが利用できるものを制限するため、より単純な継続的デリバリーパイプラインに理想的な選択肢になります。Scriptedは、パイプライン固有のシステムではなく、構造と構文の唯一の制限がGroovy自体によって定義される傾向がある限り、ごくわずかな制限を提供します。これにより、パワーユーザーやより複雑な要件を持つユーザーにとって理想的な選択肢となります。名前が示すように、宣言型パイプラインは宣言型プログラミングモデルを推奨します。一方、スクリプトパイプラインは、より命令的なプログラミングモデルに従います。

https://jenkins.io/doc/book/pipeline/syntax/#compareからコピー


5
一連の宣言型パイプラインジョブは「パワーユーザーやより複雑な要件を持つユーザーにとって理想的な選択肢」であったため、スクリプトパイプラインに移動しようとしました。スクリプトパイプラインのドキュメントはほとんどありません。なし。このようにほとんど役に立たない。これは人々が知っておくべき大きな違いです。
コーシー、

6
@cauchyスクリプトパイプラインと宣言的パイプラインの両方に同じドキュメントがありますが、スクリプト化は上級ユーザー向けであるため、最初に表示されるものではなく、すべてのドキュメントにはスクリプトパイプラインと宣言的パイプラインの両方のドキュメントと例が含まれています。宣言型パイプラインの各ドキュメントの例の下にある構文を切り替えるだけです
Ilhicas

1
@Ilhicasどこ?ユーザーハンドブックには「トグル」はありません。リンクはありますか?スクリプトパイプラインのパイプラインステップでさえ、宣言型パイプラインとの違いはなく、誤解を招く宣言型パイプラインのドキュメントへのリンクがあるとだけ言っています。
コーシー2018

3
@cauchy例えばjenkins.io/doc/book/pipeline、に行くトグルある下回っjenkins.io/doc/book/pipeline/#宣言パイプラインのスクリプト等価拡大、
Ilhicas

この問題は、ドキュメントを正しく読んでいないことに依存しています。「宣言型パイプライン構文を使用したJenkinsfileの例-同等のスクリプト構文には、下の[スクリプトパイプラインの切り替え]リンクをクリックしてアクセスできます。」これは公式ドキュメントにあります。読んで、そのような発言をすることができます..それらが当てはまる場合..
Ilhicas

57

考慮すべきもう1つのことは、宣言型パイプラインにscript()ステップがあることです。これにより、スクリプトパイプラインを実行できます。したがって、私の推奨は、宣言型パイプラインを使用し、必要に応じscript()てスクリプトパイプラインを使用することです。したがって、両方の長所を利用できます。


3
宣言型パイプラインでscript()ブロックを使用した例はありますか?そのリンクには何もありません。
user2023861 2018

script宣言型パイプラインでブロックを数回使用していることに気付いた場合は、スクリプトパイプラインの使用をすべて検討する必要があります。
Kru

@CodyKが言及したように、私の好むのはスクリプトパイプラインよりも宣言型パイプラインです。はい、スクリプトパイプラインを使用する可能性があるいくつかの複雑な状況に同意します。しかし、計画を簡素化することで、常に複雑さが軽減され、ほとんどの場合、宣言的なパイプラインがよりシンプルになります。
NIK、

18

最近、kubernetesエージェントを使用したスクリプトから宣言型に切り替えました。2018年7月までは、宣言型パイプラインはkubernetesポッドを指定するための完全な機能を持っていませんでした。ただし、yamlFileステップを追加することで、リポジトリのyamlファイルからポッドテンプレートを読み取ることができます。

これにより、たとえば、vscodeの優れたkubernetesプラグインを使用してポッドテンプレートを検証し、それを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
これは、私が年間を通して見た中で最も役立つ回答です。Dありがとう
Trevor Rudolph

14

宣言型は、より将来性のあるオプションであり、人々が推奨するオプションのようです。Visual Pipeline Editorがサポートできるのはこれだけです。検証をサポートします。そして、ほとんどのコンテキストでスクリプトにフォールバックできるため、スクリプトのほとんどの機能を利用できます。誰かがユースケースを思い付くと、宣言型でやりたいことを完全に実行できない場合がありますが、これは通常、スクリプトをしばらく使用している人であり、これらの機能のギャップはすぐに解消される可能性があります。

より多くのコンテキスト:https : //jenkins.io/blog/2017/02/03/declarative-pipeline-ga/


4
ここで他の複数の回答で述べられているように、より将来性のあるものはありません。それらは異なるオーディエンスと目的に対応し、どちらも同じ基本システムを持っています。宣言型はユーザーを制限し、スクリプトは自由を与えすぎるため、それぞれを適用するにはジェンキンのさまざまな知識レベルにいる必要があります。
Ilhicas

3
仰るとおりです。この回答は私が書いた時点で最高でしたが、ジェンキンスの作者が違いをよりよく文書化し、scriptedがすぐになくなることはないことを明らかにしました。:)
burnettk 2018

7

Jenkinsのドキュメントでは、両方のタイプを適切に説明および比較しています。

引用すると、「スクリプトパイプラインは、Jenkinsユーザーに多大な柔軟性と拡張性を提供します。通常、特定のチームのすべてのメンバーにとってGroovy学習曲線は望ましくないため、宣言型パイプラインは、 Jenkins Pipelineのオーサリング。

この2つは基本的に同じパイプラインサブシステムです。」

詳細はこちら:https : //jenkins.io/doc/book/pipeline/syntax/#compare


1
  1. 宣言型パイプラインは「パイプライン」というラベルの付いたブロック内で定義されていますが、スクリプトパイプラインは「ノード」内で定義されています。
  2. 構文-宣言型パイプラインには「ステージ」、「ステップ」があります
  3. ビルドが失敗した場合、宣言型では、そのステージからビルドを再開するオプションが提供されますが、スクリプトオプションには当てはまりません
  4. スクリプトに問題がある場合、宣言的なものはジョブをビルドするとすぐに通知しますが、スクリプトの場合は「OK」であるステージをパスし、「OK」ではないステージでエラーをスローします

これを参照することもできます。非常に良い読み-> https://e.printstacktrace.blog/jenkins-scripted-pipeline-vs-declarative-pipeline-the-4-practical-differences/ @ Szymon.Stepniak https://stackoverflow.com/users/ 2194470 / szymon-stepniak?tab = profile


0

宣言パイプラインはよりはるかに優れているスクリプトのパイプライン。宣言型パイプラインは、スクリプトステップを使用してスクリプトパイプラインが実行できるすべてのことを実行でき、多くの追加機能を備えています。

さらに、Declarative Pipelineは、DockerKubernetesなどのさまざまなテクノロジーをサポートしています(こちらを参照)。

宣言的パイプラインは、将来の証拠にもなります。これはまだ開発中であり、新しく導入されたMatrix機能などの新機能が、2019年の終わりに最近追加されました。

tl; dr-宣言型パイプラインは、スクリプトパイプラインが実行できるすべてのことを実行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.