Unapproable RejectedAccessException при использовании Tuple в Jenkinsfile - PullRequest
1 голос
/ 17 марта 2019

Я пытался использовать Tuple в Jenkinsfile.

Строка, которую я написал: def tupleTest = new Tuple('test', 'test2').

Однако Jenkins не принял эту строку и продолжает выводить следующую ошибку в вывод консоли:

Такой конструктор не найден: new groovy.lang.Tuple java.lang.String java.lang.String. Администраторы могут решить, утвердить или отклонить эту подпись.

...

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: такой конструктор не найден: новый groovy.lang.Tuple java.lang.Integer java.lang.String

...

Когда я заходил в конфигурацию «Утверждение сценариев», я не видел ни одного сценария, ожидающего утверждения.

Следуя этой ссылке, я попытался установить и включить плагин " Permissive Security ", но он тоже не помог - ошибка была та же.

Я даже пытался вручную добавить проблемную подпись в файл scriptApproval.xml. После добавления я смог увидеть его в списке утвержденных подписей, но ошибка все равно осталась.

Я что-то не так делаю?

1 Ответ

0 голосов
/ 17 марта 2019

Это более или менее проблема, вызванная конструктором groovy.lang.Tuple + песочницей Jenkins Groovy. Если вы посмотрите на конструктор этого класса, вы увидите что-то вроде этого :

package groovy.lang;

import java.util.AbstractList;
import java.util.List;

public class Tuple extends AbstractList {
    private final Object[] contents;
    private int hashCode;

    public Tuple(Object[] contents) {
        if (contents == null) throw new NullPointerException();
        this.contents = contents;
    }

    //....
}

Режим песочницы Groovy (включен по умолчанию для всех конвейеров Jenkins) гарантирует, что каждый вызов проходит проверку утверждения сценария. Это не надежно, и когда он видит new Tuple('a','b'), он думает, что пользователь ищет конструктор, который точно соответствует двум параметрам типа String. И поскольку такого конструктора не существует, он выдает это исключение. Однако есть два простых решения этой проблемы.

Используйте groovy.lang.Tuple2 вместо

Если ваш кортеж - пара, используйте вместо него groovy.lang.Tuple2. Хорошей новостью этого класса является то, что он предоставляет конструктор , который поддерживает два универсальных типа , поэтому он будет работать в вашем случае.

Используйте точный Object[] конструктор

Кроме того, вы можете использовать точный конструктор, например,

def tuple = new Tuple(["test","test2"] as Object[])

Оба варианта требуют одобрения сценария, прежде чем их можно использовать (однако в этом случае оба конструктора появляются на странице подтверждения сценария в процессе).

...