DevOps理念初探之落地项目1:自动化代码发布平台功能实现
自动化代码发布平台功能实现
背景
市面上主要的自动化或者DevOps理念中的持续集成持续发布模块说明都大同小异,大多数是使用代码托管平台的网络钩子,当有对应事件发生时触发钩子向配置好的回调地址发送POST请求。但是大多都是将接收POST请求的代码和网站代码放置于同一台服务器。而且更新代码的方式是进入网站代码目录进行git pull 操作。
背景暴露问题
- 生产环境集群下多台服务器代码需要更新,运维精力和时间成本太大,并且人工发布代码出错率太高。
- 生产环境集群下多台服务器代码需要更新,就需要每台网站服务器都需要部署可以接收webhook的代码。
- 生产环境需要安装git svn等环境
- 代码托管平台需要配置多个回调POST请求路径
- 版本回滚是硬伤,无法平滑无损发布并且无法比较优雅的回滚代码版本
- git pull 容易产生合并冲突等问题
- 持续集成持续发布的情况下,代码已经投入正式生产接受客户访问时,持续集成和发布会带来负面影响。所以编写AuthDeploySystem让代码上线之前有一个缓冲过程。
目的
公司项目代码托管使用的是局域网本地化GitLab。我希望编写并实现自动化代码发布平台系统对GitLab无缝对接。
实现原理
- 当研发同事在GitLab对项目进行Tag打包操作时会触发配置好的钩子对我的平台发送POST请求。以下简称AutoDeploySystem。
- 根据POST数据进行入库并实现测试/生产环境的Tag自动发布以及Tag回滚功能。
- 在远程网站服务器nginx虚拟主机配置文件内,一定要使用软连接方式发布网站代码目录,这对于网站代码无损发布/升级回滚以及日常维护具有重要的深远意义!如下三张图所示。
环境配置
GitLab配置
- GitLab 版本11.5.1-ee
- 设置允许接收内网hooks(需要使用管理员登陆,在Admin area/Network处配置)
- AutoDeploySystem从GitLab下载对应checkout_sha的代码时需要使用GaitlabApi。所以需要配置Access Token。使用管理员登陆。在User Settings /Access Tokens 设置Personal Access Tokens
- Webhooks 设置(在每个需要接入AutoDeploySystem功能的项目下配置URL /Secret Token 以及打勾 Tag push events 保存, 如果没配置https,Enable SSL verification 取消勾选)
AutoDeploySystem 服务器环境配置
- 准备一台Centos 6.x 服务器,运行自动发布系统。
- Python环境 Python 2.7.11 ,如果是Python 2.6.x需要升级到Python 2.7.11。升级步骤可以参考我的另外一篇博客https://blog.****.net/qq_34668238/article/details/88550908
- 防火墙放行AutoDeploySystem代码端口
- 设置ntpdate 自动同步网络时间
- 安装mongodb 4.0.1 需要开启用户认证。mongodb安装以及开启用户认证请自行Google
- 安装pip然后安装Django1.11 Fabric1.14.1 pymongo==3.7.2
配置AutoDeploySystem 代码配置文件
- Mongodb配置,ip/port/user/password/dbname 配置成自己的
- GITLAB_TOKEN字典配置,项目id与安全token要匹配对应上。项目id是在GitLab项目名称下显示的项目ID
安全token是在项目下创建webhook的时候设置的
- 配置GITLAB_ROOT_PRIVATE_TOKEN字典,将值替换成配置GitLab获取到的token值
- GITLAB_HOME_PAGE 变量的值配置成GitLab访问网址
- CODE_KEEP_DIR 变量的值配置成AutoDeploySystem系统保存代码的路径(创建一个空目录即可)
- PROJECT_ID_DEPLOY_DICT 字典变量根据提示设置成对应的值
- 在Django admin管理站点添加用户(用户名:项目id,密码:安全token)
- 确保AutoDeploySystem所在服务器已经可以无密码访问远程网站服务器。使用ssh-copy-id 命令进行无**访问配置。
- Nginx uwsgi Django 项目部署请自行Google
AutoDeploySystem使用部分截图
- 项目id与安全token没对应上无法登陆系统
- 输入正确的项目id与安全token进入系统点击Display Tag如图所示。显示测试/生产环境最新发布的代码Tag版本、对应checkout_sha版本、发布时间。
- 研发同事在GitLab执行打Tag操作
- AutoDeploySystem接收到POST请求的数据,入库
- Deploy功能下下拉列表框自动出现研发同事打的Tag版本名称
- 选择Tag版本之后,点击deploy test env 按钮将Tag对应的checkout_sha代码发布到远程服务器
- 远程服务器已经变更成功
- 对当前current软连接对应的代码目录进行测试。当前对外提供服务代码生效。
- 当前测试/生产环境Tag版本信息自动更新
- 回滚指定版本Tag
- 不允许回滚其他未发不过去的Tag版本
- 点击Logout 退出到登陆首页
AutoDeploySystem第一版存在的问题
- 前端界面简陋
- 没有ajax 异步加载,都是整个页面一起渲染到前端
- 串行发布代码。如果生产环境服务器数量较多。执行效率会慢。需要加入Fabric 的 parallel
- 没有加入session过期
- 环境部署较为复杂
优势
- 使用简单。核心功能完整。
- 入库了GitLab发来的POST所有请求。可扩展许多其他功能。比如Deploy成功之后给打Tag包的同事发送邮件告知等。
关于代码
本人小白一枚。代码是使用最简单的语法编写。抽象化层次较低。喜欢交流的可以私聊我。一起学习成长。
感谢
感谢同事@川 的指点和帮助