首页 文章

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

提问于
浏览
44

我正在尝试将旧式项目基础工作流转换为基于Jenkins的管道 . 在经历docs时,我发现有两种不同的语法,名为 scripteddeclarative . 比如最近Jenkins web declarative 语法发布(2016年底) . 虽然有一个新的语法版本,但Jenkins仍然支持脚本语法 .

现在,我不确定这两种类型中哪一种最适合 . scripted 语法很快就会被弃用? declarative 将成为Jenkins管道的未来吗?

任何可以分享关于这两种语法类型的想法的人 .

5 回答

  • 5

    另一件需要考虑的事情是声明性管道有一个script() step . 这可以运行任何脚本化管道 . 所以我的建议是使用声明性管道,如果需要,使用 script() 作为脚本化管道 . 因此,您将获得两全其美 .

  • 2

    声明似乎是更具有前瞻性的选择,也是人们推荐的选择 . 它是Visual Pipeline Editor唯一可以支持的 . 它支持验证 . 它最终拥有脚本的大部分功能,因为你可以在大多数情况下回归脚本 . 偶尔会有人提出一个用例,他们不能完全按照声明的方式做他们想做的事情,但这通常是那些已经使用脚本一段时间的人,这些功能差距很可能会及时关闭 .

    更多背景:https://jenkins.io/blog/2017/02/03/declarative-pipeline-ga/

  • 14

    首次创建Jenkins Pipeline时,Groovy被选为基础 . Jenkins长期以来一直使用嵌入式Groovy引擎为管理员和用户提供高级脚本编写功能 . 此外,Jenkins Pipeline的实现者发现Groovy是构建现在被称为“Scripted Pipeline”DSL的坚实基础 . 由于它是一个功能齐全的编程环境,Scripted Pipeline为Jenkins用户提供了极大的灵活性和可扩展性 . Groovy学习曲线通常不适合给定团队的所有成员,因此创建Declarative Pipeline是为了为Jenkins Pipeline创作提供更简单,更具见解性的语法 . 这两个基本上都是下面的Pipeline子系统 . 它们都是“Pipeline as code”的持久实现 . 他们都能够使用Pipeline内置的步骤或插件提供的步骤 . 两者都能够利用共享库,但它们的语法和灵活性不同 . 声明性限制用户可以使用更严格和预定义的结构,使其成为更简单的连续交付管道的理想选择 . Scripted提供的限制很少,因为结构和语法的唯一限制往往由Groovy本身定义,而不是任何管道专用系统,使其成为高级用户和需求更复杂的用户的理想选择 . 顾名思义,Declarative Pipeline鼓励声明性编程模型 . 脚本管道遵循更为命令式的编程模型 .

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

  • 11

    Jenkins文档正确地解释并比较了这两种类型 .

    引用:“Scripted Pipeline为Jenkins用户提供了极大的灵活性和可扩展性 . 对于给定团队的所有成员来说,Groovy学习曲线通常并不理想,因此创建Declarative Pipeline是为了提供更简单,更具见解性的语法 . 创作詹金斯管道 .

    这两者基本上都是下面的管道子系统 . “

    在这里阅读更多:https://jenkins.io/doc/book/pipeline/syntax/#compare

  • 39

    我最近使用kubernetes代理编写了一个声明的转换 . 直到7月'18 declarative pipelines didn' t才能完全指定kubernetes pods . 但是,通过添加 yamlFile 步骤,您现在可以从repo中的yaml文件中读取pod模板 .

    这样就可以使用例如vscode的kubernetes插件用于验证您的pod模板,然后将其读入您的Jenkins文件,并根据需要逐步使用容器 .

    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
    

相关问题