2016-10-03 24 views
19

Tôi đang cố gắng tạo tập lệnh đường dẫn Jenkins khai báo nhưng có vấn đề với khai báo biến đơn giản.Jenkins: Không thể xác định biến trong giai đoạn đường ống

Đây là kịch bản của tôi:

pipeline { 
    agent none 
    stages { 
     stage("first") { 
      def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13." 
      sh "echo ${foo}" 
     } 
    } 
} 

Tuy nhiên, tôi nhận được lỗi này:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
WorkflowScript: 5: Expected a step @ line 5, column 13. 
      def foo = "foo" 
     ^

Tôi đang trên Jenkins 2.7.4 và đường ống 2.4.

Trả lời

30

Mô hình khai báo cho Jenkins Pi pelines có một tập con cú pháp giới hạn mà nó cho phép trong các khối stage - see the syntax guide for more info. Bạn có thể bỏ qua hạn chế đó bằng cách gói các bước của bạn trong khối script { ... }, nhưng do đó, bạn sẽ mất xác thực cú pháp, tham số, v.v. trong khối script.

15

Tôi nghĩ rằng lỗi không đến từ dòng được chỉ định mà từ 3 dòng đầu tiên. Hãy thử điều này thay vì:

node { 
    stage("first") { 
    def foo = "foo" 
    sh "echo ${foo}" 
    } 
} 

Tôi nghĩ rằng bạn đã có một số dòng thêm rằng không có giá trị ...

EDIT

Từ declaractive pipeline model documentation, có vẻ như bạn phải sử dụng một tuyên bố environment chặn để khai báo các biến của bạn, ví dụ:

pipeline { 
    environment { 
    FOO = "foo" 
    } 

    agent none 
    stages { 
     stage("first") { 
      sh "echo ${FOO}" 
     } 
    } 
} 
+0

Anh ấy sử dụng mới [Mô hình đường ống declarative] (https://github.com/jenkinsci/pipeline-model-definition -plugin/wiki/get% 20started) cú pháp, đó là lý do tại sao nó khác với những gì chúng ta biết ;-) – StephenKing

+1

Rất tiếc, không thấy mô hình đường ống khai báo mới, tôi đã chỉnh sửa bài đăng của mình cho phù hợp! – Pom12

3

Đồng ý với @ Pom12, @abayer. Để hoàn thành câu trả lời bạn cần phải thêm kịch bản khối

Hãy thử somethign như thế này:

pipeline { 
    agent any 
    environment { 
     ENV_NAME = "${env.BRANCH_NAME}" 
    } 

    // ---------------- 

    stages { 
     stage('Build Container') { 
      steps { 
       echo 'Building Container..' 

       script { 
        if (ENVIRONMENT_NAME == 'development') { 
         ENV_NAME = 'Development' 
        } else if (ENVIRONMENT_NAME == 'release') { 
         ENV_NAME = 'Production' 
        } 
       } 
       echo 'Building Branch: ' + env.BRANCH_NAME 
       echo 'Build Number: ' + env.BUILD_NUMBER 
       echo 'Building Environment: ' + ENV_NAME 

       echo "Running your service with environemnt ${ENV_NAME} now" 
      } 
     } 
    } 
} 
+0

Lưu ý rằng ví dụ này giả định rằng đã có một biến môi trường được xác định "ENVIRONMENT_NAME" có thể truy cập được vào jenkins. – Alberto

Các vấn đề liên quan