2024-03-22|閱讀時間 ‧ 約 36 分鐘

自建GitLab環境:使用Docker的詳盡部署指南

今天跟大家分享CI/CD流程中的一個重要的階段:版本管理系統。由於筆者的LAB環境需要有一個版本管理的做法,所以就想到非常普遍的Git系統。並且因為想要在本地直接建立專屬環境,所以就想到了gitlab。

raw-image

本文將說明以下內容:

  1. Gitlab vs GitHub
  2. Gitlab的基本說明
  3. 使用Docker來進行部署
  4. 安裝後:MTA設定
  5. 結論

1.Gitlab vs GitHub

我想這是最常被問到的第一個問題了吧…我到底要用Gitlab 還是用GitHub?

首先,不管是Gitlab或是GitHub,說穿了就是以Git為基礎建構出來的版本管理系統。基本上Git是由Linus Torvalds為Linux Kernel所設計的版本控制軟體,雖然當初是專門為了Linux所設計,但因為真的太好用,所以許多開源專案也都使用這套方法來進行管理。

為怕有人不清楚,簡單說明它們是什麼:

  • Gitlab: 是GitHub的另一個替代方案,該系統也基於Git。 當然,它是為託管開放原始碼專案而設計的,目的是使開發人員的生活更輕鬆,但是與前一個有所不同,除了倉庫管理和版本控制,它還提供Wiki託管和錯誤跟踪系統。 還可以用來創建和管理各種項目。
  • GitHub: 一個協作的開發平台並具有Web服務和版本控制系統。該平台專注於開發人員之間的合作,以傳播和支持他們的軟體(雖然也有許多人用來做開發軟體以外的其他目的)。該平台是用Ruby on Rails編寫的。GitHub上存儲了大量可公開訪問的開源項目。 這就是它的價值讓微軟在2018年選擇購買該平台,貢獻了不少於7500億美元的數字。

※ 接下來就是這二套系統的優點:

(1) GitLab:

  • 免費計劃無限制,儘管它有付款計劃。
  • 開源。
  • 允許在任何計劃上進行自我託管。
  • 它與Git很好地集成在一起。

(2) GitHub:

  • 免費服務,儘管它也提供付費服務。
  • 非常快速的搜索。
  • 社區很大,很容易找到幫助。
  • 它提供了與Git合作和良好集成的實用工具。
  • 易於與其他第三方服務集成。
  • 它還可以與TFS,HG和SVN一起使用

當然它們也都各自有各自的缺點,例如GitHub如果使用量超過1GB就要轉成付費帳戶,Gitlab相對於GitHub可能資源就沒有這麼龐大,但也相對的具備有完全的控制權的好處。


2.Gitlab的基本說明

上述簡單說明了與GitHub的差異,本節就專門針對Gitlab做更進一步的說明。

現在GitLab已分成GitLab CE(社群版)GitLab EE(企業版)。核心程式碼都是相同的。如果不想架設GitLab的話,也可以直接使用gitlab.com的服務。

常見的功能如下:

  • Git 版本控制系統
  • CI/CD Pipeline
  • 可以根據使用者存放在不同專案內的特定YAML檔案自動建立
  • 目前已經可以順利整合從測試到部署的常見工具
  • 提供一個整合的開發Workflow : GitLab Workflow
  • CI/CD Pipeline的Job必須透過GitLab Runner來協助執行
  • 程式碼專案管理功能(Ex. Wiki, Issue Tracking, Kanban….)

針對相關設定、記錄檔、資料檔的存放位置,另外需要建立掛載的目錄,可以在家目錄內,也可以另外建立。

※ Gitlab容器所會使用的位置與說明如下:

※ Gitlab使用者權限:


3.使用Docker來進行部署

接下來就進入部署階段,大家可以試著跟據這邊提供的做法實際部署看看,Gitlab有許多種部署方式,可以到官網上去看相關文件說明。

以下使用docker image 來進行部署,該image已包含所有需要的元件。安裝的方式有以下三種:

  • Docker engine
  • Docker compose
  • Docker swarm

本LAB使用Docker compose來進行部署,此外官方的Image並沒有包含MTA元件,如果有寄信的需求,建議在另外建立一個Container或服務來實現。

如果要部署在K8S環境,建議使用官方另一個部署的方式(Operator),不然可能造成單點失誤。

此處使用:gitlab/gitlab-ce:latest

#---------------------------------------------------
# S3-1. 建立目錄
#---------------------------------------------------
[root]# mkdir -p /srv/gitlab
[root]# vim /root/.bash_profile
export GITLAB_HOME=/srv/gitlab
#---------------------------------------------------
# S3-2. Change the GitLab Shell SSH port
# GitLab使用SSH來與Git溝通,預設是22 Port,但會與主機相衝
# 可以選擇直接改主機的SSH不要使用22,或是修改GitLab不要用22 Port
#---------------------------------------------------
=> 用docker-compose的話,直接改內容即可
#---------------------------------------------------
# S3-3. 建立docker-compose.yaml
#---------------------------------------------------
[root]# mkdir -p /root/gitlab/
[root]# vim docker-compose.yml
version: '3.6'
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
hostname: 'gitlab.test.example.poc'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.test.example.poc:8929'
gitlab_rails['gitlab_shell_ssh_port'] = 2424
ports:
- '8929:8929'
- '8443:8443'
- '2424:2424'
volumes:
- '$GITLAB_HOME/config:/etc/gitlab'
- '$GITLAB_HOME/logs:/var/log/gitlab'
- '$GITLAB_HOME/data:/var/opt/gitlab'
shm_size: '256m'

