Jenkins作为一个CI工具在各种插件的加持下可以变成一个十分强大的工具,可以实现对各个平台代码的持续集成和部署。

甚至可以通过一些方法对多个节点进行同步更新代码等操作。

例如if.uy 多节点ping服务,目前ping节点服务器使用python3编写。虽然代码只有短短几百行但是如果每次更新都得手动上服务器对代码进行更新的话无疑是一件浪费时间精力的实情。所以为了防止因更新太频繁而放弃更新的情况出现,需要使用一种方法一次更新多节点自动同步的方案。

提出方案

所以根据需求可以设计出以下几种方案:

  • flask debug 模式热更新代码
  • Zookeeper 统一管理节点
  • jenkins Publish over SSH 插件管理节点

热更新代码

节点的代码用了flask几行代码就能实现一个接口,写起来确实很方便。而且在debug模式下当文件更新的时候flask可以自动重启载入新的文件。

所以可以选择另外实现一个接口用来接收git的hook触发push event之后从git repo pull新的代码,覆盖旧的程序文件。flask检测到文件更新之后重启。

这种方法确实很省时间,也不需要几行代码,不依赖外部的框架或者程序。但是在实际的生产环境中启用debug模式实在是不安全,会留下很大的安全隐患,所以剔除此方案。

Zookeeper

Zookeeper是Apache下的一个分布式管理工具,功能强大,但是问题也很明显。我的服务器都是超低配置,为了能节约点费用,所以这种依靠JVM的软件在这种乞丐配置下难以大展拳脚。

Push over ssh

在依赖Jenkins的情况下只需要一台服务器有较好的配置环境。而且Jenkins不仅仅可以用来更新节点的代码,还可以用来编译更新主站的Spring boot代码。

开始使用

安装插件

系统管理->插件管理->可选插件->搜索Publish Over SSH->安装重启

配置slave

虽然官方没说叫slave但是slave比较准确。

系统管理->全局管理->Publish over SSH

首先这部分是设置全局参数

publish over ssh

可以输入密码、private key路径或者private key。还有禁用远程命令。

点击下面的新增可以新增一个slave。

20190105162506.jpg

需要输入名称,远程地址,用户名和远程路径。该远程路径表示的是jenkins登陆之后的默认工作路径。

如果密码不是设置的全局密码可以进入高级选项修改进行覆盖参数。

20190105163124.jpg

最后点击test configuration测试,测试成功就可以保存进入项目中配置。

配置项目

进入构建后操作添加Send build artifacts over SSH, 添加选择一个slave

20190105163828.jpg

我们可以不使用Transfers去传输文件,可以在exec command里使用git pull或者执行一个脚本。然而transerfer set必须输入source files不适用transerfer set也执行不了shell命令,所以只好随便输入一个文件名,文件不存在也无所谓。

在执行shell脚本的时候需要注意权限问题,新增的文件默认是没有执行权限的。所以需要手动chmod +x一下。

而且为了Flask能跑在后台所以用了nohup,然而使用nohup的情况必须指定一个output file,不能使用默认文件。否则jenkins会认为执行命令超时无反应,认为此为不健壮的代码,就会有一个黄标。

restart脚本

有相关需求的同学可以看看,本人用了以下的代码来重启flask

#!/bin/bash
kill -9 $(ps -ef | grep 'python3 ping.py' | grep -v grep | awk '{print $2}')
git pull
nohup python3 ping.py > nohup2.out 2>&1&

首先查找到之前python程序的pid将其kill。再pull新的代码,再次启动python。

End