1. 程式人生 > >部署GitLab程式碼託管倉庫

部署GitLab程式碼託管倉庫

GitLab 是一個用於倉庫管理系統的開源專案,使用Git作為程式碼管理工具,GitLab是使用Ryby開發的一個開源的版本管理系統,實現一個自託管的Git專案倉庫,可通過Web介面進行訪問公開的或者私人專案.它擁有與Github類似的功能,能夠瀏覽原始碼,管理缺陷和註釋.可以管理團隊對倉庫的訪問,它非常易於瀏覽提交過的版本並提供一個檔案歷史庫.團隊成員可以利用內建的簡單聊天程式(Wall)進行交流.它還提供一個程式碼片段收集功能可以輕鬆實現程式碼複用,便於日後有需要的時候進行查詢,本博文內容將介紹Git,GitLab,的區別以及SVN與GitLab的差異,然後就是通過Yum包快速的搭建一個GitLab環境.

Git 與 SVN 區別點

1、GIT是分散式的,SVN不是:這是GIT和其它非分散式的版本控制系統,例如SVN,CVS等,最核心的區別.
2、GIT把內容按元資料方式儲存,而SVN是按檔案:所有的資源控制系統都是把檔案的元資訊隱藏在一個類似.svn,.cvs等的資料夾裡.
3、GIT分支和SVN的分支不同:分支在SVN中一點不特別,就是版本庫中的另外的一個目錄.
4、GIT沒有一個全域性的版本號,而SVN有:目前為止這是跟SVN相比GIT缺少的最大的一個特徵.
5、GIT的內容完整性要優於SVN:GIT的內容儲存使用的是SHA-1雜湊演算法.這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞.

大部分公司的處理流程如下:

PM在gitlab建立任務,分配給開發人員.
開發人員領取任務後,在本地使用git clone拉取程式碼庫.
開發人員建立開發分支(git checkout -b dev)並進行開發.
開發人員完成之後,提交到本地倉庫(git commit).
開發人員在gitlab介面上申請分支合併請求(Merge request).
PM在gitlab上檢視提交和程式碼修改情況,確認無誤後,確認將開發人員的分支合併到主分支(master).
開發人員在gitlab上Mark done確認開發完成,並關閉issue.

搭建GitLab

1.安裝依賴包檔案從10.x以後開始依賴policycoreutils-python.

[[email protected] ~]# yum install -y curl openssh openssh-server openssh-clients postfix cronie policycoreutils-python

Package curl-7.29.0-51.el7.x86_64 already installed and latest version
Package openssh-7.4p1-16.el7.x86_64 already installed and latest version
Package openssh-server-7.4p1-16.el7.x86_64 already installed and latest version
Package openssh-clients-7.4p1-16.el7.x86_64 already installed and latest version
Package 2:postfix-2.10.1-7.el7.x86_64 already installed and latest version
Package cronie-1.4.11-20.el7_6.x86_64 already installed and latest version
Package policycoreutils-python-2.5-29.el7.x86_64 already installed and latest version
Nothing to do

[[email protected] ~]# systemctl restart postfix && systemctl enable postfix

2.通過下載一個RPM包來安裝,GitLab實在不需要原始碼安裝,步驟很噁心.

