Jon*_*bek 5 deployment bash scripting pm2
我有一个服务器应用程序,有两个部署,一个用于临时环境,另一个用于生产环境。我有两个单独的脚本负责启动进程。我想通过读取环境文件来合并start_production.sh并start_staging.sh进入。start.sh
start_production.sh
#!/bin/bash
pm2 delete production
pm2 start "npm run build && npm run start:prod" --name production --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs
Run Code Online (Sandbox Code Playgroud)
检查内容,两个脚本之间的唯一区别是进程名称空间应始终与环境文件相对应。这使得加载该.env属性成为理想选择NODE_ENV
.env
NODE_ENV=staging
Run Code Online (Sandbox Code Playgroud)
最终我想做一些类似的事情
start.sh
#!/bin/bash
ENVIRONMENT={read NODE_ENV content of .env}
pm2 delete echo $ENVIRONMENT
pm2 start "npm run build && npm run start:prod" --name echo $ENVIRONMENT --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs
Run Code Online (Sandbox Code Playgroud)
很明显,我在 bash 脚本方面绝对是新手,所以我想要一个尽可能具体的答案。
我将提供一个解决方案,该解决方案是基于两个当前答案的聚合解决方案
start.sh
#!/bin/bash
source .env
ENVIRONMENT="$NODE_ENV"
if [ "$ENVIRONMENT" != "production" ] && [ "$ENVIRONMENT" != "staging" ]; then
echo "improper .env NODE_ENV"
exit
fi
pm2 delete "$ENVIRONMENT"
pm2 start "npm run build && npm run start:prod" --name "$ENVIRONMENT" --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs
Run Code Online (Sandbox Code Playgroud)
你可以的source文件.env。因为该格式KEY=value与 bash 的环境变量处理方式兼容。所以在你的情况下,start.sh会是
#!/bin/bash
source .env
pm2 delete echo $NODE_ENV
pm2 start "npm run build && npm run start:prod" --name $NODE_ENV --log-date-format 'DD-MM HH:mm:ss.SSS'
pm2 logs
Run Code Online (Sandbox Code Playgroud)