@NonCPS'nin Jenkins işlem hattı komut dosyasındaki etkisi nedir


110

Jenkins'te bir ardışık düzen komut dosyam var.

Eskiden bu istisnayı alırdım:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Komut dosyalarının groovy.json.JsonSlurperClassic parseText java.lang.String yöntemini kullanmasına izin verilmez

İstisnayı araştırdım ve istisnanın meydana geldiği yöntemi açıklamam gerektiğine dair bazı göstergeler buldum @NonCPS. Bunu gerçekten anlamadan yaptım.

Ancak bundan sonra, o yönteme attığım bir İstisna artık bir trycümle tarafından yakalanmadı .

Peki arkasındaki fikir @NonCPSnedir? Kullanmanın etkileri nelerdir?


1
Jenkins resmi blogunda bu açıklamayı tanıtan ve size yardımcı olabilecek bir makale var. jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
袁文涛

Yanıtlar:


142

Gördüğünüz istisna, komut dosyası güvenliği ve korumalı alandan kaynaklanıyor. Temel olarak, varsayılan olarak, bir ardışık düzen komut dosyası ç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 almanın yolları vardır, yukarıdaki bağlantıyı kontrol edin.

@NonCPSEğer seri hale getirilebilir olmayan nesneleri kullanmak yöntemler varken açıklama yararlıdır. Normalde, ardışık düzen betiğinizde oluşturduğunuz tüm nesneler serileştirilebilir olmalıdır (bunun nedeni, Jenkins'in betiğin durumunu duraklatıp diskte depolanabilmesi için serileştirebilmesi gerektiğidir).

Bir @NonCPSyöntem koyduğunuzda , Jenkins tüm yöntemi tek seferde duraklatma yeteneği olmadan çalıştıracaktır. Ayrıca, @NonCPSaçıklamalı bir yöntem içinden herhangi bir ardışık düzen adımına veya CPS dönüştürülmüş yönteme başvurmanıza izin verilmez . Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz .

İstisna işleme konusuna gelince: Ne yaşadığınızdan% 100 emin değilim; Aşağıdakileri denedim ve beklendiği gibi çalışıyor:

@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 sonunda:

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

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

mySecondFunction();

Hepsi beklendiği gibi "Yakalandı" yazdırın.

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.