Używam Jenkinsa 2 do kompilowania projektów Java, chcę przeczytać wersję z pom.xml, postępowałem zgodnie z tym przykładem:
https://github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Przykład sugeruje:
Wygląda na to, że występuje problem z bezpieczeństwem dostępu do systemu plików, ale nie mogę dowiedzieć się, co powoduje (lub dlaczego) ten problem:
Robię trochę inaczej niż na przykładzie:
def version() {
String path = pwd();
def matcher = readFile("${path}/pom.xml") =~ '<version>(.+)</version>'
return matcher ? matcher[0][1] : null
}
Błąd, który otrzymuję podczas uruchamiania metody „wersja”:
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)
Używam tych wersji: Plugin Pipeline 2.1 Jenkins 2.2
maven
jenkins
continuous-integration
jenkins-pipeline
Daniel Hernández
źródło
źródło
Scripts not permitted to use method
, ale stało się to dlatego, żescm 'checkout'
zamiast napisałemcheckou scm
. Na wypadek gdyby ktoś na to wpadł, uważaj na złą składnię :). Postępowanie tak, jak powiedział Maarten Kieft, pozwoliło mi zobaczyć wyraźniejszy komunikat o błędzie dotyczący złego polecenia :)Odpowiedzi:
Szybka naprawa
Miałem podobny problem i rozwiązałem go, wykonując następujące czynności
Alternatywa 1: Wyłącz piaskownicę
Jak szczegółowo wyjaśniono w tym artykule , świetne skrypty są domyślnie uruchamiane w trybie piaskownicy. Oznacza to, że podzbiór groovy metod może działać bez zgody administratora. Możliwe jest również uruchamianie skryptów poza trybem piaskownicy, co oznacza, że cały skrypt musi zostać od razu zatwierdzony przez administratora. Uniemożliwia to użytkownikom zatwierdzanie każdej linii w tym czasie.
Uruchamianie skryptów bez piaskownicy można wykonać, odznaczając to pole wyboru w konfiguracji projektu tuż pod skryptem:
Alternatywa 2: Wyłącz zabezpieczenia skryptów
Jak wyjaśniono w tym artykule , możliwe jest również całkowite wyłączenie zabezpieczeń skryptów. Najpierw zainstaluj wtyczkę bezpieczeństwa skryptów permissive, a następnie zmień plik jenkins.xml, dodaj następujący argument:
Więc plik jenkins.xml będzie wyglądał mniej więcej tak:
Upewnij się, że wiesz, co robisz, jeśli to wdrożysz!
źródło
@NonCPS
doMatcher
użycia. W tym przypadku nie ma potrzeby wyłączania zabezpieczeń dla całego rurociągu, a zwłaszcza całej instalacji Jenkins. Oceń każde zablokowane połączenie indywidualnie i zdecyduj, czy naprawdę musisz je zatwierdzić.@NonCPS
nie pomaga.Matcher
się, ponieważMatcher
nie implementujeSerializable
interfejsu. Warto zadać nowe pytanie. Chciałbym, aby dokumentacja, o której mowa w pierwotnym pytaniu, została zachowana i nie była błędna.NonCPS
funkcją, która używacurrentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
. NonCPS w ogóle nie pomaga w kwestiach bezpieczeństwa, z tego co przeczytałem.Musisz wyłączyć piaskownicę dla Groovy w konfiguracji zadania.
Obecnie nie jest to możliwe w przypadku projektów wielobranżowych, w których groovy skrypt pochodzi ze scm. Więcej informacji można znaleźć pod adresem https://issues.jenkins-ci.org/browse/JENKINS-28178
źródło
Wpadłem na to, gdy zmniejszyłem liczbę parametrów wejściowych użytkownika w userInput z 3 do 1. To zmieniło typ wyjścia zmiennej userInput z tablicy na prymityw.
Przykład:
do:
źródło
org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object
. Metoda oczekiwała 2 parametrów i otrzymywała 3.Aby ominąć piaskownicę przechowywanych w SCM skryptów Groovy, polecam uruchomienie skryptu jako Groovy Command (zamiast pliku Groovy Script ):
w takim przypadku groovy skrypt jest przenoszony z obszaru roboczego do Jenkins Master, gdzie można go wykonać jako plik
system Groovy Script
. Piaskownica jest pomijana, o ile opcja Użyj Groovy Sandbox nie jest zaznaczona .źródło