Jenkins CI Pipeline Scripts không được phép sử dụng phương thức groovy.lang.GroovyObject


104

Tôi đang sử dụng Jenkins 2 để biên dịch các Dự án Java, tôi muốn đọc phiên bản từ pom.xml, tôi đã làm theo ví dụ sau:

https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md

Ví dụ gợi ý:

Đường ống Jenkins đầy đủ với chức năng có vấn đề được khoanh tròn

Có vẻ như có một số vấn đề bảo mật khi truy cập Hệ thống tệp nhưng tôi không thể tìm ra nguyên nhân gây ra sự cố (hoặc tại sao) đó là:

Tôi chỉ làm khác một chút so với ví dụ:

def version() {
    String path = pwd();
    def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
    return matcher ? matcher[0][1] : null
}

Lỗi tôi gặp phải khi chạy phương pháp 'phiên bản':

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object (org.codehaus.groovy.runtime.GStringImpl call org.codehaus.groovy.runtime.GStringImpl)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectMethod(StaticWhitelist.java:165)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:117)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:103)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:15)
    at WorkflowScript.run(WorkflowScript:71)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:55)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
    at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:100)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
    at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
    at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:106)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:79)
    at sun.reflect.GeneratedMethodAccessor408.invoke(Unknown Source)

Tôi đang sử dụng các phiên bản này: Plugin Pipeline 2.1 Jenkins 2.2


Tôi đã gặp lỗi tương tự về Scripts not permitted to use method, nhưng nó đã xảy ra vì tôi đã viết scm 'checkout'thay vì checkou scm. Đề phòng ai đó rơi vào điều này, hãy coi chừng cú pháp xấu :). Làm như Maarten Kieft nói cho phép tôi nhìn thấy một thông báo lỗi rõ ràng hơn về lệnh xấu :)
GabLeRoux

Câu trả lời:


261

Quickfix

Tôi đã gặp sự cố tương tự và tôi đã giải quyết nó bằng cách sau

  1. Điều hướng đến jenkins> Quản lý jenkins> Phê duyệt tập lệnh trong quá trình
  2. Có một lệnh đang chờ xử lý, tôi phải chấp thuận.

Liên kết phê duyệt trong quá trình trong Jenkins 2.61 Phương án 1: Tắt hộp cát

Như bài viết này giải thích sâu hơn, các tập lệnh Groovy được chạy ở chế độ hộp cát theo mặc định. Điều này có nghĩa là một tập hợp con các phương thức Groovy được phép chạy mà không cần sự chấp thuận của quản trị viên. Cũng có thể chạy tập lệnh không ở chế độ hộp cát, điều này có nghĩa là toàn bộ tập lệnh cần được quản trị viên phê duyệt ngay lập tức. Điều này ngăn người dùng phê duyệt từng dòng tại thời điểm đó.

Việc chạy các tập lệnh không có hộp cát có thể được thực hiện bằng cách bỏ chọn hộp kiểm này trong cấu hình dự án của bạn ngay bên dưới tập lệnh của bạn: nhập mô tả hình ảnh ở đây

Phương án 2: Tắt bảo mật tập lệnh

Như bài viết này giải thích, bạn cũng có thể tắt hoàn toàn bảo mật tập lệnh. Trước tiên hãy cài đặt plugin bảo mật tập lệnh dễ dàng và sau đó thay đổi tệp jenkins.xml của bạn, hãy thêm đối số này:

-Dpermissive-script-security.enabled = true

Vì vậy, bạn jenkins.xml sẽ trông giống như sau:

<executable>..bin\java</executable>
<arguments>-Dpermissive-script-security.enabled=true -Xrs -Xmx4096m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=80 --webroot="%BASE%\war"</arguments>

Hãy chắc chắn rằng bạn biết bạn đang làm gì nếu bạn thực hiện điều này!


1
Nếu phê duyệt toàn bộ kịch bản thì tốt hơn, phụ thuộc vào cơ cấu đội. Đối với một số nhà phát triển có toàn quyền truy cập, nó khá hay. Nhưng một thiết lập với nhiều nhóm sẽ buộc quản trị viên phải chấp thuận mọi thay đổi trong tất cả các tập lệnh đường dẫn.
Roger Lehmann

