搭建自己的 Gitlab CI Runner

搭建自己的 Gitlab CI Runner

轉載於我的獨立博客:搭建自己的 Gitlab CI Runner

假定你已經有一台可用的,可聯網的機器

Preface

這篇文章將介紹如何使用自己的機器來搭建用於 Gitlab CI 的 runner. 在搭建自己的 CI Runner 之前,需要先明確一些概念:

CI (Continuous Integration)

CI 的全稱是 Continuous Integration (持續集成),是 extreme programming (極限編程) 的一部分。我們常用 CI 來做一些自動化工作,這種自動化工作會運行在一台集中的機器上,比如程序的打包,單元測試,部署等。這種構建方式避免了了打包環境差異引動的錯誤,並且通過 Gitlab 的 hook, 在代碼提交的各個環節自動地完成一系列的構建工作。

CI Runner

和第三方的 Travis CI, CircleCI 不同,Gitlab 本身並不提供機器,只提供一個註冊機器的介面。這些機器用於運行構建邏輯,在 Gitlab 中被稱為 Runner.

Gitlab Runner 環境

在這裡直接使用 Gitlab Runner 的官方 docker image:

安裝 Docker

curl -sSL https://get.daocloud.io/docker | sh

拉取 gitlab-runner 鏡像

因為眾所周知的原因,國內 pull docker 鏡像非常不穩定,所以在這裡用 Daocloud 提供的鏡像:

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://718dbf2d.m.daocloud.iosudo service docker restart

拉取鏡像:

sudo docker pull gitlab/gitlab-runner:latest

添加 gitlab-runner container

sudo docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest

配置用於 runner 的 docker image

雖然 Gitlab 支持多種 runner 運行方式,但本文建議使用 docker,因為使用 docker 較為靈活,一台機器可以創建多個 docker images 分別為不同的項目進行 CI, 但仍能保持環境隔離。

配置 Docker image 最簡單的方式是寫 Dockerfile, 比如可以用 Node.js 官方的 Docker image:

# DockerfileFROM node:7.9.0

由於每個業務總會有各自的環境要求,比如應用依賴底層的庫。這時可以通過 Dockerfile 配置:

# DockerfileFROM node:7.9.0RUN apt-get update && apt-get install -y package-foo package-bar

構建 Docker Image

寫好 Dockerfile 後,需要把它構建成 Image:

ls# Dockerfiledocker build -t IMAGE_NAME .

Build 完後,通過 sudo docker image ls 查看 image 狀態。

註冊 Runner

接下來就可以註冊 Runner:

sudo docker exec -it gitlab-runner gitlab-ci-multi-runner register

程序會要求你填寫相關的信息,這些信息可以從 Gitlab 項目的 Settings -> Runners 頁面中找到:

Please enter the gitlab-ci coordinator URL:# http://gitlab.alibaba-inc.com/ciPlease enter the gitlab-ci token for this runner:# 項目的 tokenPlease enter the gitlab-ci description for this runner:# Runner 的 descriptionPlease enter the gitlab-ci tags for this runner (comma separated):# Runner 的 tagWhether to run untagged builds [true/false]:# truePlease enter the executor: docker, parallels, shell, kubernetes, docker-ssh, ssh, virtualbox, docker+machine, docker-ssh+machine:# dockerPlease enter the default Docker image (e.g. ruby:2.1):# 填入構建 Docker image 時填寫的 image 名稱

這時 runner 就會出現在 runners 頁面。

FAQ

CI 運行時出現 ERROR: Job failed: API error (404): repository xxx not found: does not exist or no pull access

這是由於 Gitlab 會默認從遠程拉取 image,而我們的 image 是在本地構建的,所以需要對 gitlab-runner 進行配置,把 pull_policy 設置為 if-not-present 或 never.

# 進入 gitlab-runner 的 bash 環境sudo docker exec -it gitlab-runner bash# 編輯 config.tomlnano /etc/gitlab-runner/config.toml

編輯 config.toml 中對應的 runner:

[[runners]] name = "" url = "" token = "" executor = "docker" [runners.docker] tls_verify = false image = "nb-node" privileged = false disable_cache = false volumes = ["/cache"]+ pull_policy = "if-not-present" [runners.cache]

延伸閱讀

  • Run GitLab Runner in a container

  • 配置 Docker 加速器

  • Best practices for writing Dockerfiles

  • Using the if-not-present pull policy

推薦閱讀:

起底Git系列——精通Git的捷徑
ls,cat,mv,touch.以及explainshell.
IDEA 合併多次commit為一個?
【Git操作系列】Git由淺入深之基本原理
一入前端深似海,從此紅塵是路人系列第十彈之如何合理利用Git進行團隊協作(一)

TAG:前端開發 | Git | 持續集成CI |