DevOps實(shí)踐系列文章,請(qǐng)參見連接。
背景
人在不同的階段對(duì)于同一件事會(huì)有不同的理解。而且每個(gè)人都來說個(gè)人方向選擇、精力與經(jīng)歷都左右著對(duì)同一件事情的理解。所以,
三人行,則必有我?guī)?。是故弟子不必不如師,師不必賢于弟子,聞道有先后,術(shù)業(yè)有專攻,如是而已。 --《師說》韓愈
抱著開放的心態(tài)學(xué)習(xí)每一個(gè)比你優(yōu)秀的人的優(yōu)點(diǎn)。就是我們這些軟件從業(yè)者應(yīng)該做的。抱著為軟件業(yè)做一份貢獻(xiàn)的執(zhí)著的心情,持續(xù)得在這個(gè)行業(yè)里鉆研和研究。
在軟件公司之間最大的差別是什么?最大的差別在于公司的文化。不管是工程師文化、敏捷文化、精益MVP文化、商業(yè)目標(biāo)文化,都是為了公司更好的發(fā)展以及在行業(yè)內(nèi)與其他競品進(jìn)行競爭。這個(gè)文化最大的指導(dǎo)意義是指導(dǎo)軟件團(tuán)隊(duì)的可靠性與效率。
對(duì)于完整的DevOps體系來說普元的王海龍的這張圖可以非常完整的說明整個(gè)DevOps中所有的方面的內(nèi)容:
在DevOpsMaster上


還有DevOps工具集的集合:

介紹
對(duì)于公司內(nèi)部軟件公司內(nèi)部比較重要的幾件事:業(yè)務(wù)方案,軟件過程,技術(shù)方案,基礎(chǔ)設(shè)施。
對(duì)于SCM(Source Contronl Management)來說應(yīng)該在DevOps中的位置可以在上面看到,SCM是用來支撐DevOps的基礎(chǔ)設(shè)施。它為DevOps流程提供最基礎(chǔ)的原材料(代碼)的管理工作。所以在SCM之上我們應(yīng)該追求的更多,最求滿足各個(gè)層面的要求。要支持業(yè)務(wù)方案的變化,要支持軟件過程,要支持技術(shù)方案管理,要支持基礎(chǔ)設(shè)施的配置管理。并且要支持團(tuán)隊(duì)的工作量化,質(zhì)量量化,效率改進(jìn)等內(nèi)容。

技術(shù)選型
在軟件業(yè)界有各個(gè)方面可以提供代碼托管服務(wù),并且很多代碼托管系統(tǒng)都可以與云設(shè)備進(jìn)行深度的融合工作。深度融合后的代碼托管服務(wù)在加上《一切即代碼》理念,就可以管理代碼、依賴、編譯、配置、流程、設(shè)備等。下面對(duì)代碼托管服務(wù)進(jìn)行技術(shù)選型評(píng)比:

