基於Docker配置本地Gitlab

技術背景

GithubGitee(碼雲)是最常見的基於git的代碼託管平台,現在基於svn的代碼管理倉庫已經相對比較少見了,大部分還都是企業內部的代碼倉。但是基於開源的Gitlab,我們在企業內網也可以立馬搭建一個代碼託管平台,並且自帶集成有各種代碼自動化測試工具,實現持續集成和持續測試。

關於Docker容器的使用,這裡我們主要是為了規避不同的OS發行版所帶來的安裝困擾,而Gitlab官方也提供了Docker的支持。也就是說,只要本地環境中有Docker,就可以很方便的去構造一個本地的Gitlab環境。本文也是基於Docker,講解和展示本地Gitlab的配置和使用方法。

基於Docker的Gitlab環境部署

關於更多的docker的使用和操作方法和使用案例,讀者可以參考這些博客(博客1博客2博客3博客4),這裡我們就直接使用docker的一些功能。比如首先我們要做的是從dockerhub中拉取Gitlab官方提供的鏡像:

[dechin-manjaro gitlab]# docker pull gitlab/gitlab-ce

這個下載的速度還是不錯的,下載完成後可以在使用docker images查看相關鏡像是否在本地倉庫列表中。需要注意的是,這些基本的docker操作都需要root權限來執行。下載完鏡像後,在本地找一個空的目錄,創建幾個文件夾用於綁定容器內的相關目錄,使得容器中所生成的配置文件和日誌文件數據文件等可以同步到本地的目錄(而不僅僅是保存在容器內部的目錄)。

[dechin-manjaro gitlab]# ll
總用量 0
[dechin-manjaro gitlab]# mkdir -p config
[dechin-manjaro gitlab]# mkdir -p logs
[dechin-manjaro gitlab]# mkdir -p data

這裡創建了configlogsdata目錄,分別用-v指令綁定到容器內的/etc/gitlab/var/log/gitlab/var/opt/gitlab目錄,具體的運行指令如下所示(參考了參考鏈接1):

[dechin-manjaro gitlab]# docker run -d -p 5443:443 -p 82:82 -p 2222:22 --name gitlab -v /home/dechin/projects/2021-softwares/gitlab/config:/etc/gitlab -v /home/dechin/projects/2021-softwares/gitlab/logs:/var/log/gitlab -v /home/dechin/projects/2021-softwares/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
c12732a4acfb4835b8d1353b62cf85868edc2466eb0669bbabc2059f7932c309

執行之後容器開始進入後台運行,我們可以看到當前的運行狀態是health: starting

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED          STATUS                            PORTS                                                                                                                       NAMES
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   6 seconds ago    Up 5 seconds (health: starting)   80/tcp, 0.0.0.0:82->82/tcp, :::82->82/tcp, 0.0.0.0:2222->22/tcp, :::2222->22/tcp, 0.0.0.0:5443->443/tcp, :::5443->443/tcp   gitlab
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   45 minutes ago   Exited (137) 5 minutes ago                                                                                                                                    hardcore_poitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            45 minutes ago   Created                           22/tcp, 80/tcp, 443/tcp                                                                                                     intelligent_hopper

接下來我們要做的事情就是等待,一段時間(大約2~3分鐘)之後,可以重新查看剛才的容器鏡像的運行狀態,此時我們可以發現狀態變成了healthy

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED          STATUS                        PORTS                                                                                                                       NAMES
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   4 minutes ago    Up 4 minutes (healthy)
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   49 minutes ago   Exited (137) 10 minuteitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            49 minutes ago   Created               _hopper

這表示Gitlab容器的初始化已經完成了,接下來我們可以在本地的目錄下(而不是容器內部的目錄)找到名為gitlab.rb的配置文件,需要對其進行修改:

[dechin-manjaro gitlab]# vi config/gitlab.rb 

要修改的地方主要有以下幾點:

external_url '//192.168.0.105:82' # 大約在32行,注意替換本地ip地址
gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 大約在631行
# nginx['redirect_http_to_https_port'] = 82 # 大約在1312行
nginx['listen_port'] = 82 # 大約在1354行

修改完成後,重啟gitlab的容器鏡像(在上一次的run中,我們將其命名為gitlab):

[dechin-manjaro gitlab]# docker restart gitlab
gitlab

