2019独角兽企业重金招聘Python工程师标准>>>

持续集成概念

持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 --马丁福勒


git工作分支

持续集成的前提必须要有一个健壮且分明的版本工具,毫无疑问我们这里使用git作为版本工具

这里只简单说一下各个分支的作用,想了解更多关于git工作流知识,请点击深入理解学习Git工作流

  • feature/* 功能分支,用于一个新的功能的开发
  • hotfix/* 热修复分支,用于对线上环境的bug热修复
  • develop/* 测试分支,测试环境对应的分支
  • master分支,预上线环境分支

对于hotfix和feature分支允许开发者push,对于develop和master分支只允许开发者merge。


本文原理分析图示

  • 首先开发者完成代码后git push到gitlab服务器,通过gitlab上事先设定好的系统钩子来触发一个post请求到后端的webserver服务器。
  • 后端webserver服务器收到请求后通过gitlabCI.py分析来源分支与项目组,然后交给不同的shell脚本处理。
  • 通过shell脚本来更新不同环境的项目代码,如果是开发分支的话还需要配置nginx并推送访问url至钉钉。
  • ELK服务器监控php的项目报错日志,开发者通过查看然后及时进行debug。

webserver对git请求的具体处理图示


开发环境(dev_branch)处理流程

对于hotfix/* 或者 feature/*

  • git push事件 触发gitlab钩子,然后gitlabCI脚本通过条件检测,执行开发分支的shell脚本
  • shell脚本拉去对应的功能分支或者热修复分支,然后拷贝一份nginx模板配置文件,修改对应的域名和目录。
  • 重载nginx配置文件并将访问连接推送至钉钉群。

gitlab服务器配置

  • 配置服务器秘钥

  • 添加系统钩子,并选择在什么时候触发钩子


webserver配置

配置gitlab处理脚本

这里只贴出部分代码只供参考,因为具体需求可能不同,这里就抛砖引玉。

  • gitlabCI.py 用于处理gitlab的事件请求
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2018-12-18 17:41
# @Author  : opsonly
# @Site    :
# @File    : gitlabCi.py
# @Software: PyCharmfrom flask import Flask,request,render_template,make_response,Response
import json,os,re,requests
import subprocess
import reapp = Flask(__name__)
null = ""
cmd = "/var/www/html/"
@app.route('/test',methods=['POST'])
def hello():json_dict = json.loads(request.data)name = json_dict['event_name']#字符串截取分支名ref = json_dict['ref'][11:]ssl = json_dict['project']['url']#gitlab项目名project = json_dict['project']['name']#gitlab分组名namespace = json_dict['project']['namespace']hostfix = re.compile(r'hostfix/*')feature = re.compile(r'feature/*')if name == 'push':if namespace == 'it':#预上线分支if ref == 'master':cmd = './itmaster.sh ' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)# 测试分支elif ref == 'develop':cmd = './itdevelop.sh ' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)#开发分支elif hostfix.match(ref) and feature.match(ref):cmd = './itOwn.sh' + project + ref + ' ' + namespace + '' + ssls = subprocess.getoutput(cmd)return Response(s)elif namespace == 'web':if ref == 'master':cmd = './webMaster.sh ' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)elif ref == 'develop':cmd = './webDevelop.sh ' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)# 开发分支elif hostfix.match(ref) and feature.match(ref):cmd = './webOwn.sh' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)elif name =='merge_request':#可以定义一个钉钉推送,每次直接点开链接就能直达gitlab合并界面passelse:return Response('未触发事件')if __name__ == '__main__':app.run()

将不同的请求分发至不同shell脚本来处理

it组shell脚本

  • 测试服务器脚本
#!/bin/bash
Dir="/var/www/html"
function ERROR_NOTICE() {url="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxx"header="'Content-Type: application/json'"msg="'{\"msgtype\": \"text\",\"text\": {\"content\":\"$1 $2 $3\"}}'"a='curl '$url' -H '$header' -d '$msgeval $a}function IF_TRUE() {if [ $? -ne 0 ];thenERROR_NOTICE $1 $2 $3fi
}function master() {if [ -d $Dir/$1 ];thencd $Dir/$1#startTime=$(ls -l composer.lock|awk '{print $6,$7,$8}')git fetchgit checkout $2git pull origin $2cp .env.develop .envcomposer installIF_TRUE $1 $2 $3#fi/usr/local/php7/bin/php artisan queue:restartIF_TRUE $1 $2 $3echo $1 " Success"elsecd $Dirgit clone git@example.com:${3}/${1}.gitcd ${1}git checkout $2cp .env.develop .envcomposer installIF_TRUE $1 $2 $3/usr/local/php7/bin/php artisan queue:restartIF_TRUE $1 $2 $3fi
}
master $1 $2 $3

web组shell脚本

  • 测试环境shell更新脚本
#!/bin/bash#定义文件目录
Dir="/var/www/html"
EnvirmentJs="/var/www/html/ucarCarWeb/src/js/environment.js.develop"
DirEnvirJs="/var/www/html/ucarCarWeb/src/js/environment.js"
EnjoyJsDe="/var/www/html/EnjoyCarWeb/src/config/environment.js.develop"
EnjoyJs="/var/www/html/EnjoyCarWeb/src/config/environment.js"
function pull_say() {PullDir=$1if [ $? -ne 0 ];thenecho "$PullDir Git Pull Error"fi
}
echo 'start'
if [ $1 == "EnjoyCarWeb" ];thencd $Dir/EnjoyCarWebstartTime=$(ls -l package.json|awk '{print $6,$7,$8}')JstartTime=$(ls -l $EnjoyJsDe|awk '{print $6,$7,$8}')#拉取项目代码git pull origin develop/v1.3.4pull_saystopTime=$(ls -l package.json|awk '{print $6,$7,$8}')JstopTime=$(ls -l $EnjoyJsDe|awk '{print $6,$7,$8}')if [ "$JstartTime" != "$JstopTime" ];thencp $EnjoyJsDe $EnjoyJsfi#编译代码if [ "$startTime" != "$stopTime" ];thenrm -f package-lock.json/usr/bin/npm install/usr/bin/node build/build.jselse/usr/bin/node build/build.jsfiecho $1 "Success"elif [ $1 == "ucarCarWeb" ];thencd $Dir/ucarCarWebstartTime=$(ls -l package.json|awk '{print $6,$7,$8}')JstartTime=$(ls -l $EnvirmentJs|awk '{print $6,$7,$8}')git pull origin developpull_saystopTime=$(ls -l package.json|awk '{print $6,$7,$8}')JstopTime=$(ls -l $EnvirmentJs|awk '{print $6,$7,$8}')if [ "$startTime" != "$stopTime" ];thenrm -f package-lock.json/usr/bin/npm install/usr/bin/node build/build.jselse/usr/bin/node build/build.jsfiif [ "$JstartTime" != "$JstopTime" ];thencp $EnvirmentJs $DirEnvirJsfiecho $1 "Success"fi
echo "Complate.."

开发分支和预算线分支与上面大致相同,这里就不贴出来了

ELK服务器配置

请点击ELK实时分析之php的laravel项目日志


效果展示

  • gitlab合并请求推送至钉钉

  • nginx访问url钉钉推送

  • ELK展示php错误日志


总结

  • 并非所有项目都需要自动部署,我司线上环境是通过git tag,然后使用灰度发布脚本手动发布。常用脚本在我github上:github地址
  • 我司另一个项目因为用到了java和客户端app,现在测试使用Jenkins的另一套自动化流程方案,届时我再总结出来。

喜欢我写的东西的朋友可以关注一下我的公众号,上面有我的学习资源以及一些其他福利。:Devops部落

转载于:https://my.oschina.net/dingxiaoshui/blog/2998821

初创团队持续集成的落地与实现(gitlab+python)相关推荐

  1. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

    Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...

  2. python 持续集成_使用jenkins和Gitlab进行Python项目的持续集成

    一.安装Jenkins 1.1 我的系统环境: Linux: Centos7.6 python: 2.7 java: 1.8 firewall-cmd: not running 1.2 两种方法,推荐 ...

  3. 可落地微服务on k8s的持续集成/部署方案

    我们隔一流的软件生产工艺还有多远?在距离15000公里外,Amazon一年可以进行5000万次部署,在这一边某电商平台的研发部门里,让他们引以为傲的是他们正在进行"敏捷"开发模式, ...

  4. Jenkins持续集成入门到精通

    Jenkins持续集成入门到精通 文章目录 Jenkins持续集成入门到精通 1. 持续集成及Jenkins介绍 1.1 软件开发生命周期 1.2 软件开发瀑布模型 1.3 软件的敏捷开发 1.3.1 ...

  5. 从服务器基础环境配置到搭建Docker+Gitlab+Gitlab Runner,完整介绍Spring Boot项目的持续集成与持续交付具体实现!

    1. 序言 在大学的课程学习,非常注重团队协作的培养,在企业开发中,团队协作开发项目的场景更是甚多.另外,在当下的热门技术栈中,微服务开发模式.前后端分离开发模式逐渐盛行,Spring Boot.VU ...

  6. 持续集成(CI)系统

    持续集成(CI)系统 gitlab.gerrit.jenkins三大系统整体框架 开发本地从gerrit下载代码进行开发后将代码git push review到Gerrit系统上, Jenkins 在 ...

  7. 测试角色管理--持续集成专家岗(虚拟)

    本文在研发组织管理中的位置: 研发组织管理--角色管理--QA--持续集成专家岗(虚拟) 定位: 管理除"项目功能测试自动化用例"本身以外的所有自动化工作,帮助整个测试团队设置并且 ...

  8. 基于Docker容器的,Jenkins、GitLab构建持续集成CI

    ** 开发者将代码提交(push)到GitLab后,GitLab通过Hook通知jenkins,jenkins自动从GitLab中获取项目最新的源码进行集成和发布. 基于Docker,创建一个私有Gi ...

  9. jenkins+Docker+springcloud微服务持续集成

    流程说明 本地部署 微服务是可以独立部署的,如果不借助spring-boot-maven插件,package出来的jar包是不能运行的. 借助spring-boot-maven插件package出来的 ...

最新文章

  1. 用node写一个命令行工具
  2. java list 速度_Java中的List你真的会用吗?不会用的话请收藏我的这篇文章
  3. 优先级调度算法实现_「kernel」 - 磁盘IO调度算法
  4. Autofac在.NET Core 中的使用
  5. 【数据结构算法】二:上三角、下三角中求数组地址--【下标的计算】
  6. JS使用技巧2——momentjs太重了吗?试试dayjs和miment吧
  7. 企业运维经典面试题汇总(4)
  8. MFC开发之显示网页
  9. Oracle的MD5函数介绍
  10. 【排障】为什么你发出去的邮件被退回
  11. 【JZOJ 2499】【NOIP2011模拟7.28】东风谷早苗 (模拟)
  12. Hoeffding's lemma证明
  13. word文档删除空白页
  14. 如何在微信小程序里面退出小程序
  15. Codeforces Round #649 D. Ehab‘s Last Corollary 【思维,二分图,环】
  16. 左倾红黑树——左倾2-3树(不是jdk1.8的TreeMap的红黑树)
  17. Ceph性能优化 之 配置参数调优
  18. python3 格式化字符串 f-string 介绍
  19. MVC中View与后台多次交互操作
  20. jvm性能调优工具 jhat

热门文章

  1. python3环境变量_配置环境变量切换到python3.7
  2. Natasha V1.3.6.0 的升级日志
  3. Sql server时间转时间long
  4. linux100day(day3)--常用文本处理命令和vim文本编辑器
  5. 公务员注册账号,密码
  6. WebSocket安卓客户端实现详解(一)–连接建立与重连
  7. mac终端命令行总结
  8. 【BZOJ 4555】 4555: [Tjoi2016Heoi2016]求和 (NTT)
  9. python--json pickle 模块
  10. PHP通过文件存储来实现缓存