GitLab CI Lab 環境建置步驟

前言

感謝各位讀者購買《和艦長一起30天玩轉GitLab》(第二版),在本書第五章我們要來實作 CI/CD Pipeline。

為幫助使用不同環境的讀者皆能順利完成第五章的實作練習,特別將「GitLab CI Lab 環境建置步驟」獨立公開於此網頁。本網頁會根據讀者的回饋,適度修正內容。

如果你按著本網頁的步驟操作,仍無法建立實作環境,還請透過艦長的 Facebook 粉專Google 線上表單與我聯繫,方便我了解你遭遇的狀況,以便能對此網頁內容作出修正,謝謝

mac 操作步驟

以下我們就使用 mac 電腦,運用 Docker 來建立第五章的「GitLab CI Lab 環境」。

建立 Lab 資料夾

首先在你的電腦找個好位置,例如你自己家目錄下(~/),建立包含以下結構的資料夾。

(下面都是將 Lab 環境存放在 ~/mylab,如果你要放在別的地方,記得這些路徑都要自行修正。)

mylab
|__runner
|__sftp
   |__var
      |__www
         |__deploy
            |__develop
            |__staging
            |__pre-production
            |__production

如果想要偷懶,可以用下面的這幾行指令。

mkdir -p ~/mylab/runner
mkdir -p ~/mylab/sftp/var/www/deploy/develop
mkdir -p ~/mylab/sftp/var/www/deploy/staging
mkdir -p ~/mylab/sftp/var/www/deploy/pre-production
mkdir -p ~/mylab/sftp/var/www/deploy/production

建立 docker-compose.yaml

請複製下面程式碼,建立一個你自己的 docker-compose.yaml

version: "3"
networks:
  lab_net:
    ipam:
      driver: default
      config:
        - subnet: "172.16.0.0/24"
services:
  runner:
    image: gitlab/gitlab-runner:latest
    container_name: "gitlab-runner"
    restart: always
    volumes:
    - ~/mylab/runner/config:/etc/gitlab-runner
    - /var/run/docker.sock:/var/run/docker.sock
    extra_hosts:
    - "gitlab-ci.demo:172.16.0.31" 
    - "gitlab-ci.view:172.16.0.32"
    networks:
      lab_net:
        ipv4_address: 172.16.0.30

  sftp:
    image: atmoz/sftp:latest
    container_name: "sftp"
    volumes:
    - ~/mylab/sftp:/home/sftpuser
    command: sftpuser:password:::var
    networks:
      lab_net:
        ipv4_address: 172.16.0.31

  web:
    image: nginx:latest
    container_name: "web"
    volumes:
    - ~/mylab/sftp/var/www:/usr/share/nginx/html:ro
    ports:
    - 8080:80
    networks:
      lab_net:
        ipv4_address: 172.16.0.32

運行 Container

延續剛才我們建立了 docker-compose.yaml,接著執行指令 docker compose up -d 將 Container 運行。

(應該會類似上圖,Docker 會幫你運行三個 Container。)

(如果用 docker ps 檢查,會看到我們運行的三個 Container。)

(也可以用 docker inspect 檢查,確認這三個 Container 的 ip 是否有如我們設定綁定固定的 ip。)

建立 GitLab Project

使用你的 gitlab.com 帳號,建立一個乾淨的空白 Project。

接著進入 Project 的 Settings > CI/CD > Runners

首先設定此 Project 不使用 Shared Runners。(原因是 Shared Runner 會連不到我們建立的 Lab 環境。)

取得註冊 Runner 所需的 Token。

註冊 GitLab Runner

首先建立 Runner Config 的 Template,請建立一個名為 config.template.toml 的檔案,並在檔案中寫入以下內容。

[[runners]]
  [runners.docker]
    image = "bash"
    extra_hosts = ["gitlab-ci.demo:172.16.0.31","gitlab-ci.view:172.16.0.32"]
    network_mode = "host"

