Jenkins脚本化管道或声明性管道


95

我正在尝试将旧样式的基于项目的工作流转换为基于Jenkins的管道。在浏览文档时,我发现有两种不同的语法分别命名为scripteddeclarative。例如declarative最近(2016年底)发布的Jenkins网络语法。尽管有一个新的语法版本,Jenkins仍然支持脚本化语法。

现在,我不确定这两种类型在哪种情况下是最佳匹配。scripted语法将很快被弃用吗?declarative詹金斯管道的未来会是这样吗?

可以分享有关这两种语法类型的一些想法的任何人。


1
我看不到任何有关脚本的过时的建议,考虑到声明式和脚本之间的功能差距,这将令人震惊。
马特·舒查德

Answers:


86

最初创建Jenkins Pipeline时,Groovy被选为基础。Jenkins长期以来一直提供嵌入式Groovy引擎,以为管理员和用户提供高级脚本功能。另外,Jenkins Pipeline的实现者发现Groovy是构建现在称为“脚本管道” DSL的坚实基础。

由于它是功能齐全的编程环境,因此脚本化管道为Jenkins用户提供了极大的灵活性和可扩展性。Groovy学习曲线通常不是给定团队的所有成员所希望的,因此创建了声明式管道,以为编写Jenkins Pipeline提供更简单,更自以为是的语法。

两者基本上都在下面是相同的Pipeline子系统。它们都是“管道作为代码”的持久实现。他们都可以使用内置在Pipeline中或由插件提供的步骤。两者都可以利用共享库

但是,它们的区别在于语法和灵活性。声明性限制使用更严格和预定义的结构为用户提供的功能,使其成为更简单的连续交付管道的理想选择。脚本化脚本提供的限制非常少,以至于对结构和语法的唯一限制往往是由Groovy本身定义的,而不是由任何特定于管道的系统定义的,因此,它成为高级用户和要求更复杂的用户的理想选择。顾名思义,声明性流水线鼓励使用声明性编程模型。而脚本化管道遵循更为必要的编程模型。

https://jenkins.io/doc/book/pipeline/syntax/#compare复制


5
我试图将一系列声明性管道作业移至脚本化管道,因为它们“对于高级用户和要求更复杂的用户是理想的选择”。脚本化管道的文档几乎为零。没有。这样几乎没用。人们应该意识到这是一个很大的差异。
cauchy

6
@cauchy对于脚本化和声明性管道都有相同的文档,但是由于脚本化是针对高级用户的,因此它不是首先显示的,而是所有文档都具有脚本化和声明性管道文档和示例。您只需要在声明性管道的每个文档示例下面切换scipted语法
Ilhicas,

1
@Ilhicas在哪里?用户手册中没有“切换”。你有链接吗?甚至脚本化管道上的管道步骤都只是说,声明性管道与指向声明性管道文档的链接没有区别,这具有误导性。
柯西

3
@cauchy示例jenkins.io/doc/book/pipeline,下面有一个切换到jenkins.io/doc/book/pipeline/#,它扩展了声明式管道的等效脚本
Ilhicas

问题取决于您没有正确阅读文档,“这是使用声明性管道语法的Jenkinsfile的示例-单击下面的“切换脚本管道”链接即可访问其等效的脚本语法:”这在正式文档中!阅读,然后您就可以发表这样的声明。.如果它们成立,那么..
Ilhicas

57

要考虑的另一件事是声明性管道具有script()步骤。这可以运行任何脚本化管道。因此,我的建议是使用声明性管道,并在需要时使用script()脚本化管道。因此,您将两全其美。


3
您是否有在声明式管道中使用script()块的示例?该链接没有任何内容。
user2023861

如果发现自己script在声明性管道中多次使用了一个块,则应考虑完全使用脚本化管道。
克鲁

我更喜欢声明性管道而不是@CodyK提到的脚本化管道。是的,我同意在某些复杂的情况下,我们可能会使用脚本化管道。但是,简化的计划总是会降低复杂性,并且大多数时间将为更简单的声明式管道铺平道路。
NIK

18

我最近从使用kubernetes代理编写的脚本切换到声明式。直到18年7月,声明性管道还没有完全指定kubernetes容器的能力。但是,通过添加该yamlFile步骤,您现在可以从存储库中的yaml文件中读取Pod模板。

然后,这使您可以使用例如vscode的出色kubernetes插件来验证您的pod模板,然后将其读入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的示例pod模板。

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
我同意你的看法。这个答案在我写这篇文章的时候是最好的,但是我很高兴詹金斯的作者现在更好地记录了这些差异,并且很清楚脚本不会很快消失。:)
burnettk

7

Jenkins文档正确解释并比较了两种类型。

引用:“脚本化管道为Jenkins用户提供了极大的灵活性和可扩展性。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 = profile


0

声明管道是远远优于脚本管道。声明性管道能够通过使用脚本步骤来执行脚本化管道可以执行的所有操作,并具有许多其他功能。

此外,声明性管道还支持DockerKubernetes等各种技术(请参阅此处)。

声明性管道也更适合将来使用。它仍在开发中,新功能如新引入的Matrix功能刚刚在2019年底添加。

tl; dr-声明式管道可以完成脚本化管道可以做的所有事情,甚至更多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.