一,流程图

使用php,python做一个简易的发版系统_第1张图片

二,流程简述

运维人员在浏览器中选择要发版的项目,点击发版按钮,程序会首先检测是否有其他进程在发布,通过检查lock的方法,如果lock文件存在,则返回首页,否则将要发版执行的shell命令写入到newfile.txt文件中,待后端进程读取执行。后端python程序每3秒自动执行,读取newfile.txt中的命令,并执行,将结果输出至install.log文件中,前端通过websocket获取日志信息并打印到浏览器。

三,代码实现

1, 前端页面


'; echo 'GO_BACK'; exit; } //写入将发版命令写入到newfile.txt文件中,供后端python程序读取 $file = fopen("/srv/shell/newfile.txt", "w") or die("Unable to open file!"); fwrite($file, $cmd); fclose($file); ?>

前端测试发版页面

阿里云测试 



2, 后端python程序faban.py(python版本2.7.5)

#!/usr/bin/python
import os
import sys
import time
from subprocess import call
log = open("install.log", "w")
def faban():
    if os.stat('newfile.txt').st_size > 0:
        with open('newfile.txt') as f:
            for line in f:
                cmd = line.split(' ')[0] + " " + line.split(' ')[1] 
                open('/srv/shell/faban.lock', 'w').close()
                call(cmd, shell=True, stdout=log)
                os.remove('/srv/shell/faban.lock')
                open('newfile.txt', 'w').close()
    else:
        pass
if __name__ == '__main__':
    while True:
        time.sleep(3)
        faban()

设置后台运行

# nohup python faban.py &

3, 启动websocketd
下载地址:http://websocketd.com/ 解压到/usr/local/bin/下
启动:

# nohup /usr/local/bin/websocketd --port=3888 bash ./tailf.sh  &

4, shell脚本web_test.sh(vue项目为例)

#!/bin/bash

if [ $# -lt 1 ]; then
  echo "usage: $0  "
  exit 1
fi

project=$1
echo "=======================开始执行$(date)====================="
cd /srv/shell
if [ -e $project ]; then
    rm -rf ${project}*
fi

deploy(){
  local USER=$1  # git用户
  local PROJECT=$2  # 项目名称
  local HOST=$3  # 部署主机
  local PORT=$4  # 主机端口
  local BRANCH=$5  # git分支
  local ENV=$6 # 编译环境
  rm -rf /srv/shell/${PROJECT}
    # 拉取代码
  git clone -b ${BRANCH} [email protected]:${USER}/${PROJECT}.git
  cd /srv/shell/${PROJECT}
  /opt/node/bin/npm install
  npm run build${ENV}
  if [ $? -ne 0 ]; then
    echo "${PROJECT} 构建失败。。。"
    exit 3
  fi
  tar -zcvf ${PROJECT}.tar.gz ./dist/

    # 发布代码
  ssh -p ${PORT} ${HOST} "if [ ! -d /mnt/wwwroot/${PROJECT} ]; then mkdir -pv /mnt/wwwroot/${PROJECT}/dist; fi"
  scp -P ${PORT} -r ${PROJECT}.tar.gz ${HOST}:/mnt/wwwroot/${PROJECT}
  ssh -p ${PORT} ${HOST} "mv /mnt/wwwroot/${PROJECT}/dist /mnt/wwwroot/${PROJECT}/dist_$(date +'%Y%m%d%H%M')"
  ssh -p ${PORT} ${HOST} "cd /mnt/wwwroot/${PROJECT}; tar -xvf ${PROJECT}.tar.gz"
  ssh -p ${PORT} ${HOST} "chown -R www.www /mnt/wwwroot/${PROJECT}/"
  ssh -p ${PORT} ${HOST} "cd /mnt/wwwroot/${PROJECT}; find . -regex './dist_[0-9]*$' -type d | sort -rn | sed -n '6,\$p' | xargs rm -rf "
  echo "${PROJECT} 发版完毕"
}
if [ $project == 'apptest' ]; then
  deploy test apptest  testapp 22 master :test 
fi

四,最终效果展示

使用php,python做一个简易的发版系统_第2张图片