golang 实现自动化部署的实例

自动化部署有Jenkins为什么我还要写这篇文件,应为公司服务器太菜了,装上jenkins服务器炸了。
所以想用golnag撸一了自动化部署工具 每次更新程序都scp太痛苦了

实践完成的自动化部署工具

自动化部署的实现思路

图片描述
看了这个图 大家应该发现这实践起来并不困难
就是收到 请求 后去 调用 git pull 就行

下面是程序分析

# devops生成文件    请填写完成检查确认后 再 运行啊   (每次运行会重写sh模块)


# 这devops系统配置
app:
  host: "0.0.0.0:8083"
  debug: true
  max_request: 1000
  task_num: 10

# 要自动化部署应用的配置
devops:
  node:
    - port: "8081"                             # 程序运行端口
      full_name: "dollarkillerx/easyutils"     # 名称 例如 dollarkillerx/easyutils
      branch: "master"                         # 分支
      giturl: "https://github"                   # git pull url 地址 (你要先配置一下秘钥啊!)
      runname: "api"                           # 运行程序的name
      dirpath: "/home/s"                       # 绝对路径
      secondarydirectory: ""                   # 如果有二级目录 就填写在这里
    - port: "8082"                              
      full_name: ""      
      branch: "es"      
      giturl: ""    
      runname: ""    
      dirpath: ""    
      secondarydirectory: ""

用户填写 yaml文件 node部分是一个[]slice
当系统初始化的时候 我获取读这个文件

这边有一个问题,让脚步运行程序 but这个二级制的程序 可能不在 这个项目的最外层目录上 就需要一个secondarydirectory来指引

var sh1 = `
#! /bin/sh

lsof -i :%s | awk '{print $2}'> tmp
pid=$(awk 'NR==2{print}' tmp);
kill -9 $pid

# 如果文件不存在 git clone 
if [ ! -d "%s" ];then
    cd %s
    git clone -b %s  %s
    cd %s
    ./%s &    
else
# 如果文件存在
    cd %s
    git pull
    ./%s &

fi
`

var sh2 = `
#! /bin/sh

lsof -i :%s | awk '{print $2}'> tmp
pid=$(awk 'NR==2{print}' tmp);
kill -9 $pid

# 如果文件不存在 git clone 
if [ ! -d "%s" ];then
    cd %s
    git clone -b %s  %s
    cd %s
    cd %s
    ./%s &    
else
# 如果文件存在
    cd %s
    git pull
    cd %s
    ./%s &

fi

这边写了两个sh的模板 初始化系统的时候 读取config.yml 然后生成对应的sh

github 当pull发送的数据分析

{
  "ref": "refs/heads/master",
  "before": "b61cd27c0bfe30cbac7a731a6ce22790d9e1f6f7",
  "after": "05300bfb10912f370ac74a5cbc2ed2095a60466c",
  "repository": {
    "id": 208684536,
    "node_id": "MDEwOlJlcG9zaXRvcnkyMDg2ODQ1MzY=",
    "name": "Cartoon5",
    "full_name": "dollarkillerx/Cartoon5",

当pull触发的时候 返回的数据
我们这里主要看
"ref": "refs/heads/master", 这个是分支
"full_name": "dollarkillerx/Cartoon5", 这个是项目的地址

当服务器上部署多个网站就可以判断这两个 来分辨现在改执行什么脚本

这个系统是不是非常简单啊!