[root]# docker-compose up -d
[root]# docker ps
#---------------------------------------------------
# S3-4. 登入Web
#---------------------------------------------------
http://gitlab.test.example.poc:8929
=> 修改初始密碼 (root/P@ssw0rd)

如果沒出現,可以到$GITLAB_HOME/config/initial_root_password取得登入密碼
[root]# docker exec -it gitlab /bin/bash (cat $GITLAB_HOME/config/initial_root_password)
Password: I+UkaZl6xT0iMBBXJ3TIZNor+M+ZnOz//Hhoz01zSHk=

4.安裝後:MTA設定

以下是一般安裝完GitLab之後會做的幾件任務,可跟據需求進行安裝設定:

  • Email and Notification
  • CI/CD
  • Security
  • Authentication
  • Backup and Upgrade

本文將進行Email and Notification的設定,使用本機的smtp server進行發信。

#-------------------------------------------------
# S4-1. 取得docker host ip
#-------------------------------------------------
[root]# ip a
10.107.88.7
#-------------------------------------------------
# S4-2. 修改docker-compose, 加入本機IP
#-------------------------------------------------
[root]# vim docker-compose.yaml
version: '3.6'
services:
gitlab:
image: gitlab/gitlab-ce:latest
extra_hosts:
- "dockerhost:10.107.88.7"
container_name: gitlab
restart: always

[root]# docker-compose up -d
#-------------------------------------------------
# S4-3. 確認container內部的/etc/hosts
#-------------------------------------------------
[root]# docker exec -it gitlab /bin/bash
root# cat /etc/hosts
10.107.88.7 dockerhost
172.18.0.2 gitlab.test.example.poc gitlab
#-------------------------------------------------
# S4-4. 修改sendmail
#-------------------------------------------------
[root]# yum install sendmail
[root]# vim /etc/mail/sendmail.cf (開啟25 Port可連線)
#註解以下
#O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
#新增以下
O DaemonPortOptions=Port=smtp,Addr=0.0.0.0, Name=MTA

[root]# systemctl restart sendmail
[root]# nc -v localhost 25s
#-------------------------------------------------
# S4-5. 允許relay清單
#-------------------------------------------------
[root]# vim /etc/mail/access
最後加上
Connect:10.107.88 RELAY
#-------------------------------------------------
# S4-6. 讓gitlab透過host的sendmail寄信
#-------------------------------------------------
[root]# vim /srv/gitlab/config/gitlab.rb
gitlab_rails[‘smtp_enable’] = true
gitlab_rails[‘smtp_address’] = “dockerhost"
gitlab_rails[‘smtp_port’] = 25
#gitlab_rails[‘smtp_user_name’] = “"
#gitlab_rails[‘smtp_password’] = “"
gitlab_rails[‘smtp_domain’] = “dockerhost"
#gitlab_rails[‘smtp_authentication’] = “none"
gitlab_rails[‘smtp_openssl_verify_mode’] = ‘none’
gitlab_rails[‘smtp_enable_starttls_auto’] = false
gitlab_rails[‘smtp_tls’] = false
gitlab_rails[‘smtp_ssl’] = false
gitlab_rails[‘smtp_force_ssl’] = false
#gitlab_rails[‘smtp_pool’] = false

設定寄件者
gitlab_rails[‘gitlab_email_from’] = ‘gitlabuser@test.example.poc’
gitlab_rails[‘gitlab_email_display_name’] = ‘gitlabuser’

設定gitlab admin寄件者
alertmanager[‘admin_email’] = ‘c’

[root]# docker exec -it gitlab /bin/bash
root# gitlab-ctl reconfigure

[2024-02-16T03:19:10+00:00] INFO: Report handlers complete
Infra Phase complete, 7/778 resources updated in 55 seconds
gitlab Reconfigured!
#-------------------------------------------------
# S4-7. 測試localhost寄信
# 此為測試,確認可從gitlab container發信到localhost即可
#-------------------------------------------------
[root]# nc -v localhost 25
EHLO localhost (跟主機打招呼)
MAIL FROM:<gitlabuser@test.example.poc>
RCPT TO:<gitlabuser@test.example.poc>
DATA
SUBJECT: mail server text!
Test!!

5.結論

今天說明了Gitlab與GitHub的差異與在自已的環境內部署Gitlab來進行測試的分享。筆者實務上Gitlab與GitHub都有在使用。但GitHub的主要內容是做為測試文章的異地備份點,同時GitHub也有自已的App,讓筆者可以隨時透過手機就可以查看自已的筆記內容。

未來也將繼續針對安裝完後的一些實務作法,例如實務上建構出CI/CD的Pipeline,部署在K8S內的做法等等進行分享,也希望大家持續關注。

最後,也希望大家可以給筆者一個鼓勵,如果想要第一時間看到後續的文章也請大家follow我~那我們下期再見~~~


※ References:

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.