目錄

GitLab CI with docker for EDK2 under Ubuntu

既然會手動 build code 了,該來把這件事變成自動化了吧?

這篇文章不會說明如何撰寫 .gitlab-ci.yml,而是專注在如何將 Server 端的 Gitlab-Runner 該如何跑在 docker 上面。 為了這篇文章,還特別去全新安裝了一台 Ubuntu 20.04 LTS,所以如果手上的 Ubuntu 機器不是 20.04 LTS,也許環境上會有些差異。

1. 安裝

按照一般安裝 Ubuntu 的方式,應該可以順利安裝完成。等到安裝完成後,請打開 terminal 並輸入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 若你裝完機器就不想要在機器前操作,可以先安裝 openssh-server 來用遠端機器透過 ssh login
sudo apt install openssh-server
sudo apt update && sudo apt upgrade -y
sudo apt install curl docker.io
# 將目前帳號加進 docker 群組,記得 logout 再 login 才能不使用 sudo 去跑 docker
sudo usermod -aG docker $USER

# 以下幾行只是留著紀錄, 用 docker 的做法不需要在本機環境安裝 gitlab-runner
# 將 GitLab-Runner 的 source 加進 apt source list
# ref: https://docs.gitlab.com/runner/install/linux-repository.html
#curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
# 安裝 gitlab-runner
#sudo apt install curl docker.io gitlab-runner

到這邊就算把基本環境安裝完成了

2. 註冊 GitLab-Runner

一般我們跑 GitLab-Runner 應該都是直接執行 gitlab-runner register 後就開始設定了,不過因為我們想改用 docker 所以要改用 gitlab-runner 的 docker 來註冊

1
2
3
4
5
6
# 先建立一個目錄來存放 gitlab-runner 需要的設定檔
export GITLAB_RUNNER_HOME=/home/ubuntu/DockerConfig
docker run --rm -it \
  -v $GITLAB_RUNNER_HOME:/etc/gitlab-runner \
  --name gitlab-runner \
  gitlab/gitlab-runner register

接著按照一般設定 gitlab-runner 的方式去設定,只是須注意在 executor 的選擇要從 shell 改選成 docker

註冊完畢後,應該就可以在 gitlab 上的 CI 葉面看到這個 runner 了,但還沒有啟動開始運作,不過在那之前,可以先將這個無用的 container 移除

1
2
3
4
5
6
# 先使用 docker ps 確認正在執行的 container
docker ps
# 檢查 id 後強制停止該 container
docker kill ${ID}
# 刪除該 id 的 container
docker rm ${ID}

3. 啟動 GitLab-Runner 的 container

1
2
3
4
5
export GITLAB_RUNNER_HOME=/home/ubuntu/DockerConfig
docker run -d --name gitlab-runner --restart always \
  -v $GITLAB_RUNNER_HOME:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

4. 最後補充一個好用的 docker image

watchtower 可以幫忙自動更新 docker image, 算是懶人必備。

1
2
3
4
5
6
7
# https://www.hi-linux.com/posts/49978.html
docker run -d \
    --name watchtower \
    --restart unless-stopped \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower \
    --cleanup

到這邊就結束了,可以去 GitLab server CI 頁面看看自己的 runner 是不是狀況正常了。