我正在为Digital Ocean上的节点应用创建一个自定义构建系统,它涉及git钩子来安装依赖项并启动应用程序。部分app app从环境变量中读取敏感数据(无法检入repo)。在我的git hook中,我使用外部脚本停止应用程序,复制repo文件(从SOURCE_REPO
到SOURCE_DIR
(应该更好地命名变量)并重新启动应用程序:
# hooks/post-receive
# go to the www repo and stop the app
cd $SOURCE_DIR
if [ -f tools/staging-stop.sh ]; then
echo "Stopping the staging app..."
tools/staging-stop.sh
fi
cd $SOURCE_REPO
git --work-tree=${SOURCE_DIR} checkout --force
cd $SOURCE_DIR
if [ -f tools/staging-start.sh ]; then
echo "Starting the staging app..."
tools/staging-start.sh
fi
# tools/staging-stop.sh
node_modules/.bin/pm2 stop staging
# updates env vars
node_modules/.bin/pm2 delete staging
# tools/stating-start.sh
source /etc/profile.d/my_env_vars.sh
yarn install --production=true
NODE_ENV=staging node_modules/.bin/pm2 start build/index.js --name staging
然而,由于我无法确定的原因,当git hook启动应用程序时,/etc/profile.d/my_env_vars.sh
中的环境变量(我认为应该可以在不获取它们的情况下使用)不存在。但是,如果我ssh
进入服务器并使用pm2手动启动应用程序,环境变量可用,所以我猜这与git hook本身及它启动的shell类型有关。
我真的很感激这方面的帮助。