GitLabRunner

1,963 阅读1分钟

一、升级Git版本

  1. 如果使用的是最新版的GitLabRunner,需要确保Git是最新版本,否则后续会出现报错:There is an unknown failure, please try again

image.png

  1. 升级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
    
  2. 升级过程中的问题解决

  • 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安装

  1. 将Gitlab Runner安装到不同的机器上,在构建任务运行期间不会影响到GitLab的性能

  2. 增加GitLab官方仓库

    curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
    
  3. 安装最新版本:yum install -y gitlab-ci-multi-runner

  4. 修改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"
    
  5. 设置docker权限

    # 主要是后续的Runner需要使用Docker
    usermod -aG docker gitlab-runner
    
  6. 执行注册

    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!
    
  7. 注册成功后,会添加到/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]
    

  8. 修改最大作业超时时间(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…

  1. 创建文件夹:mkdir /docker-file/maven`
  2. 切换到目录下
  3. 创建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>
  1. 创建Dockerfile
FROM maven:3.6.0-jdk-8-alpine
COPY settings.xml /usr/share/maven/ref/
  1. 打包镜像(需要保证安装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…

六、流水线效果

  1. 流水线执行情况

  2. 依赖包上传情况

七、GitLab-Runner配置参数详解

链接记录:www.jianshu.com/p/6decaed7b…