Skip to main content

Command Palette

Search for a command to run...

如何用 Docker 建制 Self-Host 的 GitLab 和 GitLab CI

Published
如何用 Docker 建制 Self-Host 的 GitLab 和 GitLab CI

I am not a programmer just a leaner. Writing JavaScript, Python, and Go and doing something on Kubernetes.

近期因為公司的需求打算替換 Gerrit,所以用 Docker 建立了公司內部 Host 的 GitLab 和 GitLab Runner。其中這邊要提到 GitLab Runner 是用來幫 GitLab 跑 CI 的外掛,有點像是 Jenkins 的 Slave Node,用來串接 GitLab CI。

這邊主要分成三個部分

  1. 架設 GitLab

  2. GitLab Runner 串接

  3. Auto Backup and Restore

架設 GitLab

Step 1:

docker pull gitlab/gitlab-ce

Step 2:

新增 docker-compose.yml 檔案,其中 {host_ip}替換成實際的機器 ip 位址。

version: "3.6" 
services:
  web:
    image: 'gitlab/gitlab-ce'
    container_name: 'gitlab'
    restart: always
    hostname: {host_ip}
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://{host_ip}:9090'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    networks:
      - gitlab-network
    ports:
      - '80:80'
      - '443:443'
      - '9090:9090'
      - '2224:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'

networks:
  gitlab-network:
    name: gitlab-network

Step 3:

docker-compose up --build --abort-on-container-exit

第一次啟動時需等待約 5 分鐘。啟動後使用瀏覽器連接 {host_ip}:9090 到 GitLab 去重新設置密碼。預設 username 是 root。

GitLab Runner 串接

這邊的話 GitLab Runner 需要準備另一台機器,跟 GitLab 分開。不然 GitLab Runner 在 clone 的時候 URL 的解析會有問題。這部分我也不知道怎麼解決,問了官方也沒有回應。可能是因為我的 GitLab Runner 是使用了 dind (docker in docker)的關係吧。其中 GitLab 可以跟多個 GitLab Runner 串接,Runner 都放在同一台機器是沒有問題的,只是 container 和 volume mount 的地方要不同。

Step 1:

其中 {runner-name} 替換成自己要的名字

docker pull gitlab/gitlab-runner
docker run -d --name {runner-name} -v /var/run/docker.sock:/var/run/docker.sock -v /srv/{runner-name}/config:/etc/gitlab-runner --rm gitlab/gitlab-runner

Step 2:

Step 1 啟動後,到 GitLab 裡面的 Admin Area > Overview > Runners。可以看到 Runner Registration Token

Step 3:

將 Step 2 取得的 token 替換掉下面指令中的 {registration-token} 並執行。{gitlab-ip} 替換為 GitLab 伺服器的 IP 位址。{runner-name} 替換為在 Step 1 設定的名字。

docker exec -it {runner-name} gitlab-runner register -n --url http://{gitlab-ip}:9090 --registration-token {registration-token} --clone-url http://{gitlab-ip}:9090 --executor docker --docker-image "docker:latest" --docker-privileged

Auto Backup and Restore

Backup

修改 /srv/gitlab/config/gitlab.rb 並增加以下的設定,這邊我是設定備份到 AWS 的 S3。其他的備份點,例如 GCP 或是本地端的可以參考官網。

gitlab_rails['backup_keep_time'] = 86400

gitlab_rails['backup_upload_connection'] = {
  'provider' => 'AWS',
  'region' => 'us-west-1',
  'aws_access_key_id' => {access key id},
  'aws_secret_access_key' => {secret access key}
}
gitlab_rails['backup_upload_remote_directory'] = 'gitlab'

修改完後,需要讓 GitLab 載入新的 config 設定

docker exec -t gitlab-master gitlab-ctl reconfigure

產生備份檔案,會自動上傳到 AWS 的 S3

docker exec -t gitlab-master gitlab-rake gitlab:backup:create

Restore

  1. 依照原本的 docker-compose.yml 重新啟動 GitLab

  2. 當 GitLab 重啟完畢後,從 S3 下載備份檔案到 /srv/gitlab/data/backups aws s3 cp {s3 backup file url} {backup file name}

  3. 最後執行執行來復原設定 docker exec -it gitlab-master gitlab-rake gitlab:backup:restore 其中如果有多個備份檔案在 backups 目錄的話,則需要特別指定是哪個備份檔案 docker exec -it gitlab-master gitlab-rake gitlab:backup:restore BACKUP={prefix backup file name before gitlab_backup.tar}

Cron Job

最後為了讓備份可以自動執行,所以就使用了 Linux 預設的 Cron 來處理。設定每週五的午夜執行備份指令

$ crontab -e
0 0 * * FRI docker exec -t gitlab-master gitlab-rake gitlab:backup:create

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.