Переключатель в конвейере Jenkins возвращает ноль, такой же переключатель в обычном Groovy возвращает ожидаемый результат - PullRequest
1 голос
/ 28 апреля 2020

В моем коде есть switch (контекст: конвейерная библиотека Jenkins):

def installOptions(filePath) {
    switch (filePath) {
        case ~/.*\.pom/:
            "-Dpackaging=pom -DpomFile=$filePath"
            break
        case ~/.*\.jar/:
            '-Dpackaging=jar'
            break
        case ~/.*-exe-archive.zip/:
            filePath = filePath.replace '-exe-archive.zip', '.pom'
            "-Dpackaging=zip -DpomFile=$filePath"
            break
        default:
            ''
            break
    }
}

Значение filePath: 'temp_downloads/merge/QA-9344/itextcore/java/main.pom'

Ожидаемое значение:

-Dpackaging=pom -DpomFile=temp_downloads/merge/QA-9344/itextcore/java/main.pom

Фактическое значение:

null

Когда я использую точно такой же switch в «нормальном» Groovy, я получаю ожидаемый результат:

import org.codehaus.groovy.runtime.InvokerHelper

class InstallJavaBranchArtifacts extends Script {

    static void main(String[] args) {
        InvokerHelper.runScript(InstallJavaBranchArtifacts, args)
    }

    def run() {
        println installOptions('temp_downloads/merge/QA-9344/itextcore/java/main.pom')
        println installOptions('temp_downloads/merge/QA-9344/itextcore/java/barcodes.pom')
        println installOptions('temp_downloads/merge/QA-9344/itextcore/java/itext7-barcodes-7.1.12-SNAPSHOT.jar')
    }

    def installOptions(filePath) {
        switch (filePath) {
            case ~/.*\.pom/:
                "-Dpackaging=pom -DpomFile=$filePath"
                break
            case ~/.*\.jar/:
                '-Dpackaging=jar'
                break
            case ~/.*-exe-archive.zip/:
                filePath = filePath.replace '-exe-archive.zip', '.pom'
                "-Dpackaging=zip -DpomFile=$filePath"
                break
            default:
                ''
                break
        }
    }
}

тогда это мой вывод:

/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java ...
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass (file:/usr/share/java/groovy-2.4.17.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
-Dpackaging=pom -DpomFile=temp_downloads/merge/QA-9344/itextcore/java/main.pom
-Dpackaging=pom -DpomFile=temp_downloads/merge/QA-9344/itextcore/java/barcodes.pom
-Dpackaging=jar

Process finished with exit code 0

Что является (кроме нелегального отражения доступа mumbo jumbo) ожидаемым выводом.

Итак, что мне нужно сделать, чтобы * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

1 Ответ

2 голосов
/ 28 апреля 2020

Конвейер Jenkins запускает ваш код Groovy с использованием интерпретатора Groovy CPS, который разбивает ваш код на части и оценивает их в стиле непрерывной передачи. В вашем примере ваш оператор switch пропускает явное return, и поэтому при оценке тела вашей функции возвращается null.

. Есть два варианта исправить это.

  1. Вы можете добавить аннотацию @NonCPS к реализации installOptions, и таким образом вы будете запускать тело этой функции, используя обычный интерпретатор оболочки Groovy. Это может работать для вас, потому что в теле этой функции вы не вызываете какие-либо шаги рабочего процесса Jenkins Pipeline, а только просто код Groovy.

       @NonCPS
       def installOptions(filePath) {
            switch (filePath) {
                case ~/.*\.pom/:
                    "-Dpackaging=pom -DpomFile=$filePath"
                    break
                case ~/.*\.jar/:
                    '-Dpackaging=jar'
                    break
                case ~/.*-exe-archive.zip/:
                    filePath = filePath.replace '-exe-archive.zip', '.pom'
                    "-Dpackaging=zip -DpomFile=$filePath"
                    break
                default:
                    ''
                    break
            }
        }
    
  2. Если вы хотите сохраните выполнение этого кода в режиме Groovy CPS, уберите break из каждого регистра и добавьте явный return перед каждой строкой, которую вы возвращаете из регистра переключателя.

       def installOptions(filePath) {
            switch (filePath) {
                case ~/.*\.pom/:
                    return "-Dpackaging=pom -DpomFile=$filePath"                        
                case ~/.*\.jar/:
                    return '-Dpackaging=jar'
                case ~/.*-exe-archive.zip/:
                    filePath = filePath.replace '-exe-archive.zip', '.pom'
                    return "-Dpackaging=zip -DpomFile=$filePath"
                default:
                    return ''
            }
        }
    

Если вы хотите узнать больше о Groovy CPS, go и проверить документы здесь - https://github.com/cloudbees/groovy-cps.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...