जेनकिंस CI पाइपलाइन लिपियों ने विधि groovy.lang.GroovyObject का उपयोग करने की अनुमति नहीं दी है


105

मैं जावा प्रोजेक्ट्स को संकलित करने के लिए जेनकिंस 2 का उपयोग कर रहा हूं, मैं एक pom.xml से संस्करण को पढ़ना चाहता हूं, मैं इस उदाहरण को देख रहा था:

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

उदाहरण का सुझाव है:

समस्याग्रस्त कार्य के साथ पूर्ण जेनकिंस पाइपलाइन

ऐसा लगता है कि फ़ाइल सिस्टम तक पहुँचने में कुछ सुरक्षा समस्या है, लेकिन मैं यह पता नहीं लगा सकता कि वह क्या दे रहा है (या क्यों) उस समस्या:

मैं उदाहरण से थोड़ा अलग कर रहा हूं:

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)

मैं इन संस्करणों का उपयोग कर रहा हूं: प्लगइन पाइपलाइन 2.1 जेनकींस 2.2


मुझे इसके बारे में एक समान त्रुटि थी Scripts not permitted to use method, लेकिन ऐसा हुआ क्योंकि मैंने scm 'checkout'इसके बजाय लिखा था checkou scm। बस अगर कोई इस पर पड़ता है, तो खराब सिंटैक्स देखें :)। Maarten Kieft ने कहा कि मुझे बुरी कमांड के बारे में अधिक स्पष्ट त्रुटि संदेश देखने की अनुमति है :)
GabLeRoux

जवाबों:


262

जल्दी ठीक

मेरे पास ऐसा ही मुद्दा था और मैंने इसे निम्नलिखित करने का संकल्प लिया

  1. जेनकींस पर नेविगेट करें> जेनकिंस प्रबंधित करें> इन-प्रोसेस स्क्रिप्ट अनुमोदन
  2. एक लंबित आदेश था, जिसे मुझे मंजूर करना था।

जेनकिंस 2.61 में प्रक्रिया अनुमोदन लिंक वैकल्पिक 1: सैंडबॉक्स को अक्षम करें

जैसा कि यह लेख गहराई से बताता है, ग्रूवी लिपियों को डिफ़ॉल्ट रूप से सैंडबॉक्स मोड में चलाया जाता है। इसका मतलब यह है कि ग्रूवी विधियों के एक सबसेट को प्रशासक की मंजूरी के बिना चलाने की अनुमति है। सैंडबॉक्स मोड में नहीं स्क्रिप्ट को चलाना भी संभव है, जिसका अर्थ है कि पूरी स्क्रिप्ट को एक बार में प्रशासक द्वारा अनुमोदित करने की आवश्यकता है। यह उपयोगकर्ताओं को उस समय प्रत्येक पंक्ति को अनुमोदित करने से रोकता है।

सैंडबॉक्स के बिना स्क्रिप्ट चलाना आपके प्रोजेक्ट स्क्रिप्ट में इस चेकबॉक्स को अनचेक करके आपकी स्क्रिप्ट के ठीक नीचे किया जा सकता है: यहां छवि विवरण दर्ज करें

वैकल्पिक 2: स्क्रिप्ट सुरक्षा अक्षम करें

इस लेख के रूप में बताता है कि स्क्रिप्ट सुरक्षा को पूरी तरह से अक्षम करना भी संभव है। सबसे पहले अनुमेय स्क्रिप्ट सुरक्षा प्लगइन स्थापित करें और उसके बाद अपने jenkins.xml फ़ाइल को बदलें इस तर्क को जोड़ें:

-Dpermissive-पटकथा 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
यदि पूरी स्क्रिप्ट को मंजूरी देना बेहतर है, तो टीम संरचना पर निर्भर करता है। पूर्ण पहुंच वाले कुछ डेवलपर्स के लिए यह काफी अच्छा है। लेकिन कई टीमों के साथ एक सेटअप सभी पाइपलाइन लिपियों में हर बदलाव को स्वीकार करने के लिए प्रवेश को मजबूर करेगा।
रोजर लेहमैन

2
वैकल्पिक 3 (वास्तव में पहला सुझाव होना चाहिए) समस्याग्रस्त अप्रकाशित कोड को बदलना है । इस मामले में, उपयोग के @NonCPSलिए एक सरल उपयोग Matcherपर्याप्त होगा। पूरी पाइपलाइन और विशेष रूप से पूरे जेनकींस की स्थापना के लिए सुरक्षा को अक्षम करने के लिए इस मामले में कोई आवश्यकता नहीं है। प्रत्येक अवरुद्ध कॉल का व्यक्तिगत रूप से मूल्यांकन करें और तय करें कि क्या आपको वास्तव में उन्हें अनुमोदित करने की आवश्यकता है।
mkobit

