建置 GitLab 版控工具

使用 Docker 建立 GitLab 並連接 LDAP 系統

Chris Lee
10 min readDec 9, 2020

Git 是很常見的版本控制工具,軟體界可以說無人不知無人不曉,尤其是 Github 更是工程師的好夥伴,總能在上面挖到寶物。但因為 Github 是開放的工具,對於公司而言可能有資安上的考量,更多企業偏向自己建立 Git 來保存自家的程式碼,其中常見的有 GitLab、Bitbucket等,只要再接上 CI/CD 工具,就會是個完整的部署架構。

資料科學雖然使用 Git 不是主要的技能,但隨著模型優化及特徵工程迭代,版控也逐漸重要,尤其好的部署架構,可以將上傳 Git 的程式自動打包 flask 建立 API,跟一般的 Web、App 一樣道理,所以下面就來使用 Docker container 的方式,快速建立一個 GitLab 的版控工具。

安裝環境

1. 安裝 Docker

Docker 作為容器化管理的工具,已經發展非常成熟,服務斷掉都能快速啟動,很適合我們版控工具架構,詳細可以看這篇:

我們以 CentOS 作為示範,先根據官方流程進行安裝,先確保機器裡面沒有安裝過:

sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

接下來設定安裝來源:

sudo yum install -y yum-utilssudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

開始安裝Docker:

sudo yum install docker-ce docker-ce-cli containerd.io

接下來使用以下語法,啟動 Docker:

sudo systemctl start docker

啟動後就可以開始用 Docker 功能了,如果會跳出權限問題,可以用下面語法將當前使用者加入 Docker 的使用群組,重新登入即可:

sudo usermod -aG docker $USER

2. 建立 GitLab Server

首先搜尋有關 gitlab 的相關 images:

docker search gitlab

裡面可以看到很多版本,甚至還有中文化的,我們可以使用官方釋出的版本,這裡特別提到有 gitlab-ce 及 gitlab-ee 兩種,一個是 Enterprise 版本,但實際上兩個的核心是一樣的,只有 ee 會多一些功能,但用不用的到就見仁見智。

我們看到官方文檔有多種安裝方式,為了清楚看到整個安裝架構,我們還是使用 docker-compose 來安裝:

sudo yum install docker-compose

我們先在目錄下建立 gitlab 專用資料夾:

cd 
mkdir gitlab

進去資料夾內,建立 docker-compose.yaml 的檔案,hostname 記得改成自己的 IP,然後有三個資料夾會 mount 到本機路徑下:

然後開始建立 container,-d 是背景執行的意思:

docker-compose up -d

第一次起環境可能要久一點的時間,會根據系統配置跑 5~10分鐘不等,好了以後打上我們設定的 8080 port 就可以進去 GitLab 的登入畫面,首先會要你建立 root 的密碼。

登入後就能開始使用囉,使用方法跟 Github 差不多,整個界面是全英文,可以到個人設定更改語言,但它的中文化有限,所以建議邊看邊翻譯就好。

建立角色

我們不會是使用 root 來使用 GitLab,因此我們要建立一個新的使用者,首先先去設定確認,是否開放註冊,第二個內容是說,註冊是否需要管理員同意,我是選擇取消掉,不然要一直登入是很麻煩的。

之後我們回到登入畫面,註冊一個角色開始使用,進去後就能看到一般 User 的首頁了:

建立專案

我們先簡單建立一個專案試試,首先點選上面的 + 圖案新增專案,然後我們把之前建立的股票模型專案上傳上去:

檔案可以直接透過 web 上傳

GitLab目前不支援多個檔案同時使用 Web 上傳,這也是很多開發者許願的功能,期待在未來版本改善。如果要大量快速上傳可以使用 Git 語法,這邊就不多贅述了。

對接 LDAP 系統

如果自家公司本身就有開發好的 AD 或 LDAP 系統,GitLab 有提供方法可以直接對接,我們要去 /etc/gitlab/gitlab.rb 修改內容,但因為我們前面有 mount 到 ~/gitlab/config 下,所以不用特別進去 container 內修改。

