Jenkins CI Pipeline Scriptlerinin groovy.lang.GroovyObject yöntemini kullanmasına izin verilmez


105

Java Projelerini derlemek için Jenkins 2 kullanıyorum, sürümü bir pom.xml'den okumak istiyorum, şu örneği takip ediyordum:

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

Örnek şunları önermektedir:

Sorunlu işlevi daire içine alınmış tam Jenkins Pipeline

Görünüşe göre Dosya Sistemine erişimde bazı güvenlik sorunları var, ancak sorunun ne (veya neden) olduğunu çözemiyorum:

Örnekten biraz farklı yapıyorum:

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

'Sürüm' yöntemini çalıştırırken aldığım Hata:

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 sürümleri kullanıyorum: Plugin Pipeline 2.1 Jenkins 2.2


Hakkında benzer bir hata aldım Scripts not permitted to use method, ama bu, scm 'checkout'yerine yazdığım için oldu checkou scm. Birinin buna düşmesi durumunda, kötü sözdizimine dikkat edin :). Maarten Kieft'in söylediği gibi yapmak, kötü komutla ilgili daha net bir hata mesajı
görmemi sağladı

Yanıtlar:


263

Hızlı düzeltme

Benzer bir sorun yaşadım ve aşağıdakileri yaparak çözdüm

  1. Jenkins> jenkins'i yönet> İşlem İçi Komut Dosyası Onayı'na gidin
  2. Onaylamam gereken bekleyen bir komut vardı.

Jenkins 2.61'de süreç onay bağlantısı Alternatif 1: Korumalı alanı devre dışı bırakın

Bu makalede ayrıntılı olarak açıklandığı gibi, harika komut dosyaları varsayılan olarak korumalı alan modunda çalıştırılır. Bu, harika yöntemlerin bir alt kümesinin yönetici onayı olmadan çalışmasına izin verildiği anlamına gelir. Sandbox modunda olmayan komut dosyalarını çalıştırmak da mümkündür, bu da tüm komut dosyasının bir defada bir yönetici tarafından onaylanması gerektiği anlamına gelir. Bu, kullanıcıların o anda her satırı onaylamasını engeller.

Komut dosyalarını korumalı alan olmadan çalıştırmak, komut dosyanızın hemen altındaki proje yapılandırmanızdaki bu onay kutusunun işaretini kaldırarak yapılabilir: görüntü açıklamasını buraya girin

Alternatif 2: Komut dosyası güvenliğini devre dışı bırakın

Bu makalede açıklandığı gibi komut dosyası güvenliğini tamamen devre dışı bırakmak da mümkündür. Önce izin verilen komut dosyası güvenlik eklentisini kurun ve bundan sonra jenkins.xml dosyanızı değiştirdikten sonra şu argümanı ekleyin:

-Dpermissive-script-security.enabled = true

Yani siz jenkins.xml şunun gibi görünecek:

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

Bunu uygularsanız ne yaptığınızı bildiğinizden emin olun!


1
Tüm senaryoyu onaylamak daha iyiyse, ekip yapısına bağlıdır. Tam erişime sahip birkaç geliştirici için oldukça güzel. Ancak birden fazla ekiple yapılan bir kurulum, yöneticileri tüm ardışık düzen komut dosyalarındaki her değişikliği onaylamaya zorlar.
Roger Lehmann

3
Alternatif 3 (gerçekten ilk öneri olmalı) sorunlu beyaz listeye alınmamış kodu değiştirmektir . Bu durumda kullanımı @NonCPSiçin basit bir kullanım Matcheryeterli olacaktır. Bu durumda tüm boru hattı ve özellikle tüm Jenkins kurulumu için güvenliği devre dışı bırakmaya gerek yoktur. Engellenen her aramayı ayrı ayrı değerlendirin ve gerçekten onaylamanız gerekip gerekmediğine karar verin.
mkobit

1
@mkobit benim için çalışmıyor. @NonCPSyardımcı olmuyor.
warvariuc

@warvariuc hmm, Matcherkendini döndürüyorsanız olabilir , çünkü arabirimi Matcheruygulamıyor Serializable. Yeni bir soru sormaya değer olabilir. Orijinal soruda atıfta bulunulan belgelerin korunmasını ve başlangıçta yanlış olmamasını diliyorum.
mkobit

2
@mkobit Kullanan NonCPS bir fonksiyonla süsledim currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId(). NonCPS, okuduğum kadarıyla güvenlik sorunlarına hiç yardımcı olmuyor.
warvariuc


6

UserInput'taki kullanıcı-girdi parametrelerinin sayısını 3'ten 1'e düşürdüğümde bununla karşılaştım. Bu, userInput'un değişken çıktı türünü bir diziden bir ilkele değiştirdi.

Misal:

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

to:

myvar = userInput

Bu, yaşadığım semptom için tam olarak düzeltme. Hata mesajı idi org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use method groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object. Yöntem 2 parametre bekliyordu ve 3 alıyordu.
Tyler W

4

SCM'de depolanan Groovy komut dosyalarının korumalı alanlarını aşmak için, komut dosyasını Groovy Komut olarak çalıştırmanızı öneririm ( Groovy Komut Dosyası dosyası yerine ):

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)

böyle bir durumda, harika komut dosyası çalışma alanından bir system Groovy Script. Test ortamı uzun olduğunca bastırılır Kullanım Groovy Sandbox değil kontrol .


5
Bu hantal, riskli ve geri gelip sizi ısırmaya mahkum görünüyor.
Simon Forsberg

4
Eh, güvenlik özellikle kullanıcıya duyarlı verileri koruduğunda önemlidir, ancak aynı zamanda geliştirme sürecinde bir komplikasyon gibi bir bedel ile birlikte gelir. Güvenlik araçları sadece yarısı uygulandığında daha da kötüleşir. Jenkins komut dosyası korumalı alanı, yarı uygulanan güvenlik araçlarının güzel bir örneğidir ve sonuç olarak özelliği tamamen devre dışı bırakmanız gerekebilir, çünkü aksi takdirde sizin için hiçbir şey olmaz.
Stepan Vavra

3
Benim durumumda, eski bir Jenkins'ten yükseltme yaptıktan sonra, Groovy betiğim çalışmayı durdurdu ve çalışmasını sağlamanın tek yolu betiği 300 kez çalıştırmak (sadece bir tahmin) ve her çalıştırmada Jenkins kullanıcı arayüzüne tıklamaktır. tüm yöntem 200 satırlık bir komut dosyasında çağırır. Dahası, kullanıcı arayüzü, bir şekilde bunları oluşturabildiğiniz durumda, izin verilen tüm yöntem çağrılarının tam listesini yapıştırmanıza izin vermez. Ek olarak, kullanıcı arayüzü bazı yöntem çağrılarını göstermeyi durdurdu ve bir süre sonra devam edemedim.
Stepan Vavra
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.