Jenkins CI Pipeline Script ไม่อนุญาตให้ใช้เมธอด groovy.lang.GroovyObject


105

ฉันใช้ Jenkins 2 เพื่อรวบรวม Java Projects ฉันต้องการอ่านเวอร์ชันจาก pom.xml ฉันทำตามตัวอย่างนี้:

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

ตัวอย่างแนะนำ:

ไปป์ไลน์ Jenkins เต็มรูปแบบพร้อมฟังก์ชันที่มีปัญหาวนเวียนอยู่

ดูเหมือนว่าจะมีปัญหาด้านความปลอดภัยในการเข้าถึงระบบไฟล์ แต่ฉันไม่สามารถเข้าใจได้ว่ามันให้อะไร (หรือทำไม) ปัญหานั้น:

ฉันแค่ทำแตกต่างจากตัวอย่างเล็กน้อย:

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

ข้อผิดพลาดที่ฉันได้รับเมื่อเรียกใช้เมธอด 'เวอร์ชัน':

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)

ฉันกำลังใช้เวอร์ชันเหล่านี้: Plugin Pipeline 2.1 Jenkins 2.2


ผมมีข้อผิดพลาดเกี่ยวกับการที่คล้ายกันScripts not permitted to use methodแต่มันเกิดขึ้นเพราะผมเขียนแทนscm 'checkout' checkou scmในกรณีที่มีคนตกลงไปให้ระวังไวยากรณ์ที่ไม่ดี :) การทำตามที่ Maarten Kieft กล่าวทำให้ฉันเห็นข้อความแสดงข้อผิดพลาดที่ชัดเจนยิ่งขึ้นเกี่ยวกับคำสั่งที่ไม่ดี :)
GabLeRoux

คำตอบ:


262

Quickfix

ฉันมีปัญหาที่คล้ายกันและฉันแก้ไขได้โดยทำดังต่อไปนี้

  1. ไปที่เจนกินส์> จัดการเจนกินส์> การอนุมัติสคริปต์ในกระบวนการ
  2. มีคำสั่งรอดำเนินการซึ่งฉันต้องอนุมัติ

อยู่ในลิงก์การอนุมัติกระบวนการใน Jenkins 2.61 ทางเลือกที่ 1: ปิดการใช้งานแซนด์บ็อกซ์

ตามที่บทความนี้อธิบายในเชิงลึกสคริปต์ groovy จะทำงานในโหมดแซนด์บ็อกซ์ตามค่าเริ่มต้น ซึ่งหมายความว่าส่วนย่อยของวิธีการ groovy ได้รับอนุญาตให้ทำงานโดยไม่ได้รับการอนุมัติจากผู้ดูแลระบบ นอกจากนี้ยังสามารถเรียกใช้สคริปต์ที่ไม่ได้อยู่ในโหมดแซนด์บ็อกซ์ซึ่งหมายความว่าสคริปต์ทั้งหมดต้องได้รับการอนุมัติจากผู้ดูแลระบบพร้อมกัน ซึ่งทำให้ผู้ใช้ไม่สามารถอนุมัติแต่ละบรรทัดได้ในขณะนั้น

การเรียกใช้สคริปต์โดยไม่ใช้แซนด์บ็อกซ์สามารถทำได้โดยการยกเลิกการเลือกช่องทำเครื่องหมายนี้ในการกำหนดค่าโครงการของคุณด้านล่างสคริปต์ของคุณ: ใส่คำอธิบายภาพที่นี่

ทางเลือกที่ 2: ปิดใช้งานความปลอดภัยของสคริปต์

ตามที่บทความนี้อธิบายไว้คุณสามารถปิดใช้งานการรักษาความปลอดภัยสคริปต์ได้ ขั้นแรกให้ติดตั้งปลั๊กอินความปลอดภัยสคริปต์ที่อนุญาตและหลังจากนั้นเปลี่ยนไฟล์ jenkins.xml ของคุณเพิ่มอาร์กิวเมนต์นี้:

-Dpermissive-script-security.enabled = true

ดังนั้นคุณ jenkins.xml จะมีลักษณะดังนี้:

<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>

ให้แน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรหากคุณใช้สิ่งนี้!


1
หากการอนุมัติสคริปต์ทั้งหมดจะดีกว่าขึ้นอยู่กับโครงสร้างของทีม สำหรับนักพัฒนาเพียงไม่กี่รายที่สามารถเข้าถึงได้เต็มรูปแบบมันค่อนข้างดี แต่การตั้งค่าที่มีหลายทีมจะบังคับให้ผู้ดูแลระบบต้องอนุมัติทุกการเปลี่ยนแปลงในสคริปต์ไปป์ไลน์ทั้งหมด
Roger Lehmann

