GitLab CI Lab 環境建置步驟
前言
感謝各位讀者購買《和艦長一起30天玩轉GitLab》(第二版),在本書第五章我們要來實作 CI/CD Pipeline。
為幫助使用不同環境的讀者皆能順利完成第五章的實作練習,特別將「GitLab CI Lab 環境建置步驟」獨立公開於此網頁。本網頁會根據讀者的回饋,適度修正內容。
如果你按著本網頁的步驟操作,仍無法建立實作環境,還請透過艦長的 Facebook 粉專或 Google 線上表單與我聯繫,方便我了解你遭遇的狀況,以便能對此網頁內容作出修正,謝謝
mac 操作步驟
以下我們就使用 mac 電腦,運用 Docker 來建立第五章的「GitLab CI Lab 環境」。
- 如何在 mac 電腦上安裝 Docker,請自行參閱 Docker 官方文件。
- 可以的話,你也可以學習一下 Docker 及 Docker compose 的相關知識。
建立 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 cp
將 config.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_hosts
及 network_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 的規劃與思考。)
修改你的
/etc/hosts
,在其中增加一行內容。0.0.0.0 gitlab-ci.view
接著你就可以在網頁瀏覽器上輸入網址
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