生活随笔
收集整理的這篇文章主要介紹了
初创团队持续集成的落地与实现(gitlab+python)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
持續(xù)集成概念
持續(xù)集成是一種軟件開發(fā)實(shí)踐,即團(tuán)隊(duì)開發(fā)成員經(jīng)常集成他們的工作,通過(guò)每個(gè)成員每天至少集成一次,也就意味著每天可能會(huì)發(fā)生多次集成。每次集成都通過(guò)自動(dòng)化的構(gòu)建(包括編譯,發(fā)布,自動(dòng)化測(cè)試)來(lái)驗(yàn)證,從而盡早地發(fā)現(xiàn)集成錯(cuò)誤。 --馬丁福勒
git工作分支
持續(xù)集成的前提必須要有一個(gè)健壯且分明的版本工具,毫無(wú)疑問(wèn)我們這里使用git作為版本工具
這里只簡(jiǎn)單說(shuō)一下各個(gè)分支的作用,想了解更多關(guān)于git工作流知識(shí),請(qǐng)點(diǎn)擊深入理解學(xué)習(xí)Git工作流
- feature/* 功能分支,用于一個(gè)新的功能的開發(fā)
- hotfix/* 熱修復(fù)分支,用于對(duì)線上環(huán)境的bug熱修復(fù)
- develop/* 測(cè)試分支,測(cè)試環(huán)境對(duì)應(yīng)的分支
- master分支,預(yù)上線環(huán)境分支
對(duì)于hotfix和feature分支允許開發(fā)者push,對(duì)于develop和master分支只允許開發(fā)者merge。
本文原理分析圖示
- 首先開發(fā)者完成代碼后git push到gitlab服務(wù)器,通過(guò)gitlab上事先設(shè)定好的系統(tǒng)鉤子來(lái)觸發(fā)一個(gè)post請(qǐng)求到后端的webserver服務(wù)器。
- 后端webserver服務(wù)器收到請(qǐng)求后通過(guò)gitlabCI.py分析來(lái)源分支與項(xiàng)目組,然后交給不同的shell腳本處理。
- 通過(guò)shell腳本來(lái)更新不同環(huán)境的項(xiàng)目代碼,如果是開發(fā)分支的話還需要配置nginx并推送訪問(wèn)url至釘釘。
- ELK服務(wù)器監(jiān)控php的項(xiàng)目報(bào)錯(cuò)日志,開發(fā)者通過(guò)查看然后及時(shí)進(jìn)行debug。
webserver對(duì)git請(qǐng)求的具體處理圖示
開發(fā)環(huán)境(dev_branch)處理流程
對(duì)于hotfix/* 或者 feature/*
- git push事件 觸發(fā)gitlab鉤子,然后gitlabCI腳本通過(guò)條件檢測(cè),執(zhí)行開發(fā)分支的shell腳本
- shell腳本拉去對(duì)應(yīng)的功能分支或者熱修復(fù)分支,然后拷貝一份nginx模板配置文件,修改對(duì)應(yīng)的域名和目錄。
- 重載nginx配置文件并將訪問(wèn)連接推送至釘釘群。
gitlab服務(wù)器配置
webserver配置
配置gitlab處理腳本
這里只貼出部分代碼只供參考,因?yàn)榫唧w需求可能不同,這里就拋磚引玉。
- gitlabCI.py 用于處理gitlab的事件請(qǐng)求
#!/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項(xiàng)目名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':#預(yù)上線分支if ref == 'master':cmd = './itmaster.sh ' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)# 測(cè)試分支elif ref == 'develop':cmd = './itdevelop.sh ' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)#開發(fā)分支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)# 開發(fā)分支elif hostfix.match(ref) and feature.match(ref):cmd = './webOwn.sh' + project + ref + ' ' + namespaces = subprocess.getoutput(cmd)return Response(s)elif name =='merge_request':#可以定義一個(gè)釘釘推送,每次直接點(diǎn)開鏈接就能直達(dá)gitlab合并界面passelse:return Response('未觸發(fā)事件')if __name__ == '__main__':app.run()
將不同的請(qǐng)求分發(fā)至不同shell腳本來(lái)處理
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腳本
#!/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}')#拉取項(xiàng)目代碼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.."
開發(fā)分支和預(yù)算線分支與上面大致相同,這里就不貼出來(lái)了
ELK服務(wù)器配置
請(qǐng)點(diǎn)擊ELK實(shí)時(shí)分析之php的laravel項(xiàng)目日志
效果展示
-
gitlab合并請(qǐng)求推送至釘釘
-
nginx訪問(wèn)url釘釘推送
-
ELK展示php錯(cuò)誤日志
總結(jié)
- 并非所有項(xiàng)目都需要自動(dòng)部署,我司線上環(huán)境是通過(guò)git tag,然后使用灰度發(fā)布腳本手動(dòng)發(fā)布。常用腳本在我github上:github地址
- 我司另一個(gè)項(xiàng)目因?yàn)橛玫搅薺ava和客戶端app,現(xiàn)在測(cè)試使用Jenkins的另一套自動(dòng)化流程方案,屆時(shí)我再總結(jié)出來(lái)。
喜歡我寫的東西的朋友可以關(guān)注一下我的公眾號(hào),上面有我的學(xué)習(xí)資源以及一些其他福利。:Devops部落
轉(zhuǎn)載于:https://my.oschina.net/dingxiaoshui/blog/2998821
總結(jié)
以上是生活随笔為你收集整理的初创团队持续集成的落地与实现(gitlab+python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。