docker cpconfig.template.toml 複製到 Container 內的 /tmp/ 底下,等一下會用到。

# 你可以參考下面這行 docker cp 指令
docker cp config.template.toml gitlab-runner:/tmp/config.template.toml

下一步要註冊 Runner,這裡我們用笨方法,先透過 docker exec -it 進入 Container 內。

# 如果你的 Container 名稱是 gitlab-runner 可以直接執行這個指令
## 如果不是,就請自行修改為正確的名稱。
docker exec -it gitlab-runner bash

在 Container 內,執行下面的指令,完成 Runner 的註冊。

# 注意,要改成你自己的 Token
gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.com" \
  --registration-token "<改成你的 Runner Token>" \
  --template-config /tmp/config.template.toml \
  --description "lab runner" \
  --executor "docker" \
  --docker-image bash

(成功註冊應該會出現類似上圖的訊息。)

輸入 exit 離開 Container。

最後,可以檢查一下你的 ~/mylab/runner/config/config.toml,裡面應該會有類似下圖的內容,其中最重要的是一定要有 extra_hostsnetwork_mode 的內容。

開始跟著第五章實作 CI/CD Pipeline

當你完成前面的所有步驟之後,你就順利在你的 mac 電腦上,用 Docker container 建立了本書第五章所需的 Lab 環境。

接下來請繼續參閱《和艦長一起 30 天玩轉 GitLab》(第二版)的第五章,書中會帶著讀者一步一步的實作 CI/CD Pipeline,並且引導各位思考其中的關鍵議題。

要特別注意的是,任何你想要跟著第五章實作的 CI/CD Pipeline 內容,都必須使用前述步驟中建立的 GitLab Runner,因為只有它才認識 Lab 環境的 IP 172.16.0.*

另外,如果你想要用 mac 電腦上的網頁瀏覽器查看 Lab 環境部署的網頁(http://gitlab-ci.view:8080/),可以再多做以下幾個步驟。

(但筆者建議是,其實你並不需要用瀏覽器查看在 Lab 過程中 CI/CD 部署的成果,因為整個 Lab 的重點並不在於該網頁的內容,而是 CI/CD Pipeline 的規劃與思考。)

  1. 修改你的 /etc/hosts,在其中增加一行內容。

    0.0.0.0 gitlab-ci.view
    
  2. 接著你就可以在網頁瀏覽器上輸入網址 http://gitlab-ci.view:8080/ 連上 web 這個 Container;後續就可以按著書中的步驟,如果是 productuon 環境,就可以用網址 http://gitlab-ci.view:8080/deploy/production/index.html 瀏覽網頁。

如果 Lab 實作完畢,也記得再次修改 /etc/hosts,把上面那一行內容刪除。

如果不想用網頁瀏覽器,但又還是想要驗證 CI/CD Pipeline 是否有正確部署網頁,那你可以參考前面的 docker exec -it 指令,一樣先進入 gitlab-runner 的 Container 內,接著用 curl 驗證是否能順利連上網頁,例如:curl http://gitlab-ci.view/deploy/develop/index.html。(在 Container 內,就不用加上 port :8080

補充說明

筆者最新測試,目前書中第五章範例所使用的 web-testing 動作,有時會出現 exit code 23 的狀況,導致該 Job 呈現 failed

如果你覺得因為不定時出現的 exit code 23,導致理應正常的 Pipeline 出現 failed,造成練習時的困擾,建議你可以將 web-testing 動作按下面的範例修改。

# 原本的動作如下,是模擬檢查網頁,是否有正確回傳 HTTP/1.1 200 OK
curl -Is http://gitlab-ci.view/deploy/develop/index.html | head -n 1 | grep "HTTP/1.1 200 OK"

# 改成,只檢查能否順利連上網頁
curl -Is http://gitlab-ci.view/deploy/develop/index.html