GitLab Runner
# GitLab Runner
在了解完GitLab持续集成的相关概念后,接着就要去了解怎么做了。
# 概述
GitLab Runner 负责执行先前描述的构建任务。GitLab Runner 可以安装在不同的机器上,与GitLab CI是分开的,在构建任务运行期间并不会影响到 GitLab 的性能。
为什么不直接让GitLab CI来允许构建任务?因为一般来说,构建任务都会占用很多的系统资源 (譬如编译代码),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 来运行构建任务的话,在执行构建任务的时候,GitLab 的性能会大幅下降。此外,GitLab CI 最大的作用是管理各个项目的构建状态,因此,运行构建任务这种浪费资源的事情就交给 GitLab Runner 来做。
# 安装 GitLab Runner
所以一般情况下,会专门有一台专门用于部署的服务器。这里列出Ubuntu以及Ubuntu Docker安装GitLab Runner的方式:
# Ubuntu安装脚本
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
sudo apt-get update
sudo apt-get install gitlab-ci-multi-runner
# Docker安装脚本
我们也可是使用 Docker 来部署 GitLab Runner。
环境说明和准备:
OS:Ubuntu 20.04.1 LTS
创建工作目录
/usr/local/docker/runner
创建构建目录
/usr/local/docker/runner/environment
,并完成以下准备工作下载对应的 JDK 安装包并复制到
environment
目录下载对应的 Maven 安装包并复制到
environment
目录下载对应的 docker-compose 二进制执行文件并复制到
environment
目录以上三步,也可以使用软件包的安装方式,但是不建议,因为下载需要时间、况且这种基本上很少会改变。(PS:离线安装需要注意版本问题)
创建
daemon.json
,用于配置加速器和仓库地址{ "registry-mirrors": [ "https://registry.docker-cn.com" ], "insecure-registries": [ "ip:port" ] }
创建
init.sh
,用于初始化脚本,如果不需要进行一些权限配置,可忽略改步骤#!/bin/bash # 权限配置 gpasswd -a gitlab-runner root gpasswd -a gitlab-runner docker chown root:root /var/run/docker.sock chmod +775 /var/run/docker.sock # mvn配置 mkdir -p /home/gitlab-runner/.m2/repository chown -R gitlab-runner /home/gitlab-runner/.m2/repository chown -R gitlab-runner /usr/local/maven newgrp root newgrp docker
创建Dockerfile,仅供参考,例如gitlab-runner的版本、软件源的配置、JDK版本等等请根据自己实际情况修改。
注意此处有个坑,容器的里面的ubuntu版本与宿主机版本可能不一致,像我的宿主机环境Ubuntu版本为20.04.3 LTS、代号focal,而gitlab-runner容器里面是trusty,(进入容器交互,输入
lsb_release -cs
查看),导致我在修改软件源之后的操作都会出现问题。FROM gitlab/gitlab-runner:v10.6.0 # 修改软件源 RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse' > /etc/apt/sources.list && \ echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse' >> /etc/apt/sources.list && \ echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse' >> /etc/apt/sources.list && \ echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse' >> /etc/apt/sources.list && \ echo 'deb http://mirrors.aliyun.com/ubuntu/ trusty-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 curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose COPY docker-compose /usr/local/bin RUN chmod +551 docker-compose # 初始化脚本,例如进行一些权限配置,容器启动后手动执行 COPY init.sh /usr/local/bin RUN chmod +x init.sh # 安装 Java RUN mkdir -p /usr/local/java WORKDIR /usr/local/java COPY openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz /usr/local/java RUN tar -zxvf openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz && \ rm -fr openjdk-8u41-b04-linux-x64-14_jan_2020.tar.gz # 安装 Maven RUN mkdir -p /usr/local/maven WORKDIR /usr/local/maven COPY apache-maven-3.6.3-bin.tar.gz /usr/local/maven RUN tar -zxvf apache-maven-3.6.3-bin.tar.gz && \ rm -fr apache-maven-3.6.3-bin.tar.gz COPY settings.xml /usr/local/maven/apache-maven-3.6.3/conf/settings.xml # 配置环境变量 ENV JAVA_HOME /usr/local/java/java-se-8u41-ri ENV MAVEN_HOME /usr/local/maven/apache-maven-3.6.3 ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin WORKDIR /
# docker-compose.yml
在 /usr/local/docker/runner
目录下创建 docker-compose.yml
,其中数据卷我将Maven的仓库持久化了,大家根据自己的setting.xml
文件做改动即可。
version: '3.1'
services:
gitlab-runner:
build: environment
restart: always
container_name: gitlab-runner
privileged: true
volumes:
- /usr/local/docker/runner/config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
- /usr/local/docker/runner/m2:/home/gitlab-runner/.m2/repository
最后在当前目录下,执行docker-compose up -d
命令,执行成功后,GitLab Runner 就安装完成了,可以参考以下命令执行:
$ docker-compose up -d
....
Creating gitlab-runner ... done
# 容器启动成功后,如果配置了初始化脚本,可以执行以下命令执行脚本
$ docker exec -it gitlab-runner init.sh
Adding user gitlab-runner to group root
安装的其他配置补充:在某些场景下为保证能够正常集成,我们可能还需要一些其它配置,建议将这些步骤写入到init.sh
中:
账户权限问题:安装完 GitLab Runner 后,系统会增加一个 gitlab-runner 账户,每次集成的操作 GitLab Runner 都是用这个 账户操作的。我们将它加进 root 组:
## 账户权限配置 gpasswd -a gitlab-runner root newgrp root
操作目录权限问题,gitlab-runner 账号可能没有操作某些文件的权限情况下:
## 配置操作目录的权限 chmod 775 xxx
# 注册 Runner
参考以下步骤,为每个项目注册Runner。
PS:每个项目的注册令牌,见项目->设置->CI/CD->Runners 设置->展开。
# 执行注册命令
$ docker exec -it gitlab-runner gitlab-runner register
Running in system-mode.
# 输入 GitLab CI 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.0.111:8080/
# 输入 GitLab CI Token
Please enter the gitlab-ci token for this runner:
rUTY3xFPYPdSCxY7uTqs
# 输入 Runner 的说明,可以为空,建议给个合理的描述,便于区分
Please enter the gitlab-ci description for this runner:
[ecbcddf05373]:
# 代码上传后会触发构建,这里true
# Whether to run untagged builds [true/false]:
# [false]: true
# 设置 Tag,可以用于指定在构建规定的 tag 时触发 ci
Please enter the gitlab-ci tags for this runner (comma separated):
# 这里选择 false
Whether to lock the Runner to current project [true/false]:
[true]: false
Registering runner... succeeded runner=rUTY3xFP
# 选择 Runner 执行器,这里选择的是 shell
Please enter the executor: docker+machine, kubernetes, docker, parallels, shell, virtualbox, docker-ssh, ssh, docker-ssh+machine:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
绑定成功后,可以在项目的CI/CD设置中看到绑定的Runner:
其他指令:
# 删除注册信息
$ docker exec -it gitlab-runner gitlab-ci-multi-runner unregister --name "名称"
# 查看注册列表
$ docker exec -it gitlab-runner gitlab-ci-multi-runner list
# .gitlab-ci.yml
在目标项目工程下编写 .gitlab-ci.yml
配置文件。该文件是提供给 GitLab Runner 执行 GitLab CI 的配置文件,让我们定义 Pipeline、Stages、Jobs。
下面是一个参考示例,将阶段划分为:构建、测试、部署,可以根据实际情况调整,注意每个阶段 gitlab-runner 都会清理一些上一个阶段生成的“无用的文件”:
stages:
- build
- test
- deploy_test
- deploy_prod
# 编译
build:
stage: build
# 指在提交到 develop、master 时执行
only:
- develop
- master
script:
- mvn clean package
# 运行测试用例
test:
stage: test
only:
- develop
- master
script:
- mvn test
# 部署测试服务器
deploy_test:
stage: deploy_test
only:
- develop
script:
- bash scripts/deploy/deploy-test.sh
# 部署生产服务器
deploy_production:
stage: deploy_production
only:
- master
script:
- bash scripts/deploy/deploy-prod.sh
其他示例:
stages:
- build
- push
- deploy
- clean
build:
stage: build
script:
- /usr/local/maven/apache-maven-3.6.3/bin/mvn clean package
- cp target/itoken-config-1.0.0-SNAPSHOT.jar docker
- cd docker
- Docker build -t 192.168.0.111:9090/itoken/itoken-config .
push:
stage: push
script:
- Docker login 192.168.0.111:9090 -u admin -p Harbor12345
- Docker push 192.168.0.111:9090/itoken/itoken-config
deploy:
stage: deploy
script:
- cd docker
- Docker-compose down
- Docker-compose up -d
clean:
stage: clean
script:
- if [[ $(docker images -q -f dangling=true) != '' ]]; then docker rmi $(docker images -q -f dangling=true); fi;
# 集成效果
# 项目Dockerfile
假如使用Docker来构建镜像、容器方式运行,下面提供一个项目用的Dockerfile参考:
PS:dockerize 这个插件通过 github 下载可能会比较慢,建议通过别的方式去处理,这里不做展开描述。
FROM openjdk:8u302-jre
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
WORKDIR /app
COPY itoken-eureka-$APP_VERSION.jar /app/app.jar
ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "tcp://192.168.0.112:8888", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=dev"]
EXPOSE 8761