1
@mkobit मेरे लिए काम नहीं करता है। @NonCPSमदद नहीं करता है।
वार्वारियुक

@warvariuc हम्म, यह हो सकता है यदि आप Matcherस्वयं ही लौट रहे हों , क्योंकि इंटरफ़ेस Matcherलागू नहीं करता Serializableहै। यह एक नया प्रश्न पूछने के लायक हो सकता है। मैं चाहता हूं कि मूल प्रश्न में संदर्भित दस्तावेज़ीकरण को बनाए रखा गया था और इसके साथ शुरू करने के लिए गलत नहीं था।
mkobit

2
@mkobit मैंने NonCPS एक फ़ंक्शन के साथ सजाया जो उपयोग करता है currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()। NonCPS मैं जो भी पढ़ता हूं, उससे सुरक्षा के मुद्दों में मदद नहीं करता है।
वार्वारियुक

12

आपको अपने नौकरी विन्यास में ग्रूवी के लिए सैंडबॉक्स को अक्षम करना होगा।

वर्तमान में यह मल्टीब्रांच परियोजनाओं के लिए संभव नहीं है जहां ग्रूवी स्क्रिप्ट स्कैम से आती है। अधिक जानकारी के लिए https://issues.jenkins-ci.org/browse/JENKINS-28178 देखें


6

जब मैंने userInput में user-input पैरामीटर्स की संख्या 3 से घटाकर कम कर दी तो मैंने इसे 3 से घटा दिया। इसने एक सरणी से प्राइमरी में वेरिएबल आउटपुट टाइप को बदल दिया।

उदाहरण:

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 मापदंडों की उम्मीद थी और
टायलर डब्ल्यू

4

SCM संग्रहीत ग्रूवी स्क्रिप्ट के सैंडबॉक्सिंग के आसपास जाने के लिए, मैं स्क्रिप्ट को ग्रूवी कमांड ( ग्रूवी स्क्रिप्ट फ़ाइल के बजाय ) के रूप में चलाने की सलाह देता हूं :

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)

ऐसे मामले में, ग्रूवी स्क्रिप्ट को कार्यक्षेत्र से जेनकिंस मास्टर में स्थानांतरित किया जाता है जहां इसे ए के रूप में निष्पादित किया जा सकता है system Groovy Script। सैंडबॉक्सिंग तब तक दबा रहता है जब तक कि यूज़ ग्रूवी सैंडबॉक्स चेक नहीं किया जाता है


5
यह स्पष्ट, जोखिम भरा और वापस आने और आपको काटने के लिए बाध्य लगता है।
साइमन फोर्सबर्ग

4
ठीक है, सुरक्षा विशेष रूप से महत्वपूर्ण है जब यह उपयोगकर्ता के संवेदनशील डेटा की सुरक्षा करता है, लेकिन यह मूल्य के साथ भी आता है जैसे कि विकास प्रक्रिया के दौरान एक जटिलता। जब सुरक्षा टूलींग सिर्फ आधा कार्यान्वित की जाती है तो यह और भी खराब हो जाती है। जेनकिंस स्क्रिप्ट सैंडबॉक्सिंग आधे कार्यान्वित सुरक्षा टूलिंग का एक अच्छा उदाहरण है और परिणामस्वरूप आपको पूरी तरह से सुविधा को अक्षम करने की आवश्यकता हो सकती है क्योंकि अन्यथा इसका मतलब है कि आपके लिए कोई रास्ता नहीं है।
Stepan Vavra

3
मेरे मामले में, पुराने जेनकींस से अपग्रेड होने के बाद, मेरी ग्रूवी स्क्रिप्ट ने काम करना बंद कर दिया और इसे बनाने का एकमात्र तरीका स्क्रिप्ट को 300 बार (सिर्फ एक अनुमान) चलाना होगा और प्रत्येक रन के लिए जेनकिंस यूआई में क्लिक करने की अनुमति होगी सभी विधि 200 लाइनों की स्क्रिप्ट में कॉल करती है। इसके अलावा यूआई आपको उन सभी अनुमत विधि कॉलों की पूरी सूची को पेस्ट करने की अनुमति नहीं देता है जब आप किसी तरह उन्हें उत्पन्न करने में सक्षम थे। इसके अतिरिक्त, UI ने कुछ विधि कॉलों को दिखाना बंद कर दिया और कुछ समय बाद मैं आगे नहीं बढ़ पाया।
Stepan Vavra
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.