gitlab介紹與操做

Gitlab

GitLab 是利用 Ruby on Rails 一個開源的版本管理系統,實現一個自託管的 Git 項目倉庫,可經過 Web 界面進行訪問公開的或者私人項目。
與 Github 相似,GitLab 可以瀏覽源代碼,管理缺陷和註釋。能夠管理團隊對倉庫的訪
問,它很是易於瀏覽提交過的版本並提供一個文件歷史庫。團隊成員能夠利用內置的簡單聊天程序(Wall)進行交流。
它還提供一個代碼片斷收集功能能夠輕鬆實現代碼複用,便於往後有須要的時候進行查找。
經常使用的網站:
官網:https://about.gitlab.com/
國內鏡像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

1.1 Gitlab安裝

安裝依賴
yum install curl policycoreutils openssh-server openssh-clients policycoreutils-python –y
下載安裝包
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.6.10-ce.0.el7.x86_64.rpm
安裝gitlab
rpm -ivh gitlab-ce-11.4.14-ce.0.el7.x86_64.rpm

1.1.1 Gitlab配置

GitLab 的默認配置文件爲於:/etc/gitlab/gitlab.rb,修改下圖所示的 external_url爲本機 IP 地址或者一個能夠訪問到本機的域名。

修改完配置文件後,使用gitlab-ctl reconfigure從新配置gitlab,html

1.1.2 啓動並訪問Gitlab

從新配置執行完畢後,使用gitlab-ctl restart重啓服務

使用10.0.0.11進行訪問,首次登錄會要求更改root用戶的密碼,更改完密碼以後以下
node

1.1.3 Gitlab關閉註冊功能

因爲咱們Gitlab系統是私有倉庫,通常用戶都是由管理員建立和分派的,因此咱們須要關閉註冊

使用 root 用戶登陸,點擊頁面上方的 Adminarea

進入管理員區域頁面,點擊頁面左側菜單欄下方的 Setting

進入 Settings 頁面,下拉頁面找到 Sign-up Restrictions 選項

取消 Sign-up enabled 選項前面的勾選,下拉到頁面的下方,點擊 Save 按鈕完成配
置。退回到系統的登陸頁面,發現已經沒有用戶註冊功能

python

1.2 Gitlab使用

1.2.1 經常使用命令

[root@ci-node1 tools]# gitlab-ctl status
run: alertmanager: (pid 37584) 346s; run: log: (pid 23944) 46279s
run: gitaly: (pid 37594) 346s; run: log: (pid 23907) 46282s
run: gitlab-monitor: (pid 37606) 345s; run: log: (pid 23895) 46282s
run: gitlab-workhorse: (pid 37616) 345s; run: log: (pid 23866) 46282s
run: logrotate: (pid 37626) 344s; run: log: (pid 23839) 46283s
run: nginx: (pid 37633) 344s; run: log: (pid 23840) 46283s
run: node-exporter: (pid 37639) 343s; run: log: (pid 23858) 46283s
run: postgres-exporter: (pid 37643) 343s; run: log: (pid 23943) 46280s
run: postgresql: (pid 37654) 342s; run: log: (pid 23823) 46284s
run: prometheus: (pid 37656) 342s; run: log: (pid 23913) 46281s
run: redis: (pid 37669) 341s; run: log: (pid 23824) 46284s
run: redis-exporter: (pid 37675) 341s; run: log: (pid 23894) 46282s
run: sidekiq: (pid 37683) 338s; run: log: (pid 23825) 46284s
run: unicorn: (pid 37695) 337s; run: log: (pid 23826) 46284s

gitlab-ctl start:啓動所有服務
gitlab-ctl restart:重啓所有服務
gitlab-ctl stop:中止所有服務
gitlab-ctl reconfigure:使配置文件生效(通常修改完主配置文件/etc/gitlab/gitlab.rb,須要執行此命令)
gitlab-ctl show-config :驗證配置文件
gitlab-ctl uninstall:刪除gitlab(保留數據)
gitlab-ctl cleanse:刪除全部數據,重新開始
gitlab-ctl tail 查看服務的日誌 nginx

1.2.2 Gitlab經常使用組件

GitLab 由主要由如下服務構成,他們共同承擔了 Gitlab 的運做須要git

