github actions 报错,怎么解决?

新手上路,请多包涵

有没有大佬来帮我看一看,是关于github actions的,我在实现一个推送代码到指定分支上时,会自动触发在远程目标服务器上面部署运行springboot项目,但是每一次运行到以下代码的时候:

....
# 进入部署路径并启动新进程
            cd ${{ env.DEPLOY_PATH }}/jar && \
            setsid ${{ env.JDK_HOME }}/java -jar ${{ env.JAR_FILE }}.jar -Xmx256M -Xms256M > app.log 2>&1 < /dev/null &
          
            # 输出日志以确认进程已启动
            echo 'Spring Boot application started and running in the background.'
          "

它就会一直卡在这里。但是事实上,这一个项目是被正确运行了,监听端口也有信息,但是工作流中会报错:

Spring Boot application started and running in the background.
client_loop: send disconnect: Broken pipe
Error: Process completed with exit code 255.

我有一点不明白,部署成功之后,不就是应该断开ssh连接吗?有没有大佬解决一下?

因为这个地方报错,所以它工作流就一直显示是错误的,即使产生效果是正确的,我试图用exit命令来直接结束与目标服务器的ssh连接,但还是报这个错误,我又把目标服务器上面的连接时长设置长了一点,还是报错

阅读 1.5k
avatarAI BotBETA

这个问题通常是由于在GitHub Actions中通过SSH连接到远程服务器并执行命令时,SSH会话的关闭方式不正确导致的。在你的情况中,虽然Spring Boot应用已经成功启动并在后台运行,但SSH会话可能因为某些原因(如输出重定向)被异常中断,导致GitHub Actions认为命令执行失败。

这里有几个可能的解决方案:

  1. 使用nohup&确保进程在后台运行
    在你的命令中,你已经使用了&来将进程放入后台,但可以使用nohup来确保即使SSH会话断开,进程也会继续运行。修改后的命令如下:

    cd ${{ env.DEPLOY_PATH }}/jar && \
    nohup ${{ env.JDK_HOME }}/java -jar ${{ env.JAR_FILE }}.jar -Xmx256M -Xms256M > app.log 2>&1 &
    echo 'Spring Boot application started and running in the background.'

这里nohup会忽略所有挂断(SIGHUP)信号,使得进程在SSH会话断开后继续运行。

  1. 检查SSH命令的退出状态
    确保你的SSH命令(如果你使用的是ssh命令来连接服务器)正确设置了退出状态。如果SSH命令因为某些原因(如网络问题)失败,它可能会返回非零退出状态,导致GitHub Actions认为整个步骤失败。
  2. 使用wait命令等待后台进程
    如果你需要确保Spring Boot应用完全启动后再继续执行其他命令(虽然在这个场景下可能不是必需的),你可以使用wait命令等待后台进程结束(尽管在这个案例中,由于Spring Boot应用是设计为长期运行的,你可能不需要这样做)。但请注意,wait会阻塞当前shell直到所有后台作业完成,这在你希望SSH会话立即断开的情况下不适用。
  3. 检查GitHub Actions的配置
    确保你的GitHub Actions配置中没有其他可能导致流程中断或失败的步骤。有时,错误可能并不直接来自你展示的这部分代码。
  4. 日志和调试
    增加更多的日志输出,以帮助诊断问题。你可以在SSH会话中运行额外的命令来检查Spring Boot应用的状态,例如使用curl来检查应用是否响应。
  5. 使用更健壮的部署脚本
    考虑将部署逻辑封装在一个更健壮的脚本中(如bash脚本),该脚本可以更好地处理错误和异常情况。

应用上述建议之一或几个,应该能帮助你解决GitHub Actions中遇到的问题。

2 个回答

你这是有条命令退出状态码255,不是0,被视为异常导致的,如果每次都出现,那就是脚本有问题了,我建议你这么改一下,使用正统做法nohup

# 进入部署路径并启动新进程
cd ${{ env.DEPLOY_PATH }}/jar || ( echo "${{ env.DEPLOY_PATH }}/jar not found !" && exit 1);
nohup ${{ env.JDK_HOME }}/java -jar "${{ env.JAR_FILE }}.jar" -Xmx256M -Xms256M > app.log 2>&1 &

# 记录开始时间
start_time=$(date +%s)
# 设置检测超时时间为30秒
timeout=30

while true; do
    # 这里最好是调用actuator/health的接口确定启动正常才更加精准
    if pgrep -f "${{ env.JAR_FILE }}.jar" > /dev/null; then
           echo 'Spring Boot application started and running in the background.'
        exit 0
    fi

    if (( $(date +%s) - start_time > timeout )); then
        echo "Check spring Boot application [${{ env.JAR_FILE }}.jar] startup timeout !";
        tail -n 50 app.log;
        exit 1
    fi

    # 每秒检测一次
    sleep 1  
done

把你的setsid替换为nohup,让进程在SSH会话关闭后继续运行,不会阻塞连接:

cd ${{ env.DEPLOY_PATH }}/jar && \
nohup ${{ env.JDK_HOME }}/java -jar ${{ env.JAR_FILE }}.jar -Xmx256M -Xms256M > app.log 2>&1 & \
exit
推荐问题
logo
Microsoft
子站问答
访问
宣传栏