建置 GitLab 版控工具
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 的首頁了:
建立專案
我們先簡單建立一個專案試試,首先點選上面的 + 圖案新增專案,然後我們把之前建立的股票模型專案上傳上去:
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
完成後在 /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,記得路徑都要稍微調整一下:
然後把剛剛的備份檔丟回去該去的路徑:
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 一模一樣。
從上你可以發現,要一下 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 切分開來,讓資料科學的程式週期更加完善囉。