nginx:靜態Web服務器
gitlab-shell:用於處理Git命令和修改authorized keys列表,咱們的gitlab是以Git作爲最層的,你操做實際上最後就是調用gitlab-shell命令進行處理。
gitlab-workhorse:輕量級的反向代理服務器
logrotate:日誌文件管理工具
postgresql:數據庫
redis:緩存數據庫
sidekiq:用於在後臺執行隊列任務(異步執行)
unicorn:GitLab Rails應用是託管在這個服務器上面的

1.2.3 Gitlab基礎目錄

/var/opt/gitlab/git-data/repositories:庫默認存儲目錄
/opt/gitlab:            應用代碼和相應的依賴程序
/var/opt/gitlab:gitlab-ctl reconfigure命令編譯後的應用數據和配置文件,不須要人爲修改配置
/etc/gitlab:    配置文件目錄
/var/log/gitlab:此目錄下存放了gitlab各個組件產生的日誌
/var/opt/gitlab/backups/:備份文件生成的目錄

1.3 Gitlab倉庫管理

GitLab 是經過組(group)的概念來統一管理倉庫(project)和用戶(user),經過建立組,在組下再建立倉庫,再將用戶加入到組,從而實現用戶與倉庫的權限管理web

1.3.1 建立組create group

在管理員頁面點擊頁面頂部的 Admin area 按鈕,進入管理員區域,在頁面右側點擊綠色的 New group 按鈕,進入建立組頁面

在建立組頁面中,組路徑和組名稱爲必填項,並且此兩處內容好一致:
redis

  • 注:visibility Level:選擇誰能夠訪問該組:咱們默認選擇 private 便可
  • Private:只有受權的用戶才能夠看到
  • Internal:只要是登陸 gitlab 的用戶就能夠看到
  • Public:只要能夠訪問 gitlab web 頁面的人就能夠看到

點擊頁面下的 create group 按鈕,完成組的建立,進入組管理頁面
sql

1.3.2 建立用戶 create user

在管理員頁面點擊頁面頂部的 Admin area 按鈕,進入管理員區域,在頁面右側點擊綠色的 New user 按鈕,進入建立用戶頁面:

在建立用戶頁面,輸入用戶名暱稱、用戶名、電子郵件、選擇用戶級別

點擊頁面下部的 create user 按鈕,完成用戶建立,進入用戶管理頁面,點擊頁面右上頁的 Edit 按鈕,爲用戶設置初始密碼,在此頁面也可同時修改用戶註冊信息。

shell

1.3.3 用戶受權 grant user

用戶建立完成後,咱們就須要對用戶進行受權,從而使用戶能夠管理倉庫,有兩種方式,一是將用戶加入到組,這樣用戶能夠管理組內的倉庫,二是直接受權用戶管理倉庫。一般咱們採用的方式是將用戶加入相應的組,並賦予不一樣的角色。GitLab 中用戶的角色是系統定義好的,不能更改。這一點可能不符合咱們正常的思惟習慣。

下面咱們將剛建立的 dev 用戶添加到咱們的 oldboy 組,將賦予 developer 權限,在管理員區域,

點擊 oldboy 組,進入組管理頁面:

選擇咱們剛建立的 dev 用戶,選擇 developer 角色,而後添加到組:

注:關於每一種角色對應的權限,可參見官方文檔相關內容:https://docs.gitlab.com/ee/user/permissions.html數據庫

1.3.4 建立倉庫 create project

在 GitLab 中,你能夠建立 project 用來存儲你的程序代碼、做爲一個問題跟蹤器、用於代碼協做、用於持續集成中的構建、測試和部署等
在管理員區域點擊 New project 按鈕,或者點擊導航欄中的 選擇 New project 選項

進入到新建 project 頁面

選擇倉庫所屬的組,輸入倉庫名稱、倉庫描述,選擇可見級別,便可完成倉庫建立。進入倉庫主頁面:頁面左側部分爲倉庫操做相關菜單欄,右側空倉庫下顯示如何在命令行鏈接該倉庫,非空時顯示倉庫內容。

咱們將 git_test 倉庫加入到 oldboy 組後,組內的成員便可以看到該倉庫,咱們使用
dev 用戶登陸,便可看到該倉庫

1.3.5 配置SSH KEY

前面咱們已經在 GitLab 建立了倉庫,而且受權用戶可使用倉庫,咱們全部的操做都是在 WEB 頁面進行,下在咱們介紹如何使用客戶端來鏈接咱們的倉庫。
咱們的倉庫是私有的,只有受權的用戶才能夠訪問到該倉庫,那麼只要將客戶端的用戶與咱們 GitLab 的用戶綁定,客戶端便可訪問到 GitLab 上的倉庫,咱們建議使用 SSH 方式實現客戶端與 Gitlab 用戶的綁定,具體配置以下:

