gitlab ci, gradle,gitlab-runner shell示例
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,要下载依赖包时间也会比较久。

更多推荐


所有评论(0)