Đường dẫn kịch bản hoặc đường dẫn khai báo Jenkins


95

Tôi đang cố gắng chuyển đổi quy trình làm việc cơ sở dự án kiểu cũ của mình thành một đường ống dựa trên Jenkins. Trong khi xem qua tài liệu, tôi thấy có hai cú pháp khác nhau có tên scripteddeclarative. Chẳng hạn như declarativebản phát hành cú pháp web Jenkins gần đây (cuối năm 2016). Mặc dù có một bản phát hành cú pháp mới, Jenkins vẫn hỗ trợ cú pháp theo kịch bản.

Bây giờ, tôi không chắc trong tình huống nào thì hai loại này sẽ phù hợp nhất. scriptedcú pháp sẽ sớm bị ngừng sử dụng? Vì vậy, sẽ declarativelà tương lai của đường ống Jenkins?

Bất cứ ai có thể chia sẻ một số suy nghĩ về hai loại cú pháp này.


1
Tôi không thấy bất cứ điều gì về việc tập lệnh trở nên không được dùng nữa và điều đó sẽ đáng báo động khi xem xét khoảng cách tính năng giữa khai báo và tập lệnh.
Matt Schuchard

Câu trả lời:


85

Khi Jenkins Pipeline lần đầu tiên được tạo ra, Groovy đã được chọn làm nền tảng. Jenkins từ lâu đã xuất xưởng với một công cụ Groovy nhúng để cung cấp khả năng tạo tập lệnh nâng cao cho quản trị viên cũng như người dùng. Ngoài ra, những người triển khai Jenkins Pipeline nhận thấy Groovy là một nền tảng vững chắc để xây dựng cái mà ngày nay được gọi là DSL "Đường ống có Tập lệnh".

Vì nó là một môi trường lập trình đầy đủ tính năng, Scripts Pipeline cung cấp một lượng lớn tính linh hoạt và khả năng mở rộng cho người dùng Jenkins. Đường cong học tập Groovy thường không được mong muốn đối với tất cả các thành viên của một nhóm nhất định, vì vậy Đường ống so sánh được tạo ra để cung cấp một cú pháp đơn giản và chắc chắn hơn cho tác giả Jenkins Pipeline.

Cả hai về cơ bản là cùng một hệ thống con Pipeline bên dưới. Cả hai đều là cách triển khai lâu dài của "Đường ống dưới dạng mã." Cả hai đều có thể sử dụng các bước được tích hợp trong Pipeline hoặc được cung cấp bởi các plugin. Cả hai đều có thể sử dụng Thư viện được chia sẻ

Tuy nhiên, chúng khác nhau ở điểm nào là cú pháp và tính linh hoạt. Khai báo giới hạn những gì có sẵn cho người dùng với cấu trúc chặt chẽ hơn và được xác định trước, khiến nó trở thành lựa chọn lý tưởng cho các đường ống phân phối liên tục đơn giản hơn. Script cung cấp rất ít giới hạn, trong chừng mực các giới hạn duy nhất về cấu trúc và cú pháp có xu hướng được xác định bởi chính Groovy, thay vì bất kỳ hệ thống dành riêng cho Pipeline nào, khiến nó trở thành lựa chọn lý tưởng cho người dùng thành thạo và những người có yêu cầu phức tạp hơn. Như tên của nó, Decl Compare Pipeline khuyến khích một mô hình lập trình khai báo. Trong khi các Đường ống được Tập lệnh tuân theo một mô hình lập trình bắt buộc hơn.

Được sao chép từ https://jenkins.io/doc/book/pipeline/syntax/#compare


5
Tôi đã cố gắng chuyển một loạt các công việc đường ống khai báo sang đường ống theo tập lệnh vì chúng là "lựa chọn lý tưởng cho người dùng thành thạo và những người có yêu cầu phức tạp hơn". Hầu như không có tài liệu nào cho đường ống được tập lệnh. Không ai. Nó gần như vô dụng như thế này. Đây là một sự khác biệt lớn mà mọi người nên lưu ý.
cauchy