2
Phương án 3 (thực sự nên là gợi ý đầu tiên) là thay đổi mã không có trong danh sách có vấn đề . Trong trường hợp này, chỉ cần sử dụng đơn giản @NonCPSMatcherđủ. Trong trường hợp này, không cần thiết phải tắt bảo mật cho toàn bộ đường dẫn và đặc biệt là toàn bộ cài đặt Jenkins. Đánh giá từng cuộc gọi bị chặn riêng lẻ và quyết định xem bạn có thực sự cần phê duyệt chúng hay không.
mkobit

1
@mkobit không phù hợp với tôi. @NonCPSkhông giúp ích gì.
warvariuc

@warvariuc hmm, có thể là nếu bạn đang Matchertự quay lại vì Matcherkhông triển khai Serializablegiao diện. Nó có thể đáng để đặt một câu hỏi mới. Tôi ước rằng tài liệu tham chiếu trong câu hỏi ban đầu được duy trì và không sai khi bắt đầu.
mkobit 20/03/18

2
@mkobit Tôi đã trang trí bằng NonCPS một hàm sử dụng currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId(). NonCPS không giúp gì cho các vấn đề bảo mật, từ những gì tôi đọc được.
warvariuc

12

Bạn phải tắt hộp cát cho Groovy trong cấu hình công việc của mình.

Hiện tại, điều này không thể thực hiện được đối với các dự án multibranch trong đó script thú vị đến từ scm. Để biết thêm thông tin, hãy xem https://issues.jenkins-ci.org/browse/JENKINS-28178


6

Tôi đã gặp phải vấn đề này khi giảm số lượng tham số do người dùng nhập trong userInput từ 3 xuống 1. Điều này đã thay đổi kiểu đầu ra biến của userInput từ một mảng thành nguyên thủy.

Thí dụ:

myvar1 = userInput['param1']
myvar2 = userInput['param2']

đến:

myvar = userInput

Đây chính xác là cách khắc phục các triệu chứng mà tôi gặp phải. Thông báo lỗi là org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object. Phương pháp này dự kiến 2 thông số và đã nhận được 3.
Tyler W

4

Để vượt qua hộp cát của các tập lệnh Groovy được lưu trữ trong SCM, tôi khuyên bạn nên chạy tập lệnh dưới dạng Groovy Command (thay vì tệp Groovy Script ):

import hudson.FilePath
final GROOVY_SCRIPT = "workspace/relative/path/to/the/checked/out/groovy/script.groovy"

evaluate(new FilePath(build.workspace, GROOVY_SCRIPT).read().text)

trong trường hợp như vậy, tập lệnh Groovy được chuyển từ không gian làm việc sang Jenkins Master nơi nó có thể được thực thi như một system Groovy Script. Hộp cát bị chặn miễn là Hộp cát Sử dụng Groovy không được chọn .


5
Điều này có vẻ phức tạp, rủi ro và chắc chắn sẽ quay lại và cắn bạn.
Simon Forsberg

4
Chà, bảo mật rất quan trọng, đặc biệt là khi nó bảo vệ dữ liệu nhạy cảm của người dùng nhưng nó cũng đi kèm với cái giá phải trả là phức tạp trong quá trình phát triển. Khi công cụ bảo mật mới được triển khai một nửa, nó thậm chí còn tồi tệ hơn. Hộp cát tập lệnh Jenkins là một ví dụ hay về công cụ bảo mật được triển khai một nửa và kết quả là bạn có thể cần phải vô hiệu hóa hoàn toàn tính năng này vì nếu không, điều đó có nghĩa là bạn sẽ không sử dụng được.
Stepan Vavra,

3
Trong trường hợp của tôi, sau khi nâng cấp từ Jenkins cũ hơn, tập lệnh Groovy của tôi ngừng hoạt động và cách duy nhất để làm cho tập lệnh hoạt động là chạy tập lệnh 300 lần (chỉ là ước tính) và cho mỗi lần chạy, nhấp vào giao diện người dùng Jenkins để cho phép tất cả các cuộc gọi phương thức trong một tập lệnh 200 dòng. Hơn nữa, giao diện người dùng không cho phép bạn dán danh sách đầy đủ tất cả các lệnh gọi phương thức được phép trong trường hợp bạn có thể tạo chúng bằng cách nào đó. Ngoài ra, giao diện người dùng ngừng hiển thị một số lệnh gọi phương thức và sau một thời gian, tôi không thể tiếp tục.
Stepan Vavra,
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.