2017-02-17 54 views
30

Jenkins'de bir pipeline komut dosyası var. Bir Jenkins boru hattı komut dosyasında @ NonCPS üzerindeki etki nedir?

bu özel durum almak için kullanılır:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts yöntem groovy.json.JsonSlurperClassic parseText java.lang.String

kullanmasına izin verilmez

İstisna durumuna baktım ve @NonCPS ile ortaya çıktığı yönteme açıklama ekleyeceğim bazı belirtiler buldum. Bunu, ne yaptığını gerçekten anlamadan yaptım. Ancak, bundan sonra, bu yönteme attığım bir Özel Durum, artık bir try maddesi tarafından yakalanmadı.

@NonCPS'un ardında yatan fikir nedir? Kullanmanın etkileri nelerdir?

cevap

37

Gördüğünüz istisna script security ve kum havuzundan kaynaklanıyor. Temel olarak, varsayılan olarak, bir boru hattı komut dosyasını çalıştırdığınızda, yalnızca belirli yöntemlerin ve sınıfların kullanımına izin veren bir sanal alanda çalışır. İşlemleri beyaz listeye eklemenin yolları vardır, yukarıdaki bağlantıyı kontrol edin.

@NonCPS ek açıklaması, serileştirilemeyen nesneleri kullanan yöntemleriniz olduğunda kullanışlıdır. Normal olarak, pipeline komut dosyanızda oluşturduğunuz tüm nesnelerin serileştirilmesi gerekir (bunun nedeni, Jenkins'in komut dosyasının durumunu, disk üzerinde duraklatılıp depolanabilmesi için serileştirebilmesidir).

@NonCPS yöntemini bir yönteme yerleştirdiğinizde, Jenkins tüm yöntemi bir seferde duraklatma özelliği olmadan yürütür. Ayrıca, bir @NonCPS açıklamalı yöntem dahilinde herhangi bir boru hattı adımı veya CPS dönüştürülmüş yöntemine başvurmanıza izin verilmez. More information about this can be found here.

İstisna işlemi ile ilgili olarak: Ne yaşadığınızdan% 100 emin değilsiniz; Ben aşağıdaki denedim ve beklendiği gibi çalışır:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

try { 
    myFunction(); 
} catch (Exception e) { 
    echo "Caught"; 
} 

ve

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

ve son olarak:

@NonCPS 
def myFunction() { 
    throw new RuntimeException(); 
} 

@NonCPS 
def mySecondFunction() { 
    try { 
     myFunction(); 
    } catch (Exception e) { 
     echo "Caught"; 
    } 
} 

mySecondFunction(); 

beklendiği gibi "yakalandı" Tüm baskı.