# 常见问题

# 部署命令已执行完毕,但需等很久才显示部署成功,甚至出现部署超时

  1. 将项目启动命令的输出信息重定向到指定文件中,来释放启动进程。

    假设原命令为:

    nohup java -jar BiuBiuBiu.jar &

    可以更改为:

    nohup java -jar BiuBiuBiu.jar >output 2>&1 &

  2. 更换启动命令的格式,将串联成一行的多个命令分离成单独的每一行来执行。

    假设原始命令格式为:

    command1 && command2 && command3

    可以更改为:

    command1

    command2

    command3

# 本地部署无误,但devops中部署失败

# 情况一:变量赋值为空,命中了devops部署失败判定规则

  1. linux中调用命令结果给变量赋值时,若该值检测为空,那么命令返回值将会是1,否则返回值将会是0。示例如下:

    [root@test ~]# test=$(ps -ef| grep nginx|grep -v grep)
    [root@test ~]# echo $? 
    1
    [root@test ~]# echo $test
    
    [root@test ~]# test=$(ps -ef| grep nginx)             
    [root@test ~]# echo $?                 
    0
    [root@test ~]# echo $test                
    root 78668 78666 0 15:29 pts/2 00:00:00 grep --color=auto nginx
    
  2. 在linux服务器中执行sh脚本,不会因为使用上述方式给变量赋值为空而停止脚本,但是devops部署时会检测脚本中每一个步骤的命令返回值,当检测到返回值非0时,就会判定为部署失败。因此可以对脚本中的变量封装做一些修改,以上面进程检测为例:

    # 原始脚本大致结构可能为
    test=$(ps -ef|grep nginx|grep -v grep)
    if [ -z $test ];then
      echo "进程不存在"
    fi
    
    # 可以改成如下结构,就不会触发部署任务的非零值检测:
    if ! ps -ef|grep nginx|grep -v grep;then
      echo "进程不存在"
    fi