6
@cauchy có cùng một tài liệu cho cả đường ống được tập lệnh và khai báo, nhưng vì tập lệnh dành cho người dùng nâng cao nên nó không phải là tài liệu được hiển thị đầu tiên, nhưng tất cả các tài liệu đều có cả tài liệu và ví dụ về đường ống được tập lệnh và khai báo. Bạn chỉ cần có để chuyển đổi cú pháp scipted bên dưới mỗi ví dụ tài liệu của đường ống declarative
Ilhicas

1
@Ilhicas ở đâu? Không có "chuyển đổi" trong sổ tay người dùng. Bạn có một liên kết? Ngay cả các bước đường ống trên đường ống được viết kịch bản cũng chỉ nói rằng không có sự khác biệt nào với đường ống khai báo và các liên kết đến tài liệu đường ống khai báo, điều này gây hiểu lầm.
cauchy

3
@cauchy ví dụ jenkins.io/doc/book/pipeline , bên dưới có một nút chuyển đổi đến jenkins.io/doc/book/pipeline/# , mở rộng tương đương với tập lệnh của đường dẫn khai báo
Ilhicas 10/09/18

Vấn đề phụ thuộc vào việc bạn không đọc đúng tài liệu, "Đây là một ví dụ về Jenkinsfile sử dụng cú pháp Đường ống so sánh - bạn có thể truy cập cú pháp tương đương với cú pháp được Tập lệnh của nó bằng cách nhấp vào liên kết Chuyển đổi Đường ống được mã hóa bên dưới:" Đây là trong Tài liệu chính thức! Đọc, sau đó bạn có thể lập báo cáo như vậy .. nếu họ giữ đúng ..
Ilhicas

57

Một điều khác cần xem xét là các đường ống khai báo có bước script () . Điều này có thể chạy bất kỳ đường ống theo tập lệnh nào. Vì vậy, khuyến nghị của tôi sẽ là sử dụng các đường ống khai báo và nếu cần sử dụng script()cho các đường ống có tập lệnh. Do đó bạn sẽ có được những điều tốt nhất của cả hai thế giới.


3
Bạn có ví dụ nào về việc sử dụng một khối script () trong một đường dẫn khai báo không? Liên kết đó không có.
user2023861

Nếu bạn thấy mình sử dụng một vài lần một scriptkhối trong đường dẫn khai báo, bạn nên cân nhắc sử dụng đường ống có tập lệnh.
Kru

Sự thích hợp của tôi là đường ống Khai báo trên đường ống có tập lệnh như @CodyK đã đề cập. Vâng, tôi đồng ý rằng đây là một số tình huống phức tạp mà chúng tôi có thể sử dụng đường ống theo kịch bản. Tuy nhiên, việc lập kế hoạch đơn giản hóa theo kiểu prope luôn làm giảm sự phức tạp và hầu hết thời gian sẽ mở đường hướng tới quy trình khai báo đơn giản hơn.
NIK

18

Gần đây, tôi đã chuyển sang khai báo từ tập lệnh với tác nhân kubernetes. Cho đến tháng 7 năm 1818, các đường ống khai báo không có đầy đủ khả năng chỉ định các nhóm kubernetes. Tuy nhiên, với việc bổ sung yamlFilebước này, giờ đây bạn có thể đọc mẫu nhóm của mình từ tệp yaml trong repo của mình.

Điều này sau đó cho phép bạn sử dụng plugin kubernetes tuyệt vời của vscode để xác thực mẫu nhóm của bạn, sau đó đọc nó vào tệp Jenkins của bạn và sử dụng các vùng chứa theo các bước tùy ý.

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

Như đã đề cập ở trên, bạn có thể thêm các khối script. Mẫu nhóm ví dụ với jnlp và docker tùy chỉnh.

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
Đây là câu trả lời hữu ích nhất mà tôi đã nhìn thấy tất cả các năm: D thanks
Trevor Rudolph

14

