基于 Docker 安裝 GitLab Runner
本節(jié)視頻
GitLab Runner 簡介
理解了上面的基本概念之后,有沒有覺得少了些什么東西 —— 由誰來執(zhí)行這些構(gòu)建任務(wù)呢?
答案就是 GitLab Runner 了!
想問為什么不是 GitLab CI 來運行那些構(gòu)建任務(wù)?
一般來說,構(gòu)建任務(wù)都會占用很多的系統(tǒng)資源 (譬如編譯代碼),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 來運行構(gòu)建任務(wù)的話,在執(zhí)行構(gòu)建任務(wù)的時候,GitLab 的性能會大幅下降。
GitLab CI 最大的作用是管理各個項目的構(gòu)建狀態(tài),因此,運行構(gòu)建任務(wù)這種浪費資源的事情就交給 GitLab Runner 來做拉!
因為 GitLab Runner 可以安裝到不同的機器上,所以在構(gòu)建任務(wù)運行期間并不會影響到 GitLab 的性能
基于 Docker 安裝 GitLab Runner
環(huán)境準備
- 創(chuàng)建工作目錄
/usr/local/docker/runner - 創(chuàng)建構(gòu)建目錄
/usr/local/docker/runner/environment - 下載
jdk-8u152-linux-x64.tar.gz并復(fù)制到/usr/local/docker/runner/environment - 下載
apache-maven-3.5.3-bin.tar.gz并復(fù)制到/usr/local/docker/runner/environment
daemon.json
在 /usr/local/docker/runner/environment 目錄下創(chuàng)建 daemon.json,用于配置加速器和倉庫地址
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.10.133:5000"
]
}
Dockerfile
在 /usr/local/docker/runner/environment 目錄下創(chuàng)建 Dockerfile
FROM gitlab/gitlab-runner
MAINTAINER Lusifer <topsale@vip.qq.com>
# 修改軟件源
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
apt-get update -y && \
apt-get clean
# 安裝 Docker
RUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && \
apt-get update -y && \
apt-get install -y docker-ce
COPY daemon.json /etc/docker/daemon.json
# 安裝 Docker Compose
WORKDIR /usr/local/bin
RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
RUN chmod +x docker-compose
# 安裝 Java
RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
COPY jdk-8u152-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \
rm -fr jdk-8u152-linux-x64.tar.gz
# 安裝 Maven
RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
# RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.5.3-bin.tar.gz
COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \
rm -fr apache-maven-3.5.3-bin.tar.gz
# COPY settings.xml /usr/local/maven/apache-maven-3.5.3/conf/settings.xml
# 配置環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_152
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
WORKDIR /
docker-compose.yml
在 /usr/local/docker/runner 目錄下創(chuàng)建 docker-compose.yml
version: '3.1'
services:
gitlab-runner:
build: environment
restart: always
container_name: gitlab-runner
privileged: true
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
注冊 Runner
docker exec -it gitlab-runner gitlab-runner register
# 輸入 GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.10.132/
# 輸入 GitLab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh
# 輸入 Runner 的說明
Please enter the gitlab-ci description for this runner:
可以為空
# 設(shè)置 Tag,可以用于指定在構(gòu)建規(guī)定的 tag 時觸發(fā) ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
# 這里選擇 true ,可以用于代碼上傳后直接執(zhí)行
Whether to run untagged builds [true/false]:
true
# 這里選擇 false,可以直接回車,默認為 false
Whether to lock Runner to current project [true/false]:
false
# 選擇 runner 執(zhí)行器,這里我們選擇的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell, ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
使用 Runner
GitLab CI 地址與令牌參數(shù)
項目 –> 設(shè)置 –> CI/CD –> Runner 設(shè)置

.gitlab-ci.yml
在項目工程下編寫 .gitlab-ci.yml 配置文件:
stages:
- install_deps
- test
- build
- deploy_test
- deploy_production
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
- dist/
# 安裝依賴
install_deps:
stage: install_deps
only:
- develop
- master
script:
- npm install
# 運行測試用例
test:
stage: test
only:
- develop
- master
script:
- npm run test
# 編譯
build:
stage: build
only:
- develop
- master
script:
- npm run clean
- npm run build:client
- npm run build:server
# 部署測試服務(wù)器
deploy_test:
stage: deploy_test
only:
- develop
script:
- pm2 delete app || true
- pm2 start app.js --name app
# 部署生產(chǎn)服務(wù)器
deploy_production:
stage: deploy_production
only:
- master
script:
- bash scripts/deploy/deploy.sh
上面的配置把一次 Pipeline 分成五個階段:
- 安裝依賴(install_deps)
- 運行測試(test)
- 編譯(build)
- 部署測試服務(wù)器(deploy_test)
- 部署生產(chǎn)服務(wù)器(deploy_production)
注意: 設(shè)置 Job.only 后,只有當 develop 分支和 master 分支有提交的時候才會觸發(fā)相關(guān)的 Jobs。
節(jié)點說明:
- stages:定義構(gòu)建階段,這里只有一個階段 deploy
- deploy:構(gòu)建階段 deploy 的詳細配置也就是任務(wù)配置
- script:需要執(zhí)行的 shell 腳本
- only:這里的 master 指在提交到 master 時執(zhí)行
- tags:與注冊 runner 時的 tag 匹配
測試集成效果
所有操作完成后 push 代碼到服務(wù)器,查看是否成功:

passed 表示執(zhí)行成功
其它命令
- 刪除注冊信息
gitlab-ci-multi-runner unregister --name "名稱"
- 查看注冊列表
gitlab-ci-multi-runner list
附:項目配置 Dockerfile 案例
FROM openjdk:8-jre
MAINTAINER Lusifer <topsale@vip.qq.com>
ENV APP_VERSION 1.0.0-SNAPSHOT
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
&& rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
RUN mkdir /app
COPY myshop-service-user-provider-$APP_VERSION.jar /app/app.jar
ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "tcp://192.168.10.131:3306", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
EXPOSE 8501