如何在 bash 条件语句中检查“npm 运行测试”的结果



我有一个部署脚本,我只想在测试成功时才运行,但认为我的条件语句有问题if [ "$VALID" ]

#!/bin/bash
# install dependencies
echo 'INSTALLING YARN'
npm install yarn -g
echo "INSTALLING DEPENDENCIES"
yarn install
echo "TESTING"
VALID="$(npm test)"
if [ "$VALID" ]
    then    
    # ZIP up the code
    echo 'INSTALLING ZIP'
    apt-get update
    echo "y" | apt-get install zip
    echo 'ZIPPING'
    zip -r ./Lambda-Image-Compression.zip index.js node_modules
    # install aws cli so we can deploy code
    echo 'INSTALLING PIP'
    # echo "y" | apt-get install python-pip
    echo "y" | apt-get install python-pip python-dev build-essential 
    echo "y" | pip install --upgrade pip 
    # echo "y" | sudo pip install --upgrade virtualenv 
    echo 'INSTALLING AWSCLI'
    pip install awscli
    # Copy config file to root so AWS config & credentials are set
    echo 'MAKING AWS CREDENTIALS'
    CREDENTIALS="[default]
    aws_access_key_id = $AWS_ACCESS_KEY_ID
    aws_secret_access_key = $AWS_SECRET_ACCESS_KEY"
    touch .aws/credentials
    "$CREDENTIALS" > .aws/credentials
    echo "MOVING AWS CONFIG"
    cp -R .aws ~/.
    # Upload to AWS
    echo 'UPDATING LAMBDA FUNCTION'
    aws lambda update-function-code 
    --function-name resizeHandler 
    --zip-file fileb://Lambda-Image-Compression.zip 
    --region ap-southeast-2
fi

如果成功,我的测试结果如下所示:

> Lambda-Image-Compression@1.0.0 test 
> mocha
  myLambda
RUNNING OPTIMSATION
download
downloadImage: 69.381ms
End of step null
    ✓ Should move testImage.png from srcBucket to dstBucket and return true (286ms)

  1 passing (299ms)

失败显示以下内容:

TEST RESULT:
> Lambda-Image-Compression@1.0.0 test
> mocha
  myLambda
RUNNING OPTIMSATION
download
    1) Should move testImage.png from srcBucket to dstBucket and return true

  0 passing (22ms)
  1 failing
  1) myLambda Should move testImage.png from srcBucket to dstBucket and return true:
     ReferenceError: s3 is not defined
      at download (index.js:32:4)
      at nextTask (node_modules/async/dist/async.js:5273:14)
      at Object.waterfall (node_modules/async/dist/async.js:5283:5)
      at exports.handler (index.js:24:8)
      at error (node_modules/lambda-tester/lib/runner.js:151:25)
      at Promise.resolve.then (node_modules/lambda-tester/lib/runner.js:138:24)

你可以做一些类似的事情:

VALID="$(npm test | grep -o 'failing')"

然后:

if [[ $VALID != "failing" ]] ...

另一种方法是选择"0 传递":

VALID="$(npm test | grep -o '  0 passing')"

对于有条件的:

if [[ $VALID != "  0 passing" ]] ...

在任何一种情况下,如果在返回的字符串中找到单词"失败"或"0 通过",则表明测试失败。关键是要找到通过/失败输出的独特内容。

注意:仔细研究输出;"0 通过"字符串并非万无一失,因为从技术上讲,您可以进行 10 次测试......格雷普会 看到"10 次通过"并将其误认为失败。也许你没有 有那么多测试,但一定要意识到它,或者包括 导致它的确切空格数。

虽然这个问题相当古老并且已经得到了回答,但我想分享一下我是如何做到的,因为"正确"的解决方案似乎有点容易出错。

  1. Npm - 预构建:

Npm 允许您在package.json文件中链接命令,从而允许在生成之前运行测试:

{
 "scripts": {
  "build": "<build>",
  "prebuild": "npm run test",
  "test": "<test>",
 }
}

因此,当测试失败时,不会执行生成命令。如果您的build命令被调用,例如 deployprebuild必须重命名为 predeploy 。(在此处查看 npm 文档(

  1. 检查构建是否成功

现在在 shell 脚本中添加以下逻辑:

  1. 删除构建文件夹
  2. 检查是否已创建构建文件夹

可能看起来像这样:

#!/bin/bash
BUILD_DIR="./build"
rm -r $BUILD_DIR
npm run build
if [ -d "$BUILD_DIR" ]; then
    echo "Build was successful! Starting Deployment";
fi

同样,如果构建文件夹的调用方式不同,则必须相应地调整BUILD_DIR

最新更新