Nodejs forever和git hooks自动部署

Nodejs forever和git hooks自动部署

#post-receive钩子#

Goto the deploy dir and pull the latest sources

cd $DEPLOY_DIR #env -i git reset --hard env -i git pull

# restart app.js
/etc/init.d/脚本 restart
echo '结束'
exit 1

#脚本文件#

start) forever -l $LOG/forever.log -o $LOG/forever_out.log -e $LOG/forever_ err.log --pidFile $PID --minUptime 5000 --spinSleepTime 2000 -a start $DEAMO N >/projects/logs/start.log &

#因为是forever程序,钩子会认为程序没有结束,所以push一直不结束,怎么解决呢#


3 回复

当然可以!下面是如何使用 Node.jsforeverGit Hooks 实现自动化部署的详细说明和示例代码。

Node.js Forever 和 Git Hooks 自动部署

1. 配置 Git Hooks

首先,在你的 Git 仓库的 hooks 目录中创建一个 post-receive 钩子。假设你的部署目录为 /var/www/myapp,你可以通过以下步骤来配置:

# 进入 Git 仓库的 hooks 目录
cd /path/to/repo.git/hooks

# 创建 post-receive 钩子文件
cat > post-receive << EOF
#!/bin/bash

# 设置部署目录
DEPLOY_DIR="/var/www/myapp"
LOG="/var/log/myapp"
DAEMON="/var/www/myapp/app.js"

# 进入部署目录并拉取最新代码
cd \$DEPLOY_DIR
env -i git pull origin main

# 重启应用
/etc/init.d/myapp restart

echo "Deployed successfully."
EOF

# 赋予执行权限
chmod +x post-receive

2. 创建启动脚本

为了确保应用能够正确地通过 forever 启动和重启,你需要创建一个启动脚本。假设你已经在项目根目录下创建了一个 start.sh 文件:

#!/bin/bash

# 设置日志文件路径
LOG="/var/log/myapp"
PID="/var/run/myapp.pid"

# 使用 forever 启动应用
forever -l \$LOG/forever.log -o \$LOG/forever_out.log -e \$LOG/forever_err.log --pidFile \$PID --minUptime 5000 --spinSleepTime 2000 -a start \$DAEMON > /projects/logs/start.log &

3. 创建服务启动脚本

为了方便管理和重启应用,你可以创建一个系统服务脚本。假设该脚本位于 /etc/init.d/myapp

#!/bin/bash
### BEGIN INIT INFO
# Provides:          myapp
# Required-Start:    \$remote_fs \$syslog
# Required-Stop:     \$remote_fs \$syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

# 设置变量
DEPLOY_DIR="/var/www/myapp"
DAEMON="\$DEPLOY_DIR/app.js"
PID_FILE="\$DEPLOY_DIR/pidfile.pid"
LOG="/var/log/myapp"

case "\$1" in
  start)
    echo "Starting server..."
    /path/to/start.sh
    ;;
  stop)
    echo "Stopping server..."
    forever stop \$DAEMON
    ;;
  restart)
    echo "Restarting server..."
    forever restart \$DAEMON
    ;;
  *)
    echo "Usage: \$0 {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

4. 解决钩子阻塞问题

由于 forever 程序是守护进程,它不会立即退出,因此 post-receive 钩子会认为程序没有结束,导致 push 操作无法完成。为了解决这个问题,可以在 start.sh 中添加一个标志文件,确保脚本运行完成后删除该文件:

#!/bin/bash

LOG="/var/log/myapp"
PID="/var/run/myapp.pid"
FLAG_FILE="/tmp/deploy.flag"

# 使用 forever 启动应用
forever -l \$LOG/forever.log -o \$LOG/forever_out.log -e \$LOG/forever_err.log --pidFile \$PID --minUptime 5000 --spinSleepTime 2000 -a start \$DAEMON > /projects/logs/start.log &

# 创建标志文件
touch \$FLAG_FILE

# 等待应用启动
sleep 5

# 删除标志文件
rm \$FLAG_FILE

这样,当 post-receive 钩子执行时,它会等待标志文件被删除,从而确认应用已经成功启动。

通过以上步骤,你可以实现基于 Node.jsforeverGit Hooks 的自动化部署。希望这些示例代码对你有所帮助!


不懂帮顶

针对你的问题,你可以使用 forever 的命令来重启你的应用,并且在 Git Hooks 中处理这个问题。你需要确保在更新代码后,能够正确地重启你的 Node.js 应用。

示例代码

假设你有一个简单的 Node.js 应用 app.js,并且你已经安装了 forever。以下是如何设置 Git Hooks 和 Forever 来实现自动部署:

1. 在服务器上创建 .git/hooks/post-receive 文件

#!/bin/bash

# 设置变量
DEPLOY_DIR=/path/to/deploy/dir
LOG=/path/to/log/dir
PID=/path/to/pid/dir/app.pid

# 进入部署目录并拉取最新代码
cd $DEPLOY_DIR
env -i git pull origin main

# 停止当前运行的应用
forever stop $PID

# 重新启动应用
forever start -l $LOG/forever.log -o $LOG/forever_out.log -e $LOG/forever_err.log --pidFile $PID --minUptime 5000 --spinSleepTime 2000 -a app.js

2. 确保 .git/hooks/post-receive 可执行

chmod +x .git/hooks/post-receive

解释

  1. 进入部署目录并拉取最新代码:这一步是确保你在部署目录中拉取最新的代码。
  2. 停止当前运行的应用:使用 forever stop 命令停止当前正在运行的应用。这需要传入 PID 文件的路径。
  3. 重新启动应用:使用 forever start 命令重新启动你的应用,并指定日志文件、最小运行时间等参数。

这样可以确保每次推送时,Git Hook 会自动拉取最新的代码并重启应用,从而避免由于 forever 持续运行导致的阻塞问题。

希望这可以帮助你解决问题!

回到顶部