在客戶端生成 ssh 密鑰對(注 windows 客戶端下只能使用 rsa 加密方式)

[root@ci-node1 tools]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Ijcm2IoY2fwwYZCGEKjvTVciRLkovKYLX26y2woy5UY root@ci-node1
The key's randomart image is:
+---[RSA 2048]----+
|Bo ...           |
|+o  o            |
|+ oo .           |
|o*.+o . .        |
|ooE +.=oS        |
|.O.=.=.o         |
|X.+oo.           |
|+=o+o            |
|..=*o            |
+----[SHA256]-----+

咱們將該用戶與 GitLab 的 root 用戶綁定,複製用戶的公鑰,在 GitLab 主頁面點擊用戶設置

此處只能添加公鑰,若是添加私鑰系統將報錯,此外一個公鑰在整個 GitLab 系統中只能添加一次,可是一個 GitLab 用戶能夠添加多個公鑰

1.3.6 推送本地倉庫到gitlab

首先咱們要將GitLab上的git_data倉庫配置爲ci-node1上git_data倉庫的遠程倉庫,再使用推送的功能進行推送

[root@ci-node1 git_data]# git remote add gitlab git@10.0.0.11:oldboy/git_data.git
[root@ci-node1 git_data]# git push -u gitlab
Counting objects: 42, done.
Compressing objects: 100% (32/32), done.
Writing objects: 100% (42/42), 3.60 KiB | 0 bytes/s, done.
Total 42 (delta 8), reused 0 (delta 0)
To 10.0.0.11:oldboy/git_data.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from gitlab.

推送完後能夠在gitlab倉庫中看到推上來的內容

1.3.7 克隆gitlab倉庫到本地客戶端

首先,咱們配置 ci-node2 客戶端與 GitLab 上 dev 用戶綁定

使用 git clone 命令克隆倉庫到 ci-node2 本地

[root@ci-node2 git_data]# git clone git@10.0.0.11:oldboy/git_data.git
Cloning into 'git_data'...
remote: Enumerating objects: 42, done.
remote: Counting objects: 100% (42/42), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 42 (delta 8), reused 0 (delta 0)
Receiving objects: 100% (42/42), done.
Resolving deltas: 100% (8/8), done.
[root@ci-node2 git_data]# ls
git_data
[root@ci-node2 git_data]# cd git_data/
[root@ci-node2 git_data]# ls
ab  a.txt  b.txt  c.txt  test
[root@ci-node2 git_data]# git remote 
origin

咱們能夠看到已經將 GitLab 上的 git_data 倉庫克隆到了 ci-node2 本地,同時爲本地倉庫添加了一個指向 GitLab 上 git_data 倉庫的遠程倉庫
咱們 ci-node2 的 git_data 上建立一個 dev 分支,並將 dev 分支,推送到 GitLab 上:

[root@ci-node2 git_data]# git branch dev #建立分支
[root@ci-node2 git_data]# git branch  #查看分支
  dev
* master
[root@ci-node2 git_data]# git checkout dev #切換分支
Switched to branch 'dev'
[root@ci-node2 git_data]# git status #查看分支狀態
# On branch dev
nothing to commit, working directory clean
[root@ci-node2 git_data]# git push -u origin dev #推送到遠程倉庫
Total 0 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for dev, visit:
remote:   http://10.0.0.11/oldboy/git_data/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To git@10.0.0.11:oldboy/git_data.git
 * [new branch]      dev -> dev
Branch dev set up to track remote branch dev from origin.

完成後能夠在gitlab在看到咱們推送上來的分支

1.3.8 設置分支保護

在實際使用過程當中,咱們一般會保持 master 分支穩定,用於生產環境的版本發佈,只有受權的用戶才能夠向 master 合併代碼。要實現此功能,咱們須要將 master 設置爲保護分支,並受權什麼用戶能夠向 master 用戶推送代碼

使用 root 用戶點擊 git_data 倉庫頁面左下角的 Settings


設置完成後,在倉庫分支頁面,可看到 master 分支後面出現一個綠色的 protected 標記

此時咱們再嘗試在 ci-node2 上推送 master 分支到 GitLab

