安裝GitLab-CI
這個不用安裝了,裝好GitLab8.0及以上就自帶了
GitLab-Runner的安裝與使用
我的作業系統是:Centos 7.0 64位
安裝gitlab-ci-multi-runner
- 添加yum源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
- 安裝
yum install gitlab-ci-multi-runner
這裡是官網的安裝教程,其它作業系統的請參考
https://gitlab.com/gitlab-org/gitlab-ci-multi-runner
使用gitlab-ci-multi-runner注冊Runner
安裝好gitlab-ci-multi-runner這個軟體之後,我們就可以用它向GitLab-CI注冊Runner了。
向GitLab-CI注冊一個Runner需要兩樣東西:GitLab-CI的url和注冊token。
其中,token是為了确定你這個Runner是所有工程都能夠使用的Shared Runner還是具體某一個工程才能使用的Specific Runner。
如果要注冊Shared Runner,你需要到管理界面的Runners頁面裡面去找注冊token。如下圖所示:

Shared Runner
如果要注冊Specific Runner,你需要到項目的設定的Runner頁面裡面去找注冊token。如下圖所示:
Specific Runner
找到token之後,運作下面這條指令注冊Runner(當然,除了url和token之外,還需要其他的資訊,比如執行器executor、建構目錄builds_dir等)。
gitlab-ci-multi-runner register
注冊完成之後,GitLab-CI就會多出一條Runner記錄,如下圖所示:
GitLab-CI Runner
GitLab-CI會為這個Runner生成一個唯一的token,以後Runner就通過這個token與GitLab-CI進行通信。
那麼,問題來了。注冊好了的Runner的資訊存放在哪兒了呢?
原來,Runner的資訊是存放在一個配置檔案裡面的,配置檔案的格式一般是.toml。這個配置檔案的存放位置有以下幾種情況:
- 在類Unix作業系統下(0.5.0之後版本)
- 如果是以root使用者身份運作gitlab-ci-multi-runner register,那麼配置檔案預設是/etc/gitlab-runner/config.toml
- 如果是以非root使用者身份運作gitlab-ci-multi-runner register,那麼配置檔案預設是~/.gitlab-runner/config.toml
- 在其他作業系統下以及0.5.0之前版本
配置檔案預設在目前工作目錄下./config.toml
一般情況下,使用預設的配置檔案存放Runner的配置資訊就可以了。當然,如果你有更細化的分類需求,你也可以在注冊的時候通過-c或--config選項指定配置檔案的位置。具體檢視register指令的使用方法:gitlab-ci-multi-runner register --help。
問題:如果不運作gitlab-ci-multi-runner register指令,直接在配置檔案裡面添加Runner的配置資訊可以嗎?
回答:當然不可以。因為gitlab-ci-multi-runner register的作用除了把Runner的資訊儲存到配置檔案以外,還有一個很重要的作用,那就是向GitLab-CI送出請求,在GitLab-CI中登記這個Runner的資訊并且擷取後續通信所需要的token。
讓注冊好的Runner運作起來
Runner注冊完成之後還不行,還必須讓它運作起來,否則它無法接收到GitLab-CI的通知并且執行軟體內建腳本。怎麼讓Runner運作起來呢?gitlab-ci-multi-runner提供了這樣一條指令gitlab-ci-multi-runner run-single,詳情如下:
[[email protected] ~]# gitlab-ci-multi-runner run-single --help NAME: run-single - start single runner USAGE: command run-single [command options] [arguments...] OPTIONS: --name, --description Runner name [$RUNNER_NAME] --limit Maximum number of builds processed by this runner [$RUNNER_LIMIT] --ouput-limit Maximum build trace size [$RUNNER_OUTPUT_LIMIT] -u, --url Runner URL [$CI_SERVER_URL] -t, --token Runner token [$CI_SERVER_TOKEN] --tls-ca-file File containing the certificates to verify the peer when using HTTPS [$CI_SERVER_TLS_CA_FILE] --executor Select executor, eg. shell, docker, etc. [$RUNNER_EXECUTOR] --builds-dir Directory where builds are stored [$RUNNER_BUILDS_DIR] --cache-dir Directory where build cache is stored [$RUNNER_CACHE_DIR] --env Custom environment variables injected to build environment [$RUNNER_ENV] --shell Select bash, cmd or powershell [$RUNNER_SHELL] --ssh-user User name [$SSH_USER] --ssh-password User password [$SSH_PASSWORD] --ssh-host Remote host [$SSH_HOST] --ssh-port Remote host port [$SSH_PORT] --ssh-identity-file Identity file to be used [$SSH_IDENTITY_FILE] --docker-host Docker daemon address [$DOCKER_HOST] --docker-cert-path Certificate path [$DOCKER_CERT_PATH] --docker-tlsverify Use TLS and verify the remote [$DOCKER_TLS_VERIFY] --docker-hostname Custom container hostname [$DOCKER_HOSTNAME] --docker-image Docker image to be used [$DOCKER_IMAGE] --docker-privileged Give extended privileges to container [$DOCKER_PRIVILEGED] --docker-disable-cache Disable all container caching [$DOCKER_DISABLE_CACHE] --docker-volumes Bind mount a volumes [$DOCKER_VOLUMES] --docker-cache-dir Directory where to store caches [$DOCKER_CACHE_DIR] --docker-extra-hosts Add a custom host-to-IP mapping [$DOCKER_EXTRA_HOSTS] --docker-links Add link to another container [$DOCKER_LINKS] --docker-services Add service that is started with container [$DOCKER_SERVICES] --docker-wait-for-services-timeout How long to wait for service startup [$DOCKER_WAIT_FOR_SERVICES_TIMEOUT] --docker-allowed-images Whitelist allowed images [$DOCKER_ALLOWED_IMAGES] --docker-allowed-services Whitelist allowed services [$DOCKER_ALLOWED_SERVICES] --docker-image-ttl [$DOCKER_IMAGE_TTL] --parallels-base-name VM name to be used [$PARALLELS_BASE_NAME] --parallels-template-name VM template to be created [$PARALLELS_TEMPLATE_NAME] --parallels-disable-snapshots Disable snapshoting to speedup VM creation [$PARALLELS_DISABLE_SNAPSHOTS] --virtualbox-base-name VM name to be used [$VIRTUALBOX_BASE_NAME] --virtualbox-disable-snapshots Disable snapshoting to speedup VM creation [$VIRTUALBOX_DISABLE_SNAPSHOTS]
要讓一個Runner運作起來,--url、--token和--executor選項是必要的。其他選項可根據具體情況和需求進行設定。我們可以看出來,這個指令裡面的選項跟配置檔案中Runner的配置項基本上是一樣的。那這個指令的運作和配置檔案有沒有什麼關系呢?從我的試驗和思考來看,應該是沒有什麼關系的。因為:
- 這個指令裡面并沒有指定配置檔案位置的選項,如果讀取配置檔案難道去讀取預設位置嗎?但是配置檔案的位置是可以指定的,不一定在預設位置,這不符合邏輯,是以它應該不會去讀配置檔案。
- 我删掉配置檔案,這個指令依然能夠運作
是以,這個指令應該隻是一個能讓Runner運作起來的基礎指令。但這個指令運作起來的前提是,GitLab-CI中必須事先注冊有這個Runner。
那配置檔案有毛用?配置檔案的作用在後面,但是從這裡我們知道一點:配置檔案裡面有Runner運作時所需要的資訊。
可能你還有一個問題:我用root的使用者注冊Runner時,注冊完Runner就可以用了,并沒有手動地去運作Runner啊?這個後面講。
批量地運作Runner
正常情況下,如果我有多個Runner,我并不想手動一個個地運作,要是能一次運作多個Runner多爽啊!嗯哼,gitlab-ci-multi-runner就提供了這樣一個指令gitlab-ci-multi-runner run,詳情如下:
[[email protected] gitlab-runner]# gitlab-ci-multi-runner run --help NAME: run - run multi runner service USAGE: command run [command options] [arguments...] OPTIONS: -c, --config "/etc/gitlab-runner/config.toml" Config file [$CONFIG_FILE] -n, --service "gitlab-runner" Use different names for different services -d, --working-directory Specify custom working directory -u, --user Use specific user to execute shell scripts --syslog Log to syslog
這個指令總共有5個選項,讓我們從選項來了解一下這個指令:
- -c, --config選項
這個選項是用來指定配置檔案路徑的。如果你想同時運作多個Runner,你必須得知道你要運作哪些Runner以及這些Runner運作時所需要的資訊。而前面我們說過,配置檔案裡面就存放着Runner運作時所需要的資訊。而且一個配置檔案是可以存放多個Runner的資訊的。如果不指定這個選項,就會使用預設的配置檔案。
- -n, --service選項
這個選項是用來指定服務的别名的。為什麼要有這個選項呢?指定别名有什麼意義呢?我們從上一個選項可以看出來,一次隻能運作一批Runner,因為一次隻能指定一個配置檔案。那如果我有多個配置檔案,我要運作多批Runner,那是不是給每一次批量運作服務取不同的别名來區分更好一點呢。
- -d, --working-directory選項
這個選項是用來指定此次批量運作服務的工作目錄的。如果自己沒有指定builds_dir的話,此次運作起來的Runner會把builds_dir放到這個目錄裡面。
- -u, --user選項
這個選項很重要,它指定了該以什麼使用者權限來運作Runner。為了安全,我認為不應該給運作Runner的使用者過高的權限,更不應該以root使用者來運作Runner。
- --syslog選項
如果指定了這個選項,則把日志記錄到系統日志。
使用服務
能夠批量地運作Runner已經很好了,但是還不夠好,為什麼呢?
首先,gitlab-ci-multi-runner run預設是前台運作的,使用體驗不好;
其次,當gitlab-ci-multi-runner run在背景運作的時候,要檢視其運作狀态不友善,而且也沒有提供停止gitlab-ci-multi-runner run的指令。
是以,要是能将批量運作Runner這個功能安裝為一項服務,就更爽了!
gitlab-ci-multi-runner确實就提供了這樣的功能。
install、uninstall、start、stop、restart、status這6個指令就是和服務相關的。
我一開始對gitlab-ci-multi-runner的服務概念感覺比較懵,讓我們來看看安裝服務install這個指令到底幹了一件什麼事情。
[[email protected] ~]# gitlab-ci-multi-runner install --help NAME: install - install service USAGE: command install [command options] [arguments...] OPTIONS: --service, -n "gitlab-runner" Specify service name to use --working-directory, -d "/root" Specify custom root directory where all data are stored --config, -c "/etc/gitlab-runner/config.toml" Specify custom config file --user, -u Specify user-name to secure the runner
從選項可以看出,一項服務的資訊有4個:服務名、工作目錄、配置檔案和使用者。這個指令的選項和gitlab-ci-multi-runner run的選項基本一樣。可見,批量運作Runner和服務之間的關系暧昧。至于是什麼關系,往下看gitlab-ci-multi-runner start這個指令。
[[email protected] ~]# gitlab-ci-multi-runner start --help NAME: start - start service USAGE: command start [command options] [arguments...] OPTIONS: --service, -n "gitlab-runner" Specify service name to use
啟動一項服務,隻要指定服務的名稱就行了(預設服務名稱是gitlab-runner)。啟動服務後,運作指令ps -aux | grep gitlab-runner檢視背景程式,發現啟動服務其實就是在背景執行了一個批量運作Runner的任務,是以服務安裝指令的選項才會和批量運作Runner指令的選項基本一樣。
root 18219 0.0 0.1 331872 5332 ? Ssl 00:06 0:00 /usr/bin/gitlab-ci-multi-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --user gitlab-runner --syslog
還有stop指令用于停止服務,restart指令用于重新開機服務,status用于檢視服務狀态。這三個指令的使用方法和start類似,就不一一介紹了。
其他一些思考
- 什麼情況下需要注冊Shared Runner?
比如,GitLab上面所有的工程都有可能需要在公司的伺服器上進行編譯、測試、部署等工作,這個時候注冊一個Shared Runner供所有工程使用就很合适。
-
什麼情況下需要注冊Specific Runner?
比如,我可能需要在我個人的電腦或者伺服器上自動建構我參與的某個工程,這個時候注冊一個Specific Runner就很合适。
-
什麼情況下需要在同一台機器上注冊多個Runner?
比如,我是GitLab的普通使用者,沒有管理者權限,我同時參與多個項目,那我就需要為我的所有項目都注冊一個Specific Runner,這個時候就需要在同一台機器上注冊多個Runner。