2
ทางเลือกที่ 3 (จริงๆควรจะแนะนำแรก) คือการเปลี่ยนรหัส unwhitelisted ปัญหา ในกรณีนี้การใช้งานที่เรียบง่ายของ@NonCPSสำหรับMatcherการใช้งานจะพอเพียง ในกรณีนี้ไม่จำเป็นต้องปิดใช้งานการรักษาความปลอดภัยสำหรับไปป์ไลน์ทั้งหมดและโดยเฉพาะการติดตั้ง Jenkins ทั้งหมด ประเมินการโทรที่ถูกบล็อกแต่ละครั้งและตัดสินใจว่าคุณจำเป็นต้องอนุมัติจริงๆหรือไม่
mkobit

1
@mkobit ไม่ได้ผลสำหรับฉัน @NonCPSไม่ช่วย
warvariuc

@warvariuc อืมอาจเป็นได้ถ้าคุณกลับมาMatcherเองเพราะMatcherไม่ได้ใช้Serializableอินเทอร์เฟซ อาจจะคุ้มค่าที่จะถามคำถามใหม่ ฉันหวังว่าเอกสารที่อ้างถึงในคำถามเดิมจะได้รับการดูแลและไม่ผิดที่จะเริ่มต้นด้วย
mkobit

2
@mkobit ผมตกแต่งด้วยฟังก์ชั่นที่ใช้NonCPS currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()NonCPS ไม่ช่วยเรื่องความปลอดภัยเลยจากที่ฉันอ่าน
warvariuc

12

คุณต้องปิดใช้งาน Sandbox สำหรับ Groovy ในการกำหนดค่างานของคุณ

ขณะนี้ยังไม่สามารถทำได้สำหรับโครงการหลายสาขาที่สคริปต์ groovy มาจาก scm ดูข้อมูลเพิ่มเติมได้ที่https://issues.jenkins-ci.org/browse/JENKINS-28178


6

ฉันพบสิ่งนี้เมื่อฉันลดจำนวนพารามิเตอร์อินพุตผู้ใช้ใน userInput จาก 3 เป็น 1 สิ่งนี้เปลี่ยนประเภทเอาต์พุตตัวแปรของ userInput จากอาร์เรย์เป็นแบบดั้งเดิม

ตัวอย่าง:

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

ถึง:

myvar = userInput

นี่คือวิธีแก้ไขสำหรับอาการที่ฉันพบ org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Objectเกิดข้อผิดพลาดคือ วิธีนี้คาดหวัง 2 พารามิเตอร์และได้รับ 3
Tyler W

4

เพื่อหลีกเลี่ยงการแซนด์บ็อกซ์ของ SCM สคริปต์ Groovy ที่เก็บไว้ฉันขอแนะนำให้เรียกใช้สคริปต์เป็นGroovy Command (แทนไฟล์ 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)

ในกรณีนี้สคริปต์ groovy จะถูกถ่ายโอนจากพื้นที่ทำงานไปยัง Jenkins Master ซึ่งสามารถเรียกใช้เป็นไฟล์system Groovy Script. sandboxing ถูกระงับตราบใดที่ใช้ Groovy Sandboxไม่ได้ตรวจสอบ


5
สิ่งนี้ดูเหมือนเป็นเรื่องยุ่งเสี่ยงและผูกพันที่จะกลับมากัดคุณ
Simon Forsberg

4
ความปลอดภัยเป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งเมื่อปกป้องข้อมูลที่ละเอียดอ่อนของผู้ใช้ แต่ยังมาพร้อมกับราคาเช่นความซับซ้อนในระหว่างกระบวนการพัฒนา เมื่อเครื่องมือรักษาความปลอดภัยถูกนำไปใช้เพียงครึ่งเดียวมันจะแย่ลงไปอีก แซนด์บ็อกซ์สคริปต์ Jenkins เป็นตัวอย่างที่ดีของเครื่องมือรักษาความปลอดภัยที่ใช้งานได้ครึ่งหนึ่งและด้วยเหตุนี้คุณอาจต้องปิดการใช้งานคุณลักษณะนี้อย่างสมบูรณ์เพราะไม่เช่นนั้นหมายความว่าคุณจะไม่ไป
Stepan Vavra

3
ในกรณีของฉันหลังจากอัปเกรดจากเจนกินส์รุ่นเก่าสคริปต์ Groovy ของฉันก็หยุดทำงานและวิธีเดียวที่จะทำให้มันใช้งานได้คือการเรียกใช้สคริปต์ 300 ครั้ง (เป็นเพียงค่าประมาณ) และสำหรับการรันแต่ละครั้งให้คลิกใน UI ของเจนกินส์เพื่ออนุญาต วิธีการโทรทั้งหมดในสคริปต์ 200 บรรทัด นอกจากนี้ UI ไม่อนุญาตให้คุณวางรายการทั้งหมดของการเรียกวิธีการที่อนุญาตทั้งหมดในกรณีที่คุณสามารถสร้างได้ นอกจากนี้ UI หยุดแสดงการเรียกใช้เมธอดบางส่วนและหลังจากนั้นไม่นานฉันก็ไม่สามารถดำเนินการต่อได้
Stepan Vavra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.