gitlab-runner 安装使用
安裝前環境準備-docker為例
docker與docker-compose安裝
docker參考
docker-compose參考
docker安裝
-
選擇安裝版本,以 linux 的 centos 為例訪問docker官網 、點擊docker for linux:
-
選擇centos版本
-
先決條件:要安裝Docker Engine,您需要一個CentOS 7的維護版本。不支持或未測試存檔版本
-
卸載舊版本
$ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine如果yum報告未安裝這些軟件包, 說明無需關注、可以直接走下一步安裝。
-
設置存儲庫:首次安裝Docker Engine之前,需要設置Docker存儲庫
安裝yum-utils軟件包(提供yum-config-manager 實用程序)并設置穩定的存儲庫
$ sudo yum install -y yum-utils ? $ sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo -
安裝docker引擎,我們這里安裝最新版, 需要特定版本可參考官網
$ sudo yum install docker-ce docker-ce-cli containerd.io -
啟動Docker
$ sudo systemctl start docker -
通過運行hello-world 映像來驗證是否正確安裝了Docker Engine
sudo docker run hello-world會輸出hello word信息 即代表成功。
-
設置docker開啟自啟動
# 允許開機啟動 $ sudo systemctl enable docker # 狀態檢查 $ sudo systemctl status docker
docker-compose安裝
-
前提條件:Docker Compose依靠Docker Engine進行有意義的工作,請確保有安裝Docker Engine
-
安裝版本選擇
-
直接使用crul方式安裝 卸載方便
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -
給docker-compose添加可執行權限
sudo chmod +x /usr/local/bin/docker-compose -
卸載:(通過curl方式安裝卸載)
sudo rm /usr/local/bin/docker-compose
gitlab-runner安裝配置
docker-compose.yaml文件編寫
version: "2" ? services:runner:image: gitlab/gitlab-runner:latestcontainer_name: gitlab-runnerrestart: alwaysenvironment:TZ: Asia/Shanghaivolumes:- /docker/gitlab-runner/config:/etc/gitlab-runner- /var/run/docker.sock:/var/run/docker.sock注意:如果runner executor 為docker 、必須掛載 /var/run/docker.sock:/var/run/docker.sock
?
安裝&&使用gitlab-runner
配置runner參考
example
-
安裝前準備
-
mkdir /root/docker
-
將上述docker-compose.yaml文件拷貝到/root/docker目錄下
-
運行gitlab-runner
docker-compose up -d -
查看日志
docker logs gitlab-runner -
注冊gitlab-runner到gitlab、先查看gitlabrunner 的token
獲取token和注冊需要的域名或者ip都可
?
-
注冊gitlab-runner
$ docker exec -it gitlab-runner gitlab-runner register Runtime platform ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arch=amd64 os=linux pid=35 revision=ce065b93 version=12.10.1 Running in system-mode. ? Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): # https://gitlab.com # 你的gitlab的域名或ip Please enter the gitlab-ci token for this runner: # 89Gz************ # 上面從項目中獲取的token值 Please enter the gitlab-ci description for this runner: [9e4cbb00ddf2]: # my-runner # 自定義的runner描述 Please enter the gitlab-ci tags for this runner (comma separated): # demo # 自定義的tag ci可以根據tag執行任務,可在ci中設置 默認啟用tag 如果任務未添加tag 會pending Registering runner... succeeded ? ? ? ? ? ? ? ? ? ? runner=89GziSKQ Please enter the executor: docker, docker-ssh, shell, kubernetes, docker+machine, docker-ssh+machine, custom, parallels, ssh, virtualbox: # docker # 選擇executor類型 這里采用docker Please enter the default Docker image (e.g. ruby:2.6): # golang:1.14.2 # 默認的鏡像 因為是go所以選擇go的 Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!再次查看日志 現在未繼續報錯了
Configuration loaded ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? builds=0 -
gitlab-runner設置
如果允許未設置tag的任務運行 需要在runner里面設置
允許沒有tag的任務運行、否則沒有tag的任務會 進入pending 狀態
gitlab-runner config.toml配置
配置文件路徑 與在yaml文件路徑下 /docker/gitlab-runner/config/config.toml
# cat config.toml concurrent = 1 check_interval = 0 ? [session_server]session_timeout = 1800 ? [[runners]]name = "my-runner"url = "https://gitlab.****.com"token = "dWza**********"executor = "docker"[runners.custom_build_dir][runners.cache][runners.cache.s3][runners.cache.gcs][runners.docker]tls_verify = falseimage = "golang:1.14.2"privileged = falsedisable_entrypoint_overwrite = falseoom_kill_disable = falsedisable_cache = falsevolumes = ["/cache", "/root/docker/gitlab-runner/gztar/.tar:/root/.tar","/root/.ssh:/root/.ssh:ro"]pull_policy = "if-not-present"shm_size = 0這里volumes掛載了cache目錄以及設置了默認拉取的鏡像文件
? # 配置從本地獲取鏡像 加快ci & cd速度volumes = ["/root/docker/gitlab-runner/gztar/.tar:/root/.tar"]# 會首先從本地獲取鏡像 本地沒有才會從hub上拉取鏡像pull_policy = "if-not-present" # --------------# 可選 映射本機的秘鑰到docker里面的docker里面、 可用于ssh 部署之類volumes = ["/root/.ssh:/root/.ssh:ro"] # ro只讀 不允許修改宿主機的秘鑰信息ssh部署可參考
gitlab-yaml
注意:
url = "https://gitlab.****.com" # gitlab的地址token = "dWza**********" ?# gitlab的token附:docker鏡像導入導出命令
# 導出鏡像 docker save -o /root/docker/gitlab-runner/gztar/golang.tar golang:latest # 導入鏡像 docker load -i /root/docker/gitlab-runner/gztar/golang.tar ? # 另外一種方式 docker save golang:latest > /root/docker/gitlab-runner/gztar/golang.tar docker load < /root/docker/gitlab-runner/gztar/golang.targitlab-runner 知識點
Runner間隔多久去GitLab上檢查是否有job
config.toml文件的check_interval字段會決定這個時間間隔,它的默認值是3秒(注意當你把它設為0時依然采用的是默認值3秒,而不是0秒)
要解釋它的意義,首先我們先來定義worker,在config.toml文件中定義了很多runner,它們可能executor類型不同,可能注冊地址不同,但都是由GitLab Runner這個服務來管理的,為了與GitLab Runner區分開,我們將config.toml文件中定義的runner稱為worker。
對于不同的worker,worker之間(如worker A ---> worker B)的間隔為check_interval / worker_nums,但是對于worker A本身來說它下次去檢查是否有job的時間間隔仍為check_interval。
舉個簡單例子:config.toml定義了3個worker—— worker A, worker B 和 worker C,check_interval采用默認值為3秒,第0秒時worker A會去檢查是否有屬于自己的job,第1秒時worker B會去檢查,第2秒時worker C去檢查,第3秒時worker A再檢查……這個過程中worker A到worker B的間隔為3 / 3 = 1秒,而對于worker A下次檢查job時的時間間隔為check_interval,即3秒。
官方文檔對check_interval的解釋:https://docs.gitlab.com/runner/configuration/advanced-configuration.html#how-check_interval-works。
config.toml里的concurrent字段的意義
concurrent限制了整個GitLab Runner能并發處理job的數量。特別注意concurrent與worker數量無任何關系,所有worker的工作是受GitLab Runner控制的,如果concurrent值為1并且有一個worker已經在工作了,那么即使其他worker達到了可以工作的條件也只能“pending”。
cache存儲在哪里
參考https://docs.gitlab.com/ee/ci/caching/#where-the-caches-are-stored
怎樣清除cache
注意cache是沒有過期時間的,而且每一次新的push觸發的pipeline,都會重新生成cache,重新生成的cache的名字為“-”,其中num是隨著push數量遞增的。如果不去清除cache,cache會永久保留在Runner上,日積月累會填滿存儲空間的,因此最好隔一段時間進行一次清除,清除方法請參考https://docs.gitlab.com/ee/ci/caching/#clearing-the-cache,或者使用clear_volumes.sh 這個簡單腳本來處理它, 清除cache的原理是將相關的volume移除,當然,docker也有自帶的清除命令,推薦將docker system prune -f --volumes加入到定時任務中。
GitLab Runner 變量的優先級
參考https://docs.gitlab.com/ee/ci/variables/#priority-of-environment-variables
GitLab Runner有哪些預定義的變量
參考https://docs.gitlab.com/ee/ci/variables/#predefined-variables-environment-variables
當使用Runner采用docker作為executor時,無法build docker image
這是個dind(docker in docker) 問題,一般pipeline會報如下錯誤:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? time="2018-12-17T11:12:33Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix可以將本地的docker socket綁定到container里來解決
在配置文件config.toml里添加volumes = ["/var/run/docker.sock:/var/run/docker.sock"]
可參考https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker-executor。
如何在job所對應的container里使用git clone命令
如果想在job運行期間clone代碼(如shell或python的腳本),首先要確保你的宿主機有權限clone代碼,然后將將你的secret掛載到container里。
例如,通過git/ssh的方式克隆代碼,若ssh目錄為/root/.ssh,可以在config.toml文件里添加如下配置:
volumes = ["/root/.ssh:/root/.ssh:ro"]ro表示容器只有可讀權限 避免修改秘鑰。
常用的預定義的變量
| $CI_PROJECT_NAME | 項目名稱 |
| $CI_PROJECT_NAMESPACE | 組名稱 |
| $CI_PROJECT_PATH | 項目相對路徑 |
| $CI_PROJECT_URL | 項目URL地址 |
| $GITLAB_USER_NAME | 用戶名稱 |
| $GITLAB_USER_EMAIL | 用戶郵箱 |
| $CI_PROJECT_DIR | 項目絕對路徑 |
| $CI_PIPELINE_ID | 流水線ID |
| $CI_COMMIT_REF_NAME | 當前分支 |
go Makefile 常用集成
通過Makefile簡單集成單元測試 覆蓋率測試 及覆蓋率報告
.PHONY: clean test coverage coverhtml build help lint ? PROJECT_NAME := "code" PKG_LIST := $(shell go list ./... | grep -v /vendor/) ? all: build ? test: ## Run unittests@go test -v ${PKG_LIST} ? race: ## Run data race detector@go test -race -short ${PKG_LIST} ? coverage: ## Generate global code coverage reportcoverage_testcoverhtml: ## Generate global code coverage report in HTMLcoverage_test html ? build: ## Build the binary file@go build -i -v -o _${PROJECT_NAME} ./... ? lint: ## Lint the files@golint -set_exit_status ${PKG_LIST} ? clean:rm -rf _${PKG_LIST} ? help: ## Display this help screen@grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' ? SHELL=bash define BASH_FUNC_coverage_test%% () {# Code coverage generationCOVERAGE_DIR="${COVERAGE_DIR:-coverage}" ?# Create the coverage files directorymkdir -p "$COVERAGE_DIR"; ?# Create a coverage file for each packagefor package in ${PKG_LIST}; dogo test -covermode=count -coverprofile "./${COVERAGE_DIR}/${package##*/}.cov" "$$package" ;done ; ?# Merge the coverage profile filesecho 'mode: count' > "./${COVERAGE_DIR}"/coverage.cov ;tail -q -n +2 "./${COVERAGE_DIR}"/*.cov >> "./${COVERAGE_DIR}"/coverage.cov ; ?# Display the global code coveragego tool cover -func="./${COVERAGE_DIR}"/coverage.cov ; ?# If needed, generate HTML reportif [ "$1" == "html" ]; thengo tool cover -html="./${COVERAGE_DIR}"/coverage.cov -o coverage.html ;fi ?# Remove the coverage files directoryrm -rf "$COVERAGE_DIR"; } endef export BASH_FUNC_coverage_test%% ??
.gitlab-ci.yaml配置(優化后)
image: golang:1.14.2 variables:PROJECT_NAME: "_code"DEV_HOST: "測試機器ip"DEV_PATH: "部署路徑"PRD_HOST: "線上機器ip"PRD_PATH: "部署路徑" ? stages: - test- build- deploy ? before_script:- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'- eval $(ssh-agent -s)- mkdir -p /go/src/$GITLAB_USER_NAME /go/src/_/builds- cp -r $CI_PROJECT_DIR /go/src/$GITLAB_USER_NAME/$CI_PROJECT_NAME- ln -s /go/src/$GITLAB_USER_NAME /go/src/_/builds/$GITLAB_USER_NAME ? unit_tests:stage: testscript: - make testtags: - demo ? race_detector:stage: testscript:- make race ? code_coverage:stage: testscript:- make coverage ? code_coverage_report:stage: testscript:- make coverhtmlonly:- master ? build:dev:stage: buildscript:- go build -i -v -o ${PROJECT_NAME} ./...artifacts:expire_in: 1 weekpaths:- $PROJECT_NAMEonly:- dev ? build:master:stage: buildscript:- go build -i -v -o ${PROJECT_NAME} ./...artifacts:expire_in: 1 weekpaths:- $PROJECT_NAMEonly: - master ? deploy:dev:stage: deployscript:- echo "=====start dev deploy======"- scp -r $PROJECT_NAME root@$DEV_HOST:$DEV_PATH- ssh root@$DEV_HOST "cd $DEV_PATH; ./$PROJECT_NAME >> dev.log"- echo "=====end dev deploy======"only:- devwhen: manualenvironment: testdependencies:- build:devdeploy:master:stage: deployscript:- echo "=====start deploy======"- scp -r $PROJECTNAME root@$DEV_HOST:$DEV_PATH- ssh root@$DEV_HOST "cd $DEV_PATH; ./$PROJECT_NAME >> master_test.log"- echo "=====end deploy======"only:- masterwhen: manualenvironment: productiondependencies:- build:master驗證.gitlab-ci.yml文件的內容:進入項目倉庫->CI/CD->作業->CI Lint,示例如下:
總結
以上是生活随笔為你收集整理的gitlab-runner 安装使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitLab CI/CD
- 下一篇: sarama-cluster之panic