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,

1.1.2 啟動並訪問Gitlab

重新配置執行完畢后,使用gitlab-ctl restart重啟服務

使用10.0.0.11進行訪問,首次登陸會要求更改root用戶的密碼,更改完密碼之后如下

1.1.3 Gitlab關閉注冊功能

由於我們Gitlab系統是私有倉庫,一般用戶都是由管理員創建和分派的,所以我們需要關閉注冊

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

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

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

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

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 查看服務的日志

1.2.2 Gitlab常用組件

GitLab 由主要由以下服務構成,他們共同承擔了 Gitlab 的運作需要

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),通過創建組,在組下再創建倉庫,再將用戶加入到組,從而實現用戶與倉庫的權限管理

1.3.1 創建組create group

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

在創建組頁面中,組路徑和組名稱為必填項,而且此兩處內容好一致:

  • 注:visibility Level:選擇誰可以訪問該組:我們默認選擇 private 即可
  • Private:只有授權的用戶才可以看到
  • Internal:只要是登錄 gitlab 的用戶就可以看到
  • Public:只要可以訪問 gitlab web 頁面的人就可以看到

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

1.3.2 創建用戶 create user

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

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

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

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 上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM