背景
之前为部门搭建了walle,作为发布系统,管理发布流程,提高了发布效率;
但开发和测试过程中,发布频繁的情况下,需要经常去建立发布单,点击发布等,还是有点麻烦,索性研究了下walle,结合gitlab的cicd实现测服的自动发布
原理
- 模拟walle发布流程
- walle二开
对walle进行二次开发,添加需要的api接口,通过python 的requets 模块实现walle登录到发布的流程
gitlab-runner
gitlab-runner register
根据提示,填入对应的信息
项目中配置.gitlab-ci.yml
.gitlab-ci.yml 关键字解释
关键字 | 是否必须 | 描述 |
---|---|---|
image | 否 | 用于docker镜像,查看docker文档 |
services | 否 | 用于docker服务,查看docker文档 |
stages | 否 | 定义构建阶段 |
before_script | 否 | 定义在每个job之前运行的命令 |
after_script | 否 | 定义在每个job之后运行的命令 |
variable | 否 | 定义构建变量 |
cache | 否 | 定义一组文件列表,可在后续运行中使用 |
tags | 否 | 选择要使用runner |
配置
tags:为注册runner时填写的tags
stages:
- deploy
- test
deploy:
stage: deploy
tags:
- node-01-fat
script:
- python3 /home/gitlab-runner/walle-cd/main.py -e ownner@ownner.co -p Abc123456 -s 9 -i 20
only:
- release
test:
stage: test
tags:
- node-01-fat
script:
- echo test
only:
- release
when: on_success
walle 源码二开
用python 的socketio-client作为客户端调试walle的socket接口,但始终没有通过鉴权,所以自己将socket部分的通信用http 接口实现了一遍,大部分还是重用walle本身的函数,加一个开关控制是否启用socket,在路由层暴露出来,就可以通过http调用 访问了,改的地方比较多,这里就不贴了,有需要的看源码,或者私信联系吧
walle-cd 源码
main.py
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from walle_flow import WalleDevopsFlow
import sys, getopt
def main(argv):
try:
host = "http://admin.walle-web.io"
branch = 'release'
opts, args = getopt.getopt(argv,"e:p:s:i:",["email=","passwd=","sId=","pId="])
email = ""
passwd = ""
spaceId = 1
projectId = 1
for opt,arg in opts:
if opt in ["-e","--email"]:
email = arg
if opt in ["-p","--passwd"]:
passwd = arg
if opt in ["-s","--sId"]:
spaceId = arg
if opt in ["-i","--pId"]:
projectId = arg
print('start devops flow args:')
print(args)
print(opts)
#创建自动发布流对象
walle = WalleDevopsFlow(host=host,branch=branch,email=email,spaceId=spaceId,passwd=passwd,projectId=projectId)
#模拟发布流程
project = None
branches = None
commits = None
if walle.login() and walle.switch_space():
#获取项目信息
project = walle.get_project_by_id()
if project:
#获取分支