Команда Jenkins Pipeline sh, создающая java .io.NotSerializableException: java .util.regex.Matcher - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть конвейер, который выполняет много команд sh (shell) против AWS. Все они работают без проблем, кроме этого. Первоначально я просто запускал команду sh напрямую, но в итоге завернул ее в блок try для отладки.

            def instanceip = instance_details =~ /PrivateIpAddress.*(10[0-9.]*)/
            if ((instanceip)) {
                INSTANCEIP = instanceip.group(1)
                println "INSTANCE_IP=$INSTANCEIP"
            }
            def instanceid = instance_details =~ /InstanceId.*(i-[0-9a-f]*)/
            if ((instanceid)) {
                INSTANCEID = instanceid.group(1)
                println "INSTANCE_ID=$INSTANCEID"
            }

            try {
                shellCommand = "aws ec2 terminate-instances --region ${args.awsRegion} --instance-ids $INSTANCEID"
                println "executing: ${shellCommand}"
                sh "${shellCommand}"
            } catch (NotSerializableException err) {
                println "${err}"
            }

Я подтвердил, что команда sh действительна и даже запускается, но по неизвестной причине он производит java.io.NotSerializableException: java.util.regex.Matcher. Вот соответствующие журналы из моего конвейера:

[Pipeline] echo
executing: aws ec2 terminate-instances --region us-west-2 --instance-ids i-0392802baaadca13d
[Pipeline] sh
+ aws ec2 terminate-instances --region us-west-2 --instance-ids i-0392802baaadca13d
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-0392802baaadca13d", 
            "CurrentState": {
                "Code": 32, 
                "Name": "shutting-down"
            }, 
            "PreviousState": {
                "Code": 0, 
                "Name": "pending"
            }
        }
    ]
}
[Pipeline] echo
java.io.NotSerializableException: java.util.regex.Matcher

Так же, как и другие вызовы aws, похоже, что он возвращает очень обычный JSON документ в виде простого текста.

Я получил идентификатор экземпляра с помощью регулярного выражения, но подтвердил, что это строка, и она, очевидно, преобразуется в строку, которую я даю sh. Почему результат выполнения этой команды sh вызывает это исключение?

1 Ответ

0 голосов
/ 06 апреля 2020

проблема в строках типа

def instanceid = instance_details =~ /InstanceId.*(i-[0-9a-f]*)/

, и вы используете переменную instanceid (которая на самом деле соответствует Matcher) только в if на следующей строке.

просто поместите ваше соответствие регулярному выражению в if.

if (instance_details =~ /InstanceId.*(i-[0-9a-f]*)/){...
...