Тот же сценарий bash, включающий grep, успешно выполняется на одной машине, но не на другой - PullRequest
1 голос
/ 18 апреля 2020

У меня есть следующий сценарий оболочки:


#!/bin/bash

# Calls AWS CloudFormation and creates the stack
STACKNAME="bootstrapStack"
TEMPLATEBODY=file://\$PWD/templates/bootstrapStack.yml
TEMPLATEVERSION=v0.1.0-alpha

if $( aws $AWSENDPOINTPARAM cloudformation describe-stacks --output text | grep -Eq "$STACKNAME" )
then 
    # output of above was similar to:
    # STACKS  2010-07-27T22:28:28Z    False   arn:aws:cloudformation:us-east-1:123456789:stack/bootstrapStack/16766dc5-75c9-4e3f-b4cf-7814d7fbbc6f      bootstrapStack  CREATE_COMPLETE
    # OUTPUTS TemplatesBucket dw-cloudformation-templates
    # PARAMETERS      TemplateVersion v0.1.0-alpha

    aws $AWSENDPOINTPARAM cloudformation update-stack \
        --template-body $TEMPLATEBODY \
        --stack-name $STACKNAME \
        --parameters "ParameterKey=TemplateVersion,ParameterValue=$TEMPLATEVERSION" \
        $*
else
    aws $AWSENDPOINTPARAM cloudformation create-stack \
        --template-body $TEMPLATEBODY \
        --stack-name $STACKNAME \
        --parameters "ParameterKey=TemplateVersion,ParameterValue=$TEMPLATEVERSION" \
        $*
fi

Я написал несколько модульных тестов для вышеуказанного сценария, используя shunit2 и moto_server. Вот сценарий теста:

#!/bin/sh

# Unit test for the deploy script of the stack

SCRIPT_UNDER_TEST=./scripts/createStack.sh
# set up
oneTimeSetUp(){
    if [[ ! -d "./test-logs" ]]
    then
        mkdir ./test-logs
    fi
}

setUp(){
    ( moto_server cloudformation >>test-logs/moto_server.log 2>&1 ) &
    export AWSENDPOINTPARAM=--endpoint="http://localhost:5000"
    sleep 5
}

match_stack_output(){
    # example match:
    # arn:aws:cloudformation:us-east-1:123456789:stack/bootstrapStack/2f255d54-f426-46b6
    assertTrue "Output Pattern does not match" \
        '$( \
            cat test_log | \
            grep -Eq \
                "^arn:aws:cloudformation:[[:alpha:]]{2}[-](east|west|south|north)-[[:digit:]]:[[:digit:]]*:stack\/bootstrapStack\/[[:alnum:]]*(-[[:alnum:]]*)*$" \
        )'
}

test_createStack(){
    . $SCRIPT_UNDER_TEST --output text >test_log

    match_stack_output
}

test_updateStack(){
    # if the stack already exists, the script should update the stack
    . $SCRIPT_UNDER_TEST --output text >test_log

    match_stack_output

    # call it again for update
    . $SCRIPT_UNDER_TEST --output text >test_log

    match_stack_output
}

# tear down
tearDown(){
    pkill moto_server
    echo Test Logs:
    cat test_log
    echo " "
    rm -rf test_log
}

. shunit2

Теперь я запускаю код на своей локальной машине, и тесты проходят без проблем.

Затем я отправляю sh его в gitlab, где Тестовый скрипт выполняется исполнителем gitlab с использованием образа python: 3.8.

Тесты на бегуне не пройдены, и кажется, что утверждение о том, что шаблоны совпадают, не удается.

Я заметил, что бегун использует grep версии 3.3-1, а у меня версия 3.4 на моя локальная машина, но разглядев в ней, особой разницы нет.

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

Понятия не имею, почему такое существует уныние.

1 Ответ

1 голос
/ 18 апреля 2020

В соответствии с предложением @Cyrus переход к shellcheck.net и внесение предложенных изменений сработали.

Решение, которое его решило, - следующий фрагмент сценария:

assertTrue "Output Pattern does not match" \
        '$( \
            cat test_log | \
            grep -Eq \
                "^arn:aws:cloudformation:[[:alpha:]]{2}[-](east|west|south|north)-[[:digit:]]:[[:digit:]]*:stack\/bootstrapStack\/[[:alnum:]]*(-[[:alnum:]]*)*$" \
        )'

Должно было быть:

assertTrue "Output Pattern does not match" \
        'grep -Eq "^arn:aws:cloudformation:[[:alpha:]]{2}[-](east|west|south|north)-[[:digit:]]:[[:digit:]]*:stack\/bootstrapStack\/[[:alnum:]]*(-[[:alnum:]]*)*$" <test_log'
...