一、前言
在服务器上启动一个web服务,当git仓库被push的时候,git仓库会向这个服务发送一次post请求。
web服务在收到请求后,自动执行拉取,创建容器,启动容器的操作。
二、代码
这是用python写的tornado服务。
"""
启动服务,收到指令时,拉取码云上的代码
"""
import json
import os
import subprocess
import tornado.ioloop
import tornado.web
# 代码在本地的目录
cangku_path = r"/home/cangku1"
# 远程仓库地址
cangku_url = r""
# 无所谓的东西
shortname = "ccc"
def subprocess_(cmd):
"""
subprocess模块执行linux命令
:return:
"""
subprocess.Popen(cmd, shell=True) # 执行ls命令
def 自动部署():
# 先判断文件夹是不是存在,如果不存在,就创建文件件,
# if not os.path.isfile(cangku_path):
# subprocess_(f"mkdir -p {cangku_path}") # 创建文件夹
# os.chdir(cangku_path) # 切换到目标工作目录
# subprocess_(f"git init") # git初始化
# subprocess_(f"git remote add {shortname} {cangku_url}") # 链接仓库
# 进入git仓库目录
os.chdir(cangku_path)
# 放弃本地修改,强制拉取代码覆盖本地
subprocess_(f"git fetch --all && git reset --hard {shortname}/master")
# 停止并删除容器
subprocess_("docker-compose down")
# 创建容器
subprocess_("docker-compose build –no-cache")
# 启动容器
subprocess_("docker-compose up")
class MainHandler(tornado.web.RequestHandler):
def post(self):
自动部署()
self.write("haode")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(9002)
tornado.ioloop.IOLoop.current().start()
首先,这个服务器需要在git仓库注册公钥,这样就能免验证拉取代码了