跟剛才一樣的,需要看容器狀態以確定是否啟動成功:

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED          STATUS                
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   13 minutes ago   Up 12 seconds (health:
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   57 minutes ago   Exited (137) 18 minutere_poitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            58 minutes ago   Created               igent_hopper

當狀態變成了healthy之後,就可以進入下一步的工作:

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED             STATUS             
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   15 minutes ago      Up 2 minutes (healt
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   About an hour ago   Exited (137) 20 min_poitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            About an hour ago   Created            ent_hopper

Gitlab配置

在前面的步驟都執行成功後,我們應該可以在瀏覽器中輸入//192.168.0.105:82/(這裡注意替換本地ip地址,Linux系統可以通過ifconfig獲取)打開Gitlab的管理界面如下:

首次登錄會被要求重設密碼,帳號是root。重設完密碼之後,就可以進入Gitlab的登錄頁面:

輸入root帳號和剛才設定的密碼之後,就可以登錄進入Gitlab主頁:

在主頁上點擊創建項目,可以新建一個本地的項目:

創建好項目後的項目主頁如下:

這裡因為我們略過了一個步驟,在第一次使用Gitlab平台的時候,需要使用RSA加密生成密鑰對,點擊剛才界面上的添加ssh key進入添加密鑰對的界面:

此時我們需要在本地終端窗口中執行如下的指令來產生密鑰對:

[dechin@dechin-manjaro projects]$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dechin/.ssh/id_rsa): private_gitlab.pub # 文件名,可以不加pub
Enter passphrase (empty for no passphrase):  # 輸入自定義密碼
Enter same passphrase again:  # 再次輸入自定義密碼
Your identification has been saved in private_gitlab.pub
Your public key has been saved in private_gitlab.pub.pub
The key fingerprint is:
SHA256:Xr3DhNi+8ZMJ×××××××××××××××××××0w dechin@dechin-manjaro
The key's randomart image is:
+---[RSA 2048]----+
|o..              |
|.. o. . .        |
|..+o + *         |
|   . E o.oo++o   |
|    o   . .++.   |
|     o..  . ..   |
+----[SHA256]-----+

執行完該指令會在當前目錄下產生兩個密鑰文件:

[dechin@dechin-manjaro projects]$ ll
總用量 8
-rw------- 1 dechin dechin 1876  5月  5 16:43 private_gitlab.pub
-rw-r--r-- 1 dechin dechin  403  5月  5 16:43 private_gitlab.pub.pub

其中少一個pub的文件是私鑰,不應該暴露出來,而多一個pub的文件是公鑰,需要複製這個文件中的字符串,輸入到剛才Gitlab的配置中:

[dechin@dechin-manjaro projects]$ cat private_gitlab.pub.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDt6VXrvTPhWr5iUy3KpIzRryX3SGBUAYietTMSqEOuZjRXr1u14lFk1cT5jwAHw7BtnfBOrwptTIYaWztoWR94gG1W1KFc6HRY0SWrUHtwXwOypWcqMv7Z2AT6TFIgNf/2ZZAlYisC0G9xTO5qTcYDyJe/88zcIm/5B6NQ7safAkGkGYY+WrFxBpnNU2bEdSbx4Sem2v2TD9GRxSg9RpLSXQaULi1bpDgGfxLJZBxj2Eeo11j9ayjipWFqJ43pJ dechin@dechin-manjaro

一般是以ssh-rsa開頭的字符串,輸入完成後點擊Add Key,即可完成密鑰對的配置:

代碼倉基本操作

在完成前面章節的基本配置之後,就可以使用https的方式將需要託管的代碼倉庫clone下來同步操作,首先複製倉庫鏈接:

到本地終端窗口執行git clone指令:

[dechin@dechin-manjaro projects]$ git clone //192.168.0.105:82/root/myfirstproject.git
正克隆到 'myfirstproject'...
Username for '//192.168.0.105:82': root
Password for '//[email protected]:82': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收對象中: 100% (3/3), 完成.

完成克隆操作後,可以在當前目錄下看到一個新生成的與倉庫同名的文件夾,裏面僅有一個項目初始化的readme文件,這也是創建項目時候所選擇的配置:

[dechin@dechin-manjaro projects]$ ll
總用量 12
drwxr-xr-x 3 dechin dechin 4096  5月  5 16:50 myfirstproject
-rw------- 1 dechin dechin 1876  5月  5 16:43 private_gitlab.pub
-rw-r--r-- 1 dechin dechin  403  5月  5 16:43 private_gitlab.pub.pub
[dechin@dechin-manjaro projects]$ cd myfirstproject/
[dechin@dechin-manjaro myfirstproject]$ ll
總用量 4
-rw-r--r-- 1 dechin dechin 44  5月  5 16:50 README.md

關於更多的git相關操作,讀者可以參考這一篇博客,這裡我們僅為了展示本地部署的gitlab的使用場景演示:

[dechin@dechin-manjaro myfirstproject]$ mkdir src # 創建一個src目錄
[dechin@dechin-manjaro myfirstproject]$ cd src/
[dechin@dechin-manjaro src]$ touch .gitkeep # 創建一個gitkeep文件,可以使得目錄不被簡化,空目錄無法被git識別
[dechin@dechin-manjaro src]$ git status # 查看修改狀態
位於分支 master
您的分支與上游分支 'origin/master' 一致。

未跟蹤的文件:
  (使用 "git add <文件>..." 以包含要提交的內容)
        ./

提交為空,但是存在尚未跟蹤的文件(使用 "git add" 建立跟蹤)
[dechin@dechin-manjaro src]$ git add ./ # 添加當前目錄下的所有修改
[dechin@dechin-manjaro src]$ git commit -m 'Create a folder from localhost' 提交修改說明
[master 211278b] Create a folder from localhost
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/.gitkeep
[dechin@dechin-manjaro src]$ git push # 推送修改
Username for '//192.168.0.105:82': root # 輸入gitlab的用戶名
Password for '//[email protected]:82': # 輸入gitlab的密碼
枚舉對象中: 5, 完成.
對象計數中: 100% (5/5), 完成.
使用 8 個線程進行壓縮
壓縮對象中: 100% (2/2), 完成.
寫入對象中: 100% (4/4), 327 位元組 | 327.00 KiB/s, 完成.
總共 4(差異 0),復用 0(差異 0),包復用 0
To //192.168.0.105:82/root/myfirstproject.git
   5ee2b12..211278b  master -> master

提交修改前後對比:


我們可以看到push完成後,Gitlab項目界面上多了一個src目錄出來,這就說明變更提交成功了,而且每一次變更的說明信息都會被保存,最近一次的變更說明會在主頁上顯示出來。接下來再試試Gitlab的分支管理,新建一個分支,然後直接提交:

[dechin@dechin-manjaro myfirstproject]$ git checkout -b dev
切換到一個新分支 'dev'
[dechin@dechin-manjaro myfirstproject]$ git push
fatal: 當前分支 dev 沒有對應的上游分支。
為推送當前分支並建立與遠程上游的跟蹤,使用

    git push --set-upstream origin dev

[dechin@dechin-manjaro myfirstproject]$ git push --set-upstream origin dev
Username for '//192.168.0.105:82': root
Password for '//[email protected]:82': 
總共 0(差異 0),復用 0(差異 0),包復用 0
remote: 
remote: To create a merge request for dev, visit:
remote:   //192.168.0.105:82/root/myfirstproject/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To //192.168.0.105:82/root/myfirstproject.git
 * [new branch]      dev -> dev
分支 'dev' 設置為跟蹤來自 'origin' 的遠程分支 'dev'。


上傳新的分支之後,就會在分支列表中看到不同的分支。那麼除了這些提交修改同步的功能之外,Gitlab也有類似於Github的工作管理界面,比如個人活躍度:

比如基於Merge Request和Issue的任務提交與下發系統:

在同一個無線網絡的局域網下,使用手機等終端設備也可以訪問該私有的Gitlab倉庫:

基本上功能還是比較完善的。而關於自動化集成的方案,會在後續介紹Jenkins的博客中再展開說明。

總結概要

本文按照操作流程的時間順序,分別介紹了Gitlab的Docker容器部署、Gitlab平台的基本配置以及基於Git的代碼倉基本管理與同步方法。通過掌握這一套的流程,就可以實現在本地構建一個類似於Github的代碼託管系統,在企業內網更好的管理私有代碼倉庫,避免因為在Github上進行代碼開發而被其他企業竊取核心技術。

版權聲明

本文首發鏈接為://www.cnblogs.com/dechinphy/p/gitlab.html
作者ID:DechinPhy
更多原著文章請參考://www.cnblogs.com/dechinphy/

參考鏈接

  1. //blog.csdn.net/shan165310175/article/details/92797199#commentBox