volumes:
- ~/gitlab/config:/etc/gitlab

我們可以看到路徑下有 gitlab.rb,直接打開來修改內容:

vim gitlab.rb

然後將 LDAP 的相關資訊打上去,通常是下面程式碼直接貼上即可:

這個 LDAP 系統建置可以參考之前的文章:

完成我們進去 GitLab 的 container 裡面重啟一下服務,可以用下面語法進去 container:

docker exec -it <CONTAINER ID> bash

然後重啟設定:

gitlab-ctl reconfigure

重啟完成後,可以用下面語法確認,LDAP 是否連結成功:

gitlab-rake gitlab:ldap:check
看起來有確實吃到目錄資料囉

我們回到 GitLab 的網站,會多一個 LDAP 登入的選項,打上 LDAP 角色的 Username 及密碼,就可以順利使用了。

如果再把自行註冊的功能關掉,只能從 LDAP 進行驗證登入,就會變成一個完整的企業 GitLab 系統囉。

備份與還原

GitLab 本身有內建備份功能,尤其在版本升級時就非常需要,可以參考官方文件

備份

以下在 container 內操作:

gitlab-rake gitlab:backup:create
完成後可以看到警告內容,特別說明 gitlab.rb 不在備份範圍

完成後在 /var/opt/gitlab/backups 可以看到備份好的 tar 檔,檔名會是流水號-日期-版本號_gitlab_backup.tar。回到 local 層,我們用下面法把 gitlab.rb 跟備份檔 gitlab_backup.tar 攜出到 container 外面:

docker cp <CONTAINER ID>:/etc/gitlab/gitlab.rb .
docker cp <CONTAINER ID>:/var/opt/gitlab/backups/gitlab_backup.tar .

還原

為了確保能正常還原,我們用剛剛的 docker-compose.yaml 重新建一個新的 GitLab,記得路徑都要稍微調整一下:

記得兩個的image來源要一樣,不然會還原失敗

然後把剛剛的備份檔丟回去該去的路徑:

docker cp gitlab_backup.tar <CONTAINER ID>:/var/opt/gitlab/backups/

接下來進去 container 內,把該關的東西關一下,準備還原:

sudo gitlab-ctl stop unicorn 
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq

sudo gitlab-ctl status

然後來準備還原,為了確保剛剛丟的檔案可以順利使用,記得去chmod 777 filename 一下,確保有存取權限,好了之後打上還原指令,後面帶備份檔檔名:

sudo gitlab-backup restore BACKUP=1607415829_2020_12_08_13.6.1-ee

還原後回到 local 把 gitlab.rb 丟回去,一樣記得開存取權限:

docker cp gitlab.rb <CONTAINER ID>:/etc/gitlab/

完成後重啟環境,一樣進去 container 內操作:

sudo gitlab-ctl reconfigure 
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:check SANITIZE=true

出現上面內容代表都完成囉,可以正常登入,跟原本的 GitLab 一模一樣。

URL 可以看到 port 變成新的 8980

從上你可以發現,要一下 local 操作,一下 container 內操作,如果你覺得很麻煩,可以把 container 內操作改成下面 local 指令,使用習慣就見仁見智:

docker exec -it <CONTAINER ID> gitlab-ctl stop unicorn 
docker exec -it <CONTAINER ID> gitlab-ctl stop puma
docker exec -it <CONTAINER ID> gitlab-ctl stop sidekiq

版本更新

GitlLab 最麻煩的就是版本更新,可以參考官方文件,它更新必須先升級到某個版本號,才能再往上升,如你的 12.9.2 要升級到 13.4.3,必須遵從 12.9.2 -> 12.10.14 -> 13.0.14 -> 13.4.3 的順序才行。

如果是公司企業的 offline 環境,就會需要重複的備份還原,希望這點未來可以修正。

當有了一台 GitLab 系統,就可以延伸接 CI/CD 架構等等規劃,明確把 UT、UAT、PROD 切分開來,讓資料科學的程式週期更加完善囉。

--

--

Chris Lee
Chris Lee

Written by Chris Lee

隱身在金融業的資料科學家

No responses yet