DevOps實(shí)踐-SCM代碼倉庫管理

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上


DevOpsMaster白皮書
DevOps體系

還有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)容。

DevOps目標(biāo)

技術(shù)選型

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

SCM對(duì)比

對(duì)于可以私有化部署,并且支持更好的公司協(xié)作。費(fèi)用又較低的只有Gitlab可以滿足要求。GitHub,BitBucket可以私有化部署,可以支持很多功能,有完善的工具鏈。但Gitlab的開源協(xié)議是MIT License。并且GitLab在企業(yè)內(nèi)部的使用率也很高。

技術(shù)實(shí)踐

直接使用Docker鏡像進(jìn)行安裝。使用omnibus-gitlabdocker-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ù)的工作。這里在介紹一下本地備份的方式:

  1. 編輯/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秒)
  1. 執(zhí)行備份命令
gitlab-rake gitlab:backup:create
  1. 設(shè)置定時(shí)備份(cron)
0 0,6,12,18 * * * /bin/bash -x /data/gitlab/backups/gitlab_backup.sh > /dev/null 2>&1
  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倉庫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容