1.背景

虚拟机centos7.9,ip是110.110.110.100,上面安装了gitlab,gitlab-runner,gradle。测试一下ci功能。版本如下:
gitlab:v17.1.1
gitlab-runner:17.9
gradle: 8.11.1

gitlab安装可以看我这个文章:gitlab-ce安装
gradle安装比较简单,就不讲了。

本文实现功能:我本地springboot代码推送到gitlab时,实现自动打jar包功能。

本文不讲gitlab-runner和gitlab-ci.yml具体知识,可以在网上搜一下,很多这方面的资料,本文只是通过一个从零开始的示例感受一下整体流程:
1.先在gitlab上创建runner, 这个runner只是一个“空runner”(姑且这么称呼吧),后端具体执行ci任务的是gitlab-runner。
2.所以要在另一个地方安装好gitlab-runner(我这里是在gitlab同一个机器上安装的),然后gitlab-runner注册到gitlab上的“空runner"(这个“空runner"就能利用gitlab-runner执行任务了)。
3.然后代码push到gitlab上时,runner就能自动执行ci任务。

用代码来比喻的话,gitlab上创建的runner是一个接口,安装的gitlab-runner是具体实现(可能还有其他实现,我还没研究)

2.在gitlab上创建runner

1.创建“New Instance runner"
在这里插入图片描述
1.Tags:随便写,相当于是名称,写自己方便识别的就行。
可以用逗号分割写多个tag,如"macos,shared"。
作用是,在配job时,每个job要指定tag,表示这个job用这个runner执行。
我这里写的是"local",因为我gitlab-runner和gitlab装在同一台机器上,"local"表示用本地的gitlab-runner。
记住这个tags,后面要用。
在这里插入图片描述
把下面这个复制出来,gitlab-runner安装好后,执行这个语句这行,把gitlab-runner注册到创建的这个runner
gitlab-runner register --url http://110.110.110.100:13033 --token glrt-gCLUZyQJHZ8Zw_Bc2tpz
在这里插入图片描述
刚创建好的runner显示如下面第一行(因为还没有gitlab-runner注册上),第二行是我之前注册好的gitlab-runner
在这里插入图片描述

3.安装gitlab-runner

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

这一步会下载安装包,有的包时间比较久,我花了大概1小时。
然后yum install gitlab-runner 直接安装,也会自动安装好git

安装好执行这个,是在gitlab安装runner时生成的。
gitlab-runner register --url http://110.110.110.100:13033 --token glrt-gCLUZyQJHZ8Zw_Bc2tpz
在这里插入图片描述
上图中有三个地方:
第一处直接点键盘”Enter"
第二处输入一个runner名称。
第三处选一个“executor",我选的是"shell",意思是运行centos本地命令,比如打jar包时直接用“gradle bootJar"(前提是我本机上已经安装好了gradle)

也可以看一下这个文件cat /etc/gitlab-runner/config.toml,网上说可以在这个文件中直接注册runner(我还没验证过)。
在这里插入图片描述

这样就注册好了一个runner,再到gitlab上看一下,已经”online"
在这里插入图片描述

4编写.gitlab-ci.yml

在这里插入图片描述
在项目根目录下创建.gitlab-ci.yml这个文件,push到gitlab时,会自动根据这个文件,用注册好的runner执行文件中的job。这是我的文件内容,比较简单

stages:
  - build
  - test
  - deploy

# 构建阶段
build_job:
  stage: build
  tags:
    - local   #这个local,就是我在gitlab上创建runner时指定的tags,意思是这个job用这个runner执行
  script:
    - echo "Building the app..."
    - gradle build

# 测试阶段
test_job:
  stage: test
  tags:
    - local
  script:
    - echo "Running tests..."
    - gradle build  #注意这里我没有测试,所以就写了gradle build代替

# 部署阶段
deploy_job:
  stage: deploy
  tags:
    - local
  script:
    - echo "Deploying the app..."
    -  gradle bootJar
  only:
    - master  # 只在master分支上进行部署

代码push到gitlab会自动执行ci,这是我执行成功的图
在这里插入图片描述
进去看一下日志,到这个目录下:
在这里插入图片描述

/home/gitlab-runner,就是安装gitlab-runner时会创建这个用户,执行任务也用这个用户

执行job时,这是到下面这个目录下,gitlab-runner把我的代码拉到这个目录。
因为我在.gitlab.yml文件配了三个job,注意我们之前在注册gitlab-runner时写的executor是"shell", 所以gitlab-runner本质就是在机器上这个目录下依次执行“gradle build",“gradle build”,"gradle bootJar"这些命令。和我们单独运行gradle命令是一样的。

下图也可以看到所有生成的文件都是gitlab-runner这个用户,所以在.gitlab.yml配的job,gitlab-runner用户在机器上执行相关命令时要有权限,这个要记住
在这里插入图片描述
最终可以看到打出了jar包。
在这里插入图片描述
我们也可以在deploy_job里面执行完”gradle bootJar"后,运行“jar -jar XXX",直接在本地运行程序,也可以把jar包用scp到其他机器,用ssh命令远程执行jar包,总之可以执行任何我们想要的命令,这样实现自动化部署,但注意相关命令gitlab-runner用户要有权限。

关于gitlab-runner用户权限,这里有一个坑点
在这里插入图片描述
我GRADLE_USER_HOME是这个目录/mnt/disk2/java-repository,就是存放java依赖包的地方,我想统一放在这个目录下,就加了这个环境变量,因为这个目录是我用root用户创建的,而gitlab-runner用户没有权限,所有执行“gradle buid"时相关依赖包不能下载到这个目录,就会报错,错误我没有截图下来,就是没有找到一个包。

要把这个目录/mnt/disk2/java-repository权限改成777就行了,因为这个目录一开始是空的,所有gitlab-runner用户执行“gradle buid"产生的文件用户也是gitlab-runner,如下图,所以第一次执行“gradle build"这个job,要下载依赖包时间也会比较久。
在这里插入图片描述

更多推荐