Qual è l'effetto di @NonCPS in uno script di pipeline di Jenkins


110

Ho una sceneggiatura per la pipeline in Jenkins.

Ho usato per ottenere questa eccezione:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: agli script non è consentito utilizzare il metodo groovy.json.JsonSlurperClassic parseText java.lang.String

Ho cercato l'eccezione e ho trovato alcune indicazioni che dovevo annotare il metodo in cui si verifica l'eccezione @NonCPS. L'ho fatto, senza capire veramente cosa fa.

Dopo di ciò, tuttavia, un'eccezione che stavo introducendo in quel metodo non è più stata catturata da una tryclausola.

Allora qual è l'idea dietro @NonCPS? Quali sono gli effetti del suo utilizzo?


1
Il blog ufficiale di jenkins ha un articolo che introduce questa annotazione e potrebbe aiutarti. jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice
袁文涛

Risposte:


142

L'eccezione che stai vedendo è dovuta alla sicurezza degli script e al sandboxing. Fondamentalmente, per impostazione predefinita, quando si esegue uno script della pipeline, viene eseguito in una sandbox che consente solo l'utilizzo di determinati metodi e classi. Ci sono modi per autorizzare le operazioni, controlla il link sopra.

L' @NonCPSannotazione è utile quando si hanno metodi che utilizzano oggetti che non sono serializzabili. Normalmente, tutti gli oggetti che crei nello script della pipeline devono essere serializzabili (il motivo è che Jenkins deve essere in grado di serializzare lo stato dello script in modo che possa essere messo in pausa e archiviato su disco).

Quando metti @NonCPSun metodo, Jenkins eseguirà l'intero metodo in una volta sola senza la possibilità di mettere in pausa. Inoltre, non è consentito fare riferimento a passaggi della pipeline o metodi trasformati CPS dall'interno di un @NonCPSmetodo annotato. Maggiori informazioni su questo possono essere trovate qui .

Per quanto riguarda la gestione delle eccezioni: non sono sicuro al 100% di ciò che stai vivendo; Ho provato quanto segue e funziona come previsto:

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

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

e

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

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

mySecondFunction();

e infine:

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

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

mySecondFunction();

Tutti stampano "Catturato" come previsto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.