前一陣子在研究 CI/CD,想到前公司是使用 GitLab 作為版本控管以及 CI/CD 的解決方案,那就來架一台試試看吧。現在要自架 GitLab 服務相當簡單,除了自己準備好環境即可一鍵安裝,使用 docker 快速建立也是個好選擇。以下分別以二種方式進行安裝,順便留個紀錄:
GCP
- 建立 Compute Engine,GitLab 服務本身算是蠻吃記憶體的,官方建議的配備是四核心 CPU 以及 4GB 以上的 RAM。我開了一台雙核 4GB 的機器個人使用沒有問題,再低可能會有跑不起來的問題,請選用 e2-medium (2 個 vCPU,4 GB 記憶體) 以上等級的規格
- 根據官方提供的安裝文件進行安裝,這邊以 ubuntu 為例
# 更新套件來源並安裝相關套件 sudo apt-get update sudo apt-get install curl openssh-server ca-certificates postfix tzdata -y # 下載 gitlab ce 一鍵安裝包 curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash # 安裝 gitlab ce sudo apt-get install gitlab-ce # 修改 external_url 參數為對外網址 sudo vi /etc/gitlab/gitlab.rb # 更新設定並重新啟動 GitLab sudo gitlab-ctl reconfigure
- 第一次 GitLab 連線需要設定 root 的密碼,設定完後就算是建立完成了
- 因為之後需要串 CI/CD,所以還需要建立 GitLab Runner;它算是實際執行 CI/CD 時的程序。安裝方式也有很多種,這邊我偷懶使用 docker 快速建立,請先確認 docker 已經安裝完成
# 啟用一個 GitLab Runner 的 docker container docker run -d --name gitlab-runner --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ gitlab/gitlab-runner:latest # 查看列表確認是否啟用成功 docker ps -a
docker on NAS
- 這邊以 NAS 為主,去年趁雙 11 特價購入的 NAS 上面,已有多個使用 docker 自架的服務;不過自行升級到 16GB 的記憶體使用率一直很低...明明有多餘的 RAM 卻沒有用到感覺很虧!(咦?)這次試著在上面安裝 GitLab,總算是讓使用率突破 20% 了!以下是 QNAP Container Station,docker-compose.yml 的設定,這邊一併把 GitLab Runner 也包含進去:
version: '3' services: gitlab: image: gitlab/gitlab-ce:latest container_name: gitlab restart: always environment: GITLAB_OMNIBUS_CONFIG: | # GitLab 對外網址 external_url "https://gitlab.xxx" # ssh 對外顯示 port;這邊要特別注意,這個 port 是對外顯示用,所以要跟下面 ports 對應,但實際 docker 內部仍是使用 22 作為 ssh 的 port gitlab_rails['gitlab_shell_ssh_port'] = 50022 gitlab_rails['lfs_enabled'] = true gitlab_rails['manage_backup_path'] = true gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" gitlab_rails['backup_keep_time'] = 604800 gitlab_rails["time_zone"] = "Asia/Taipei" # 這邊因為我有用 SSH Tunnel 服務,所以只開 80 port nginx['listen_port'] = 80 nginx['listen_https'] = false # GitLab 有內建 letsencrypt 自動更新,不過我有透過 SSH Tunnel 服務已有 https,不確定設定這個是不是有用... letsencrypt['enable'] = true # 憑證快到期仍未更新時,發送通知的 email letsencrypt['contact_emails'] = ['gitlab@gmail.com'] letsencrypt['auto_renew_hour'] = "12" letsencrypt['auto_renew_minute'] = "30" letsencrypt['auto_renew_day_of_month'] = "*/7" volumes: - ./gitlab/config:/etc/gitlab - ./gitlab/logs:/var/log/gitlab - ./gitlab/data:/var/opt/gitlab ports: - "50443:443" - "50080:80" - "50022:22" gitlab-runner: container_name: gitlab-runner image: gitlab/gitlab-runner:latest restart: always volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "./gitlab/runner-config:/etc/gitlab-runner"
shared Runner
- 接下來我們要註冊一個 Shared runner,讓在這個 GitLab 裡面的專案都可以透過這個 Runner 跑 CI/CD 的 jobs
- 先進入 GitLab 的 Admin Area,點選 Runner 查看列表
- 右上方的 Set up a shared Runner manually 區塊有一些註冊時需要輸入的訊息:2. 是 GitLab 的對外網址 3. 是 token
- 使用剛剛啟用的 gitlab-runner container
# 註冊 GitLab Runner docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com ) # 這邊輸入 GitLab 的對外網址,參考 Set up a shared Runner manually 2. 的部分 Please enter the gitlab-ci token for this runner # 這邊輸入 GitLab 的 token,參考 Set up a shared Runner manually 3. 的部分 Please enter the gitlab-ci description for this runner # 這邊可以設定這個 Runner 的說明,非必填 Please enter the gitlab-ci tags for this runner (comma separated): # 這邊可以設定這個 Runner 的 tags,非必填 Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell: docker # 選擇這個 Runner 的執行方式,因為我們是使用 docker 啟用,所以這邊要輸入 docker docker Please enter the Docker image (eg. ruby:2.6): # 執行時預設啟用的 docekr image,這邊視專案而定,之後在 .gitlab-ci.yml 也可以更改
- 設定完成後如果沒有問題,就會在 Admin Area > Runner 列表中出現
以上完成安裝 GitLab,以及註冊啟用 GitLab Runner,算是完成 CI/CD 的前置作業,之後要如何設定專案 CI/CD,以及 .gitlab-ci.yml;或許下次有機會再分享?也可以參考一下後面提供的參考資料連結,自行實作看看喔!
參考資料
- [教學] 如何使用Gitlab CI來達到自動化測試與佈署
- COSCUP 2017 - Ansible & GitLab CI/CD workshop 101
- 使用 GitLab CI/CD 和 Envoy 為 Laravel 專案建立自動化部署