對(duì)于可以私有化部署,并且支持更好的公司協(xié)作。費(fèi)用又較低的只有Gitlab可以滿足要求。GitHub,BitBucket可以私有化部署,可以支持很多功能,有完善的工具鏈。但Gitlab的開源協(xié)議是MIT License。并且GitLab在企業(yè)內(nèi)部的使用率也很高。
技術(shù)實(shí)踐
直接使用Docker鏡像進(jìn)行安裝。使用omnibus-gitlab的docker-compose.yml直接啟動(dòng)Docker即可。
-
Git協(xié)議端口修改
中間需要注意的是,因?yàn)镚it使用了SSH的端口,需要將SSH的端口修改為其他端口。將TCP22留給SSH使用。
-
備份工作
配置備份與鏡像方式。在每個(gè)Git倉庫中進(jìn)行Mirroring的配置即可,但是需要每個(gè)項(xiàng)目獨(dú)立配置。在使用過程中因?yàn)槭褂胕nvalid multibyte char (US-ASCII),在網(wǎng)上搜索后發(fā)現(xiàn)是因?yàn)橹形膯栴}不能處理導(dǎo)致。所以重新進(jìn)行Docker build:
FROM gitlab/gitlab-ce
MAINTAINER GitLab Inc. <support@gitlab.com>
SHELL ["/bin/sh", "-c"],
# Install required packages
RUN apt-get update -q \
&& DEBIAN_FRONTEND=noninteractive yum groupinstall -y chinese-support
&& rm -rf /var/lib/apt/lists/* \
# Default to supporting utf-8
ENV LANG=en_US.UTF-8
配置并設(shè)置好語言后發(fā)現(xiàn)仍不可用。已經(jīng)不報(bào)錯(cuò)了,但是同步一直沒有結(jié)束。另外在檢查Gitlab API時(shí)沒有關(guān)于調(diào)用Mirror同步的API。所以,這里不考慮這種方式進(jìn)行同步。
使用最原始的同步方式Git命令的方式進(jìn)行同步。在使用Python(Pexpect)進(jìn)行命令執(zhí)行進(jìn)行大量的Git倉庫同步。
#-*- coding: UTF-8 -*
import os
import sys
import base64
import pexpect
import traceback
import subprocess
mirror_git_base_addr='http://外網(wǎng)備份地址/'
master_git_base_addr='http://內(nèi)網(wǎng)地址/'
def setOriginRemote(item, url):
print 'set remote', item, url
command = 'git remote set-url origin '+url
try:
popen = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, universal_newlines=True)
result = None
while result is None:
result = popen.poll()
print "set url status", result
except:
pass
traceback.print_exc()
def gitPull(item):
print 'git pull', item
git_addr = master_git_base_addr+item+".git"
setOriginRemote(item, git_addr)
command = 'git fetch --tags --progress ' + git_addr + ' +refs/heads/*:refs/remotes/origin/*'
print command
child = pexpect.spawn(command)
try:
print "child logfile"
child.logfile = sys.stdout
print "set username"
child.expect('Username')
child.sendline('用戶名')
print "set password"
child.expect('Password')
child.sendline('密碼')
child.expect(pexpect.EOF, timeout=None)
except:
traceback.print_exc()
pass
def gitPush(item):
git_addr = mirror_git_base_addr+item+".git"
setOriginRemote(item, git_addr)
command = "git push origin 'refs/remotes/origin/*:refs/heads/*'"
child = pexpect.spawn(command)
try:
child.logfile = sys.stdout
child.expect('Username')
child.sendline('用戶名')
child.expect('Password')
child.sendline('密碼')
child.expect(pexpect.EOF, timeout=None)
except:
#print(str(child))
# print ''
traceback.print_exc()
# print ''
pass
def syncGitToMirror(item):
print 'syncGitToMirror', item
gitPull(item)
gitPush(item)
if __name__ == '__main__':
currentDir = os.getcwd()
projects = ['Requirement', 'Business', 'Deploy']
for item in projects:
os.chdir(item)
syncGitToMirror(item)
os.chdir(currentDir)
-
本地備份
可以選擇多種方式進(jìn)行備份與恢復(fù)的工作。這里在介紹一下本地備份的方式:
- 編輯/etc/gitlab/gitlab.rb
gitlab_rails['manage_backup_path'] = true
gitlab_rails['backup_path'] = "/data/gitlab/backups" //gitlab備份目錄
gitlab_rails['backup_archive_permissions'] = 0644 //生成的備份文件權(quán)限
gitlab_rails['backup_keep_time'] = 7776000 //備份保留天數(shù)為3個(gè)月(即90天,這里是7776000秒)
- 執(zhí)行備份命令
gitlab-rake gitlab:backup:create
- 設(shè)置定時(shí)備份(cron)
0 0,6,12,18 * * * /bin/bash -x /data/gitlab/backups/gitlab_backup.sh > /dev/null 2>&1
- 恢復(fù)備份
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-ctl status
# 文件名前半部,如下所示
gitlab-rake gitlab:backup:restore BACKUP=1568640014_2019_09_16_12.1.4
總結(jié)
Gitlab在公司內(nèi)部使用基本上已經(jīng)替代了SVN的管理。并且提供了Git的很多敏捷功能支持。不過在這個(gè)過程中需要考慮怎樣提供部署級(jí)的高可用和高性能。需要有自行處理。這個(gè)時(shí)候就可以很好的設(shè)計(jì)與完善系統(tǒng)。
每一項(xiàng)技術(shù)都有自己的優(yōu)缺點(diǎn),需要選擇技術(shù)的優(yōu)點(diǎn)。規(guī)避技術(shù)缺陷,這個(gè)時(shí)候需要有能力平衡這些有缺點(diǎn)。才能形成完善的技術(shù)解決方案。
參考
大話微服務(wù)與DevOps
【第八期金融CIO論壇】DevOps時(shí)代合伙人張樂:大型互聯(lián)網(wǎng)公司金融項(xiàng)目DevOps轉(zhuǎn)型實(shí)踐
萬達(dá)網(wǎng)絡(luò)科技的DevOps平臺(tái)架構(gòu)解析
加速企業(yè)敏捷的DevOps平臺(tái)
Periodic Table of DevOps Tools (v3)
Devops時(shí)代,騰訊阿里的運(yùn)維實(shí)踐(附Devops58個(gè)開源工具)
DevOps,研發(fā)運(yùn)營一體化的時(shí)代已到來
Gitlab備份和恢復(fù)操作記錄
實(shí)用運(yùn)維之gitlab主從實(shí)時(shí)同步
使用Mirroring同步主從Gitlab數(shù)據(jù)
使用gitlab-mirrors從其它版本庫同步代碼
使用GitLab Mirrors同步Git倉庫