[root@ci-node2 git_data]# git add 123
[root@ci-node2 git_data]# git commit -m "add 123"
[master 13225ae] add 123
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 123
[root@ci-node2 git_data]# git push  origin master 
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 221 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: GitLab: You are not allowed to push code to protected branches on this project.
To git@10.0.0.11:oldboy/git_data.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@10.0.0.11:oldboy/git_data.git'

咱們發現此時咱們已經不能在 ci-node2 上向 GitLab 上推送 master 分支,由於咱們ci-node2 綁定的是 dev 用戶,dev 用戶屬於 developer 角色,master 分支不容許 developer角色向其推送內容

1.4 Gitlab的備份、恢復、升級

對 gitlab 進行備份將會建立一個包含全部庫和附件的歸檔文件。對備份的恢復只能恢復到與備份時的 gitlab 相同的版本。將 gitlab 遷移到另外一臺服務器上的佳方法就是經過備份和還原。gitlab 提供了一個簡單的命令行來備份整個 gitlab,而且能靈活的知足需求

1.4.1 Gitlab的備份配置

備份文件將保存在配置文件中定義的backup_path 中,文件名TIMESTAMP_gitlab_backup.tar,TIMESTAMP 爲備份時的時間戳。TIMESTAMP 的格式爲:EPOCH_YYYY_MM_DD_Gitlab-version。
默認的備份文件目錄爲:/var/opt/gitlab/backups,若是自定義備份目錄須要賦予目錄 git 權限,具體操做以下:

在配置文件/etc/gitlab/gitlab.rb 最後處加入:

gitlab_rails['backup_path'] = '/data/backup/gitlab' 
gitlab_rails['backup_keep_time'] = 604800 #備份保留的時間(以秒爲單位, 這個是七天默認值)

配置完後,使用 gitlab-ctl reconfigure從新加載配置文件

1.4.2 Gitlab手動備份

使用命令gitlab-rake gitlab:backup:create進行備份
[root@ci-node1 git_data]# gitlab-rake gitlab:backup:create 
Dumping database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
done
Dumping repositories ...
 * root/test ... [DONE]
[SKIPPED] Wiki
 * oldboy/git_data ... [DONE]
[SKIPPED] Wiki
done
Dumping uploads ... 
done
Dumping builds ... 
done
Dumping artifacts ... 
done
Dumping pages ... 
done
Dumping lfs objects ... 
done
Dumping container registry images ... 
[DISABLED]
Creating backup archive: 1554132551_2019_04_01_11.4.14_gitlab_backup.tar ... done
Uploading backup archive to remote storage  ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... done. (0 removed)
You have new mail in /var/spool/mail/root
#查看備份的文件
[root@ci-node1 git_data]# ll /data/backup/gitlab/
total 264
-rw------- 1 git git 133120 Apr  1 23:24 1554132241_2019_04_01_11.4.14_gitlab_backup.tar
-rw------- 1 git git 133120 Apr  1 23:29 1554132551_2019_04_01_11.4.14_gitlab_backup.tar

1.4.3 Gitlab定時備份

經過在定時任務裏添加:
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
咱們來實現定時備份,因爲代碼是一個企業很是重要的資產,因此咱們要重視 GitLab的備份工做。至少作到天天備份一次,平時要注意檢查備份的完整性。
環境變量 CRON=1 的做用是若是沒有任何錯誤發生時, 抑制備份腳本的全部進度輸

1.4.4 Gitlab恢復備份

GitLab 的恢復只能還原到與備份文件相同的gitlab 版本的系統中,恢復時,中止鏈接到數據庫的進程(也就是中止數據寫入服務),可是保持 GitLab 是運行的

中止這兩個服務
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
而後再進行恢復
gitlab-rake gitlab:backup:restore BACKUP=1554132241_2019_04_01_11.4.14

1.4.5 Gitlab升級

首先,下載新版本的 RPM 包,能夠經過官網或者清華鏡像站獲取。
其次關閉部分 gitlab 服務

gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
gitlab-ctl stop nginx

執行升級操做

rpm -Uvh gitlab-ce-11.4.14-ce.0.el7.x86_64.rpm
從新配置 gitlab
gitlab-ctl reconfigure
重啓 gitlab 服務
gitlab-ctl restart

注:升級操做不建議進行。若是確實須要,也能夠採起在一臺新的服務器上安裝新版本的 Gitlab,而後採用導入庫的方式將舊系統的代碼倉庫導入到新 Gitlab 上。

相關文章
相關標籤/搜索