[[email protected] ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-CE-10.0.0-ce.0.el7.x86_64.rpm
[[email protected] ~]# rpm -ivh gitlab-ce-10.0.0-ce.0.el7.x86_64.rpm

3.修改gitlab的配置檔案/etc/gitlab/gitlab.rb編輯如下.

[[email protected] ~]# vim /etc/gitlab/gitlab.rb

external_url 'http://192.168.1.5'  #指定域名或者本機IP

4.使用gitlab-ctl reconfigure自動安裝資料庫,初始化資訊,初始化配置時間較長.

[[email protected] ~]# gitlab-ctl reconfigure

5.使用gitlab-ctl start啟動GitLab服務,如下所示.

[[email protected] ~]# gitlab-ctl start
[[email protected] ~]# netstat -antp |grep "80"

6.修改配置檔案,新增smtp郵件功能,此處我們直接拷貝到最後一行就行.

[[email protected] ~]# vim /etc/gitlab/gitlab.rb

gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = '[email protected]'
gitlab_rails['gitlab_email_display_name'] = 'Admin'
gitlab_rails['gitlab_email_reply_to'] = '[email protected]'
gitlab_rails['gitlab_email_subject_suffix'] = '[gitlab]'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 25 
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "password"
gitlab_rails['smtp_domain'] = "domain.cn"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
user['git_user_email'] = "[email protected]"

7.重新配置GitLab,重啟服務,後期也可以使用這些命令管理GitLab.

[[email protected] ~]# gitlab-ctl reconfigure
[[email protected] ~]# gitlab-ctl restart

8.使用gitlab-rails console命令進行傳送郵件測試,如下所示.

[[email protected] ~]# gitlab-rails console

Loading production environment (Rails 4.2.10)
irb(main):001:0>  Notify.test_email('[email protected]', 'Message Subject', 'Message Body').deliver_now

Notify#test_email: processed outbound mail in 2219.5ms

Sent mail to [email protected] (2469.5ms)
Date: Fri, 04 May 2018 15:50:10 +0800
From: Admin <[email protected]>
Reply-To: Admin <[email protected]>
To: [email protected]
Message-ID: <[email protected]>
Subject: Message Subject
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Message Body</p></body></html>

=> #<Mail::Message:70291731344240, Multipart: false, Headers: <Date: Fri, 04 May 2018 15:50:10 +0800>, <From: Admin <[email protected]>>, <Reply-To: Admin <[email protected]>>, <To: [email protected]>, <Message-ID: <[email protected]>>, <Subject: Message Subject>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
irb(main):002:0>quit

9.此處就配置好了,訪問一下Web頁面看看吧.

[[email protected] ~]# curl http://192.168.1.5 

使用者名稱root   密碼:自己設定

10.忘記密碼後的找回,可以參考一下內容.

[[email protected] ~]# gitlab-rails console production

irb(main):001:0> user = User.where(id: 1).first  #id為1的是超級管理員
irb(main):002:0>user.password = 'yourpassword'   #密碼必須至少8個字元
irb(main):003:0>user.save!                       #如沒有問題 返回true


Git的使用技巧

推送檔案內容: 如果想要推送檔案到指定倉庫,可執行以下操作.

[[email protected] ~]# cd /public
[[email protected] ~]# git init
[[email protected] ~]# git add .

[[email protected] ~]# git commit -m "專案描述"
[[email protected] ~]# git remote add origin https://192.168.1.5/使用者名稱/專案名.git
[[email protected] ~]# git push -f origin master

檔案的提交(標準): 在客戶端上進行如下操作,將客戶端檔案上傳到GitLab的倉庫.

[[email protected] ~]# git global setup
[[email protected] ~]# git config --global user.name "使用者名稱"
[[email protected] ~]# git config --global user.email "郵箱"
[[email protected] ~]# git clone https://192.168.1.5/使用者名稱/專案名.git

[[email protected] ~]# cd 專案名
[[email protected] ~]# git add .
[[email protected] ~]# git commit -m "專案描述"
[[email protected] ~]# git push -u origin master

遠端倉庫相關命令:

[[email protected] ~]# git clone git://github.com/lyshark/lyshark.git  #克隆遠端倉庫
[[email protected] ~]# git remote -v                                   #檢視遠端倉庫
[[email protected] ~]# git remote add [name] [url]                     #新增遠端倉庫
[[email protected] ~]# git remote rm [name]                            #刪除遠端倉庫
[[email protected] ~]# git remote set-url --push [name] [newUrl]       #修改遠端倉庫
[[email protected] ~]# git pull [remoteName] [localBranchName]         #拉取遠端倉庫
[[email protected] ~]# git push [remoteName] [localBranchName]         #推送遠端倉庫

[[email protected] ~]# git push origin test:master                     #提交本地test作為遠端的master分支
[[email protected] ~]# git push origin test:test                       #提交本地test作為遠端的test分支

分支(branch)操作相關命令

[[email protected] ~]# git branch                     #檢視本地分支
[[email protected] ~]# git branch [name]              #檢視分支
[[email protected] ~]# git branch -r                  #檢視遠端分支
[[email protected] ~]# git checkout [name]            #切換分支
[[email protected] ~]# git checkout -b [name]         #建立新分支並立即切換到新分支

[[email protected] ~]# git branch -d [name]           #刪除分支
[[email protected] ~]# git merge [name]               #合併分支
[[email protected] ~]# git push origin [name]         #建立遠端分支(本地分支push到遠端)
[[email protected]calhost ~]# git push origin :heads/[name]  #刪除遠端分支

版本(tag)操作相關命令

[[email protected] ~]# git tag                           #檢視版本
[[email protected] ~]# git tag [name]                    #建立版本
[[email protected] ~]# git tag -d [name]                 #刪除版本
[[email protected] ~]# git tag -r                        #檢視遠端版本
[[email protected] ~]# git push origin [name]            #建立遠端版本(本地版本push到遠端)
[[email protected] ~]# git push origin :refs/tags/[name] #刪除遠端版本
[[email protected] ~]# git pull origin --tags            #合併遠端倉庫的tag到本地
[[email protected] ~]# git push origin --tags            #上傳本地tag到遠端倉庫
[[email protected] ~]# git tag -a [name] -m '描述'       #建立帶註釋的tag

Git常用命令彙總

[[email protected] ~]# git branch                        #檢視本地所有分支
[[email protected] ~]# git status                        #檢視當前狀態 
[[email protected] ~]# git commit                        #提交
[[email protected] ~]# git branch -a                     #檢視所有的分支
[[email protected] ~]# git branch -r                     #檢視本地所有分支
[[email protected] ~]# git commit -am "init"             #提交併且加註釋 
[[email protected] ~]# git push origin master            #將檔案給推到伺服器上 
[[email protected] ~]# git remote show origin            #顯示遠端庫origin裡的資源 
[[email protected] ~]# git push origin master:develop    #將本地庫與伺服器上的庫進行關聯 

[[email protected] ~]# git checkout --track origin/dev   #切換到遠端dev分支
[[email protected] ~]# git branch -D master develop      #刪除本地庫develop
[[email protected] ~]# git checkout -b dev               #建立一個新的本地分支dev
[[email protected] ~]# git merge origin/dev              #將分支dev與當前分支進行合併
[[email protected] ~]# git checkout dev                  #切換到本地dev分支
[[email protected] ~]# git remote show                   #檢視遠端庫

[[email protected] ~]# git add .
[[email protected] ~]# git rm 檔名(包括路徑)             #從git中刪除指定檔案
[[email protected] ~]# git config --list                  #看所有使用者
[[email protected] ~]# git ls-files                       #看已經被提交的
[[email protected] ~]# git rm [file name]                 #刪除一個檔案

[[email protected] ~]# git commit -a                      #提交當前repos的所有的改變
[[email protected] ~]# git add [file name]                #新增一個檔案到git index
[[email protected] ~]# git commit -v                      #看commit的差異
[[email protected] ~]# git commit -m "commit"             #新增commit資訊
[[email protected] ~]# git commit -a -a是代表add           #把所有的change加到git index裡然後再commit
[[email protected] ~]# git commit -a -v                   #一般提交命令

[[email protected] ~]# git log                            #看你commit的日誌
[[email protected] ~]# git diff                           #檢視尚未暫存的更新
[[email protected] ~]# git rm a.a                         #移除檔案(從暫存區和工作區中刪除)
[[email protected] ~]# git rm --cached a.a                #移除檔案(只從暫存區中刪除)
[[email protected] ~]# git commit -m "remove"             #移除檔案(從Git中刪除)
[[email protected] ~]# git rm -f a.a                      #強行移除修改後檔案(從暫存區和工作區中刪除)
[[email protected] ~]# git diff --cached                  #檢視尚未提交的更新
[[email protected] ~]# git stash push                     #將檔案給push到一個臨時空間中
[[email protected] ~]# git stash pop                      #將檔案從臨時空間pop下來


SVN伺服器搭建(拓展)

SubVersion(簡稱SVN)是一款自由開放的版本控制軟體,SubVersion可以管理檔案,資料夾以及記錄它們的修改狀況.Subversion常用來幫助我們管理軟體開發的原始碼或是公司手冊文件.Subversion通過將文件匯入至版本庫中進行管理,版本庫類似於檔案伺服器,但比檔案伺服器更強大的是,它可以記錄使用者每一次對檔案或目錄的修改狀況,並提供還原資料至老版本的功能,版本控制對於軟體開發而言是至關重要的,現在的軟體開發一般作為專案進行,一個專案中會有很多人蔘與,那麼每個人手中都有自己的一份修改備份.

◆服務端搭建◆

1.通過YUM倉庫快速安裝SVN軟體,這種軟體無需編譯安裝.

[[email protected] ~]# yum install -y apr apr-util subversion

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package apr-1.4.8-3.el7_4.1.x86_64 already installed and latest version
Package apr-util-1.5.2-6.el7.x86_64 already installed and latest version
Package subversion-1.7.14-14.el7.x86_64 already installed and latest version
Nothing to do

2.下面我們將在/var/svn/目錄下,建立一個my_project版本庫.

[[email protected] ~]# mkdir -p /var/svn
[[email protected] ~]# svnadmin create /var/svn/my_project           #建立一個專案

[[email protected] ~]# snvadmin hotcopy /var/svn/my_project ./back   #熱備份
[[email protected] ~]# svnadmin lslocks /var/svn/my_project          #列印描述資訊

[[email protected] ~]# ls -l /var/svn/
total 0
drwxr-xr-x. 6 root root 86 Dec 20 21:11 my_project

2.接著我們將本地/etc目錄下的資源匯入至var/svn/my_project中,其中-m引數是描述資訊.

[[email protected] ~]# svn import /etc file:///var/svn/my_project/ -m "Inital Data"
[[email protected] ~]# svn list file:///var/svn/my_project/      #列出版本庫中資料列表.

3.認證授權操作,伺服器會根據版本庫目錄下的./conf/svnserver.conf檔案進行許可權的控制.

[[email protected] ~]# vim /var/svn/my_project/conf/svnserve.conf

[general]
anon-access = none      #設定拒絕匿名訪問,此處可設定:none,read,write
auth-access = write     #經過認證的賬戶許可權為可寫入
password-db = passwd    #指定使用者名稱密碼存放路徑,該檔案在conf目錄
authz-db = authz        #指定基於路徑的訪問控制檔名
real = My Project       #設定版本庫域,如果相同域,則使用相同密碼驗證

4.配置一個passwd密碼檔案,預設在conf目錄下,寫入需要認證的使用者資料.

[[email protected] ~]# vim /var/svn/my_project/conf/passwd

[users]
harry = 123123     #使用者名稱為harry,密碼是123123
lyshark = 123123

5.接著我們來定義一下組的許可權配置列表,與組的管理員列表.

[[email protected] ~]# vim /var/svn/my_project/conf/authz

[groups]
admins = harry,lyshark     #定義組,組內成員有harry,lyshark
[/]                        #對版本庫根路徑設定許可權
@admins = rw               #組內成員具有讀寫許可權
* = r                      #其他所有人只有只讀許可權

6.啟動svnserver伺服器,並通過-r選項指定一個虛擬路徑.

[[email protected] ~]# svnserve -d --listen-port=3690 -r /var/svn/
[[email protected] ~]# netstat -antp |grep 3690
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      1474/svnserve

◆客戶端操作◆

克隆版本庫:/var/svn/my_project版本庫克隆一份到本地的./my_project目錄.

[[email protected] ~]# svn checkout file:///var/svn/my_project/ ./my_project
[[email protected] ~]# svn co svn://192.168.1.5/my_project ./my_project

釋出資料: 將本地工作副本./my_project修改後的內容釋出到版本庫中.

[[email protected] ~]# svn commit -m "My_project" ./my_project/
[[email protected] ~]# svn delete URL    #從版本庫刪除一個專案