khai báo dường như là tùy chọn chứng minh trong tương lai hơn và là tùy chọn mà mọi người khuyên dùng. nó là cái duy nhất mà Visual Pipeline Editor có thể hỗ trợ. nó hỗ trợ xác nhận. và nó kết thúc bằng hầu hết sức mạnh của tập lệnh vì bạn có thể quay trở lại tập lệnh trong hầu hết các ngữ cảnh. đôi khi ai đó đưa ra một trường hợp sử dụng mà họ không thể thực hiện được những gì họ muốn với tính năng khai báo, nhưng đây thường là những người đã sử dụng tập lệnh một thời gian và những khoảng cách về tính năng này có thể sẽ đóng lại trong thời gian.

thêm ngữ cảnh: https://jenkins.io/blog/2017/02/03/decl Compare-pipeline-ga/


4
Không có cái gọi là chứng minh tương lai hơn, chúng phục vụ các đối tượng và mục đích khác nhau và cả hai đều có cùng một hệ thống cơ bản, như được nêu trong nhiều câu trả lời khác ở đây. Khai báo đang hạn chế người dùng, kịch bản cho họ quá nhiều tự do, vì vậy bạn cần phải ở các cấp độ kiến ​​thức khác nhau về jenkins để áp dụng từng thứ.
Ilhicas

3
tôi đồng ý với bạn. câu trả lời này là tốt nhất tại thời điểm tôi viết nó, nhưng tôi rất vui vì các tác giả của jenkins đã ghi lại sự khác biệt tốt hơn bây giờ và nói rõ rằng kịch bản sẽ không sớm biến mất. :)
burnettk

7

Tài liệu Jenkins giải thích đúng và so sánh cả hai loại.

Trích dẫn: "Scripts Pipeline cung cấp rất nhiều tính linh hoạt và khả năng mở rộng cho người dùng Jenkins. Đường cong học tập Groovy thường không mong muốn cho tất cả các thành viên của một nhóm nhất định, vì vậy Decl Compare Pipeline đã được tạo ra để cung cấp một cú pháp đơn giản hơn và phù hợp hơn cho tác giả Jenkins Pipeline.

Cả hai về cơ bản là cùng một hệ thống con Pipeline bên dưới. "

Đọc thêm tại đây: https://jenkins.io/doc/book/pipeline/syntax/#compare


1
  1. Đường ống khai báo được xác định trong một khối có nhãn 'đường ống' trong khi đường ống theo tập lệnh được xác định trong 'nút'.
  2. Cú pháp - Đường ống khai báo có 'Giai đoạn', 'Bước'
  3. Nếu bản dựng không thành công, phần khai báo cung cấp cho bạn một tùy chọn để khởi động lại bản dựng từ giai đoạn đó một lần nữa, điều này không đúng trong tùy chọn theo tập lệnh
  4. Nếu có bất kỳ vấn đề nào trong quá trình viết kịch bản, phần khai báo sẽ thông báo cho bạn ngay khi bạn xây dựng công việc nhưng trong trường hợp có kịch bản, nó sẽ vượt qua giai đoạn là 'Được rồi' và lỗi ở giai đoạn là 'Không ổn'

Bạn cũng có thể tham khảo điều này. Sách rất hay -> https://e.printstacktrace.blog/jenkins-scripted-pipeline-vs-decl Compare-pipeline-the-4-practical-differences/ @ Szymon.Stepniak https://stackoverflow.com/users/ 2194470 / szymon-stepniak? Tab = hồ sơ


0

Các Declarative Pipeline là cao hơn nhiều so với Scripted đường ống . Đường ống so sánh có thể thực thi mọi thứ mà Đường ống được mã hóa có thể bằng cách sử dụng bước tập lệnh và có rất nhiều tính năng bổ sung.

Hơn nữa, Đường ống so sánh có hỗ trợ cho các công nghệ khác nhau như Docker hoặc Kubernetes (xem tại đây ).

Đường ống so sánh cũng là bằng chứng trong tương lai. Nó vẫn đang trong quá trình phát triển và các tính năng mới như tính năng Ma trận mới được giới thiệu đã được thêm vào gần đây vào cuối năm 2019.

tl; dr - Đường ống so sánh có thể làm mọi thứ mà Đường ống được mã hóa có thể làm được và thậm chí hơn thế nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.