一、升级Git版本
- 如果使用的是最新版的GitLabRunner,需要确保Git是最新版本,否则后续会出现报错:
There is an unknown failure, please try again
-
升级git版本
# 删除旧版本git yum remove git -y # 获取新版本git wget https://www.kernel.org/pub/software/scm/git/git-2.42.0.tar.gz # 解压缩 tar -xvf git-2.42.0.tar.gz # 编译安装 cd git-2.42.0 ./configure --prefix=/usr/local all make & make install # 验证版本 git --version -
升级过程中的问题解决
-
configure: error: no acceptable C compiler found in $PATH
- 问题描述:没有C编译器
- 解决方案:
yum -y install gcc
-
致命错误: zlib.h:没有那个文件或目录
- 问题描述:缺少对应的库文件
- 解决方案:
yum install zlib #此时敲Tab会自动补全 yum install zlib-devel.x86_64
二、安装
2.1 基于docker安装
暂未使用,参考地址:zhuanlan.zhihu.com/p/109820989
2.2 基于yum安装
-
将Gitlab Runner安装到不同的机器上,在构建任务运行期间不会影响到GitLab的性能
-
增加GitLab官方仓库
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash -
安装最新版本:
yum install -y gitlab-ci-multi-runner -
修改Runner配置:
vi /etc/systemd/system/gitlab-runner.service ExecStart=/usr/lib/gitlab-runner/gitlab-runner "run" "--working-directory" "/data/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "root" -
设置docker权限
# 主要是后续的Runner需要使用Docker usermod -aG docker gitlab-runner -
执行注册
gitlab-runner register Running in system-mode. Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/): ${gitlab项目配置中显示的ip} Please enter the gitlab-ci token for this runner: ${gitlab项目配置中显示的token} Please enter the gitlab-ci description for this runner: [bb6040f1cd04]: ${这个runner的说明} Please enter the gitlab-ci tags for this runner (comma separated): ${这个runner需要运行哪些tag,比如maven,test,java等等标签} Whether to run untagged builds [true/false]: [false]: ${是否运行未打标的构建} Whether to lock Runner to current project [true/false]: [false]: ${是否将运行程序锁定到当前项目} Please enter the executor: docker-ssh, shell, ssh, virtualbox, docker+machine, custom, parallels, docker-ssh+machine, kubernetes, docker: ${这个runner需要运行在哪?docker或者shell等} Please enter the default Docker image (e.g. ruby:2.6): ${选择docker之后,需要配置这个runner默认的根镜像} Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! -
注册成功后,会添加到
/etc/gitlab-runner/config.toml中,每配置一个 runner 就会在配置文件中生成一个[[runners]]。# 修改runner concurrent = 1 # 可并行运行的数量 check_interval = 0 [[runners]] name = "dev" url = "http://192.168.141.128:9091/" token = "u8_Y5rLQazUmBZar9eys" executor = "docker" [runners.custom_build_dir] [runners.docker] tls_verify = false image = "docker:latest" privileged = true # 默认为 false,需改为 true。自动跳过health check。 disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache","/usr/local/maven:/root/.m2"] # 修改cache目录 shm_size = 0 [runners.cache] -
修改最大作业超时时间(Maximum job timeout)
三、配置pipelines
- 指定为当前项目主CI文件即可:
.gitlab-ci.yml
3.1 .gitlab-ci.yml 配置详解
更多配置,参考:segmentfault.com/a/119000001…
| 值 | 是否必须 | 描述 |
|---|---|---|
| script | 必须 | 定义由Runner执行的shell脚本或命令 |
| extends | 非必须 | 定义此作业将继承的配置条目 |
| image | 非必须 | 需要使用的docker镜像,请查阅该文档 |
| services | 非必须 | 定义所需的docker服务,请查阅该文档 |
| stage | 非必须 | 定义一个工作场景阶段,默认是test |
| type | 非必须 | stage的别名,不赞成使用 |
| variables | 非必须 | 在job级别上定义的变量 |
| only | 非必须 | 定义job所引用的git分支 |
| except | 非必须 | 定义job所不适用的git分支 |
| tags | 非必须 | 定义job所适用的runner,tags为runner标签 |
| allow_failure | 非必须 | 允许任务失败,但是如果失败,将不会改变提交状态 |
| when | 非必须 | 定义了job什么时候执行,可以是on_success、on_failure、always和manual |
| dependencies | 非必须 | 定义了该job依赖哪一个job,如果设置该项,可以通过artifacts设置 |
| artifacts | 非必须 | 工件,在依赖项之间传递的东西,类似cache,但原理与cache不同 |
| cache | 非必须 | 定义需要被缓存的文件、文件夹列表 |
| before_script | 非必须 | 覆盖在作业之前执行的脚本或命令 |
| after_script | 非必须 | 覆盖在作业之后执行的脚本或命令 |
| environment | 非必须 | 定义让job完成部署的环境名称 |
| coverage | 非必须 | 定义job设置代码覆盖率 |
| retry | 非必须 | 定义job失败后的自动重试次数 |
3.2 GitLab Runner 常见问题及介绍
跳转链接:www.jianshu.com/p/19fe0ce7e…
3.3 在安装GitLabRunner的机器上安装docker
需要确保安装了Docker,否则无法使用docker的方式运行。
ERROR: Preparation failed: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
3.4 自制Maven镜像
3.4.1 制作Maven1.8镜像
制作内容详见:www.jianshu.com/p/64b1d2140…
- 创建文件夹:
mkdir/docker-file/maven` - 切换到目录下
- 创建settings.xml文件,包含nexus仓库和可用账号(用于拉取依赖和推送依赖包)
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 设置本地仓库路径 -->
<localRepository>/usr/share/maven/ref/repository</localRepository>
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<!-- 服务器 用户名密码配置 -->
<servers>
<server>
<id>release</id>
<username>账号</username>
<password>密码</password>
</server>
<server>
<id>snapshots</id>
<username>账号</username>
<password>密码.</password>
</server>
</servers>
<!-- 镜像配置,阿里云 -->
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>nexus-public</id>
<mirrorOf>central</mirrorOf>
<name>Nexus public</name>
<url>http://192.168.1.101:8081/repository/maven-public/</url>
</mirror>
</mirrors>
<!-- 环境配置,多款环境,多套配置 -->
<profiles>
<!-- default 环境 -->
<profile>
<id>default</id>
<repositories>
<repository>
<id>release</id>
<name>release</name>
<url>http://192.168.1.101:8081/repository/maven-public/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://192.168.1.101:8081/repository/maven-snapshots/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<properties>
<repository.id>release</repository.id>
<repository.name>release</repository.name>
<repository.url>http://192.168.1.101:8081/repository/maven-public/</repository.url>
<repository-snapshots.id>snapshots</repository-snapshots.id>
<repository-snapshots.name>snapshots</repository-snapshots.name>
<repository-snapshots.url>http://192.168.1.101:8081/repository/maven-snapshots/</repository-snapshots.url>
</properties>
</profile>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<repositories>
<repository>
<id>release</id>
<name>release</name>
<url>http://192.168.1.101:8081/repository/192.168.1.101-dev/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://192.168.1.101:8081/repository/192.168.1.101-dev-snapshots/</url>
<releases><enabled>false</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<properties>
<repository.id>release</repository.id>
<repository.name>release</repository.name>
<repository.url>http://192.168.1.101:8081/repository/maven-snapshots/</repository.url>
<repository-snapshots.id>snapshots</repository-snapshots.id>
<repository-snapshots.name>snapshots</repository-snapshots.name>
<repository-snapshots.url>http://192.168.1.101:8081/repository/192.168.1.101-dev-snapshots/</repository-snapshots.url>
</properties>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<repositories>
<repository>
<id>release</id>
<name>release</name>
<url>http://192.168.1.101:8081/repository/192.168.1.101-test/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://192.168.1.101:8081/repository/192.168.1.101-test-snapshots/</url>
<releases><enabled>false</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<properties>
<repository.id>release</repository.id>
<repository.name>release</repository.name>
<repository.url>http://192.168.1.101:8081/repository/192.168.1.101-test/</repository.url>
<repository-snapshots.id>snapshots</repository-snapshots.id>
<repository-snapshots.name>snapshots</repository-snapshots.name>
<repository-snapshots.url>http://192.168.1.101:8081/repository/192.168.1.101-test-snapshots/</repository-snapshots.url>
</properties>
</profile>
<!-- release环境 -->
<profile>
<id>release</id>
<repositories>
<repository>
<id>release</id>
<name>release</name>
<url>http://192.168.1.101:8081/repository/192.168.1.101-release/</url>
<releases><enabled>true</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://192.168.1.101:8081/repository/192.168.1.101-test-snapshots/</url>
<releases><enabled>false</enabled></releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<properties>
<repository.id>release</repository.id>
<repository.name>release</repository.name>
<repository.url>http://192.168.1.101:8081/repository/192.168.1.101-release/</repository.url>
<repository-snapshots.id>snapshots</repository-snapshots.id>
<repository-snapshots.name>snapshots</repository-snapshots.name>
<repository-snapshots.url>http://192.168.1.101:8081/repository/192.168.1.101-test-snapshots/</repository-snapshots.url>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>default</activeProfile>
</activeProfiles>
</settings>
- 创建Dockerfile
FROM maven:3.6.0-jdk-8-alpine
COPY settings.xml /usr/share/maven/ref/
- 打包镜像(需要保证安装gitlab runner的机器上有该镜像)
docker build -t ip:port/项目名/maven3.6.0-jdk8:v1 .
3.4.2 基于jdk制作Maven镜像
制作参考:blog.csdn.net/qq_33285112…
四、项目配置
4.1 主文件CI
variables:
# 项目配置
PROJECT_NAME: "project/dev" # 项目名称
# maven配置
MAVEN_OPTS: "-Dmaven.repo.local=/usr/share/maven/ref/repository -Dmaven.test.skip=true -P dev"
# 用到的公共镜像定义
IMAGE_DOCKER: "docker:19.03"
IMAGE_MAVEN_17: "ip:port/项目名/maven3.6.3-jdk17:v2"
# 模块路径名称
PJ_NAME_TEST_CASE: "springboot-test-case"
stages:
# 开发环境
- dev-build # 打 maven 打包
# 加载子项目的CICD文件
include:
- local: "/springboot-test-case/.gitlab-ci.yml"
4.2 主文件POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.alpha</groupId>
<artifactId>a-test</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>a-test</name>
<modules>
<module>springboot-test-case</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.7</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
</properties>
<!-- 项目部署私仓 -->
<distributionManagement>
<repository>
<id>${repository.id}</id>
<name>${repository.name}</name>
<!--suppress UnresolvedMavenProperty -->
<url>${repository.url}</url>
<layout>default</layout>
</repository>
<snapshotRepository>
<id>${repository-snapshots.id}</id>
<name>${repository-snapshots.name}</name>
<!--suppress UnresolvedMavenProperty -->
<url>${repository-snapshots.url}</url>
<layout>default</layout>
</snapshotRepository>
</distributionManagement>
</project>
4.3 子文件CI
########################### 开发环境 ##########################
# maven打包
dev-maven-build-test-case:
stage: dev-build
image: $IMAGE_MAVEN_17
script:
- echo "start $PJ_NAME_TEST_CASE maven build...."
# 开始编译
- cd $PJ_NAME_TEST_CASE
- mvn -version
- mvn clean deploy $MAVEN_OPTS_DEV
- echo "build $PJ_NAME_TEST_CASE maven success"
only:
refs:
- dev
# 仅当文件改变时执行,注意:此处不能用环境变量
changes:
- springboot-test-case/**/*
tags:
- maven
# 打包成docker镜像并上传到仓库中
# 发布到k8s集群中
五、Gitlab三种runner创建和使用
链接记录:blog.csdn.net/weixin_4387…
六、流水线效果
-
流水线执行情况
-
依赖包上传情况