GitLab-Runner使用

标签: Git 分类: 软件 创建时间:2020-04-03 06:50:32 更新时间:2025-01-17 10:39:22

1.HelloWorld

安装完了gitlab-runner,就可以使用了。在项目的根目录下创建.gitlab-ci.yml文件,编写如下内容。

1
2
3
4
5
6
7
8
9
10
stages:
- deploy
deploy:
stage: deploy
script:
- cat /etc/redhat-release
only:
- master
tags:
- shell_65

script 是必须的,表明要执行的脚本,tags 表示要在哪个runner执行。编写了这个文件之后,提交代码,就会自动执行CI/CD命令。

2.Docker

(1) 说明
GitLab-Runner中有一类执行器,是docker,这里的docker不是使用docker安装gitlab-runner,而是gitlab-runner的执行器类型docker,像参考文章1和2,都是说的是如何在docker的镜像中安装gitlab-runner,显然不符合我们的要求。

根据参考资料显示,在.gitlab-ci.yml中定义image 镜像时,gitlab会拉取远程镜像,然后执行脚本。官方文档执行器-docker 一章中明确表示:

The always pull policy will ensure that the image is always pulled. When always is used, the Runner will try to pull the image even if a local copy is available. If the image is not found, then the build will fail with an error similar to:

意思就是说:always 策略将确保始终拉取远程镜像,在使用 always 策略时,即使有本地副本,Runner也将尝试拉取远程镜像,如果找不到该镜像,则构建失败,并显示错误。

(2) 修改拉取策略

知道问题所在了,那就可以修改这个策略了。打开 /etc/gitlab-runner/config.toml,在对应的runner节点下,添加pull_policy = “if-not-present” 就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[[runners]]
name = "agent_192.168.1.65"
url = "http://192.168.1.60"
token = "hJPohBwUx8tDf8n5Wjas"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.docker]
tls_verify = false
image = "centos"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0

pull_policy = "if-not-present"

当使用” if-not-present拉取策略时,运行程序将首先检查image是否在本地存在. 如果是,则将使用image的本地版本. 否则,Runner将尝试拉取远程镜像。修改了此文件,重启gitlab-runner

1
2
## 重启gitlab-runner
gitlab-runner restart

这样说起来,其实使用docker作为执行器还是不方便的。

(3) 执行
代码中我定义了一个image:centos:7.2.1511,本地没有,所以会去远程拉取镜像

1
2
3
4
5
6
7
8
9
10
11
12
image: centos:7.2.1511

stages:
- deploy
deploy:
stage: deploy
script:
- cat /etc/redhat-release
only:
- master
tags:
- docker_65

最后输出的系统版本也是: CentOS Linux release 7.2.1511 (Core) ,在安装gitlab-runner的服务器上,使用docker ls查看,也多出了一个 centos:7.2.1511 的镜像。

参考文章:
1.Docker搭建自己的Gitlab CI Runner
2.gitlab-runner Docker安装
3.gitlab-runner使用docker执行器,无法获取本地镜像。 (根据这个文章,有点入门了,这里告诉我们,gitlab-runner每次都会去拉取镜像,然后执行相关的操作,而不是使用本地镜像)
4.The Docker executor
5.gitlab runner 优化

3.scp免密登陆

1
2
3
4
5
6
7
8
9
# 切换用户
su gitlab-runner
# 生成密钥
ssh-keygen -t rsa -P ""
# 拷贝密钥到远程
ssh-copy-id -i .ssh/id_rsa.pub -p 端口号 用户名字@192.168.x.xxx

# 免密登陆
ssh -p 端口号 用户名字@192.168.x.xxx
参考文章:
【1】.ssh 带端口登录
【2】.在配置SSH免密登录时报错:/usr/bin/ssh-copy-id: ERROR: failed to open ID file ‘/root/.pub’: 没有那个文件或目录
【3】.SCP免密传输和SSH登录协议详解 预备知识:对称加密、非对称加密、
【4】.Linux SSH免密码登录与拷贝文件(SCP) 生成:ssh-keygen -t rsa -P “”,拷贝快捷方式:ssh-copy-id -i ~/.ssh/id_rsa.pub root@服务器地址
【5】.rsync同步文件如何指定服务器端口 rsync -avuz -e ‘ssh -p 2222’ user@remote-server:/path/to/remote/folder

4.前端部署

在项目的根目录下创建 .gitlab-ci.yml 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
stages: # 阶段
- deploy

cache: # 缓存
paths:
- jeecgboot-vue3/node_modules

deploy-job:
tags: # runner标签
- dev
stage: deploy # 阶段
script: # 执行脚本
- cd jeecgboot-vue3
- pnpm config set registry https://registry.npmmirror.com
- pnpm install
- pnpm build #打包指令本文package.json文件scripts配置的是build:prod,执行该指令会打包生成dist目录
- rsync -r --delete ./dist/* -e 'ssh -p 7022' hj@xxxxx:/home/hj/drone/drone-cloud #将本地开发主机上的dist文件同步到远程服务器的对应目录下
only: # 定义分支
- hjkj

说明:

  • tags:执行的runner的标签
  • only:执行的分支,或者条件
参考文章:
【1】.Gitlab CI/CD 自动化打包部署前端(vue)项目 这篇文章讲了如何复制前端文件的方法,使用 scp 进行复制
【2】.gitlab实现VUE项目的dist打包文件全自动同步部署到远程nginx服务器上 配置rsync的密钥
【3】.gitlab-把ci工作指定给专用的runner执行。
【4】.通过 .gitlab-ci.yml配置任务
【5】.gitlab持续集成CI/CD在.gitlab-ci.yml文件中执行shell脚本 开始打包,执行脚本,执行结束。chmod a+x ./scripts/build/test.sh

5.jar部署

大部分的文章都是使用docker部署,但是我想要使用 jar 部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
deploy-serve:
tags:
- dev
stage: deploy
script:
- cd jeecg-boot
- export JAVA_HOME=/usr/local/java/openjdk-17.0.12
- export PATH=$JAVA_HOME/bin:$PATH
- mvn clean package -Pprod
- ssh -p 7022 hj@$HOST_ALIYUN 'cd /home/hj/drone;rm -rf drone-cloud\.jar'
- scp -P 7022 -r ./jeecg-module-system/jeecg-system-start/target/drone-cloud\.jar hj@$HOST_ALIYUN:/home/hj/drone/drone-cloud\.jar #将本地开发主机上的dist文件同步到远程服务器的对应目录下
- ssh -p 7022 hj@$HOST_ALIYUN 'kill -9 `pgrep -f drone-cloud\.jar` ; echo 1'
- ssh -p 7022 hj@$HOST_ALIYUN 'cd /home/hj/drone;nohup /usr/local/java/jdk-17.0.2/bin/java -jar drone-cloud\.jar > /dev/null 2>&1 &'
# rules:
# - if: '$CI_COMMIT_BRANCH == "hjkj"' # 定义分支
# changes: # 文件改变
# - mini-webview/**/*
# when: on_success
when: manual # 手动触发
参考文章:
【1】.手动打jar包,利用GilLab CI/CD流水线(.gitLab-ci.yml文件)自动打jar并放到服务器运行。 这里用scp的方式部署了jar,大部分都是图片,所以还是要自己写。
【2】.scp覆盖命令 这里是文件目录的问题。
【3】.为什么SCP传输没有覆盖 这里其实也是说的是文件夹的覆盖

5.配置文件

1
2
3
only:
changes:
- frontend/**/*
参考文章:
【1】.gitlab ci only changes某目录下任意文件改变时触发job 表示 frontend 文件夹下的文件 任意文件改变时触发 job
【2】.GitLab CI流水线配置文件.gitlab-ci.yml详解
【3】.CI/CD之gitlab-ci.yml配置 使用关联方式安装nodejs时,gitlab的CI/CD中无法检测到node,也就无法使用npm,会报错:npm: command not found
【4】..gitlab-ci.yml 文件 在.gitlab-ci.yml文件中,您可以定义:要运行的脚本。要包含的其他配置文件和模板。依赖项和缓存。要按顺序运行的命令和要并行运行的命令。将应用程序部署到的位置。无论您是想自动运行脚本还是手动触发它们中的任何一个。
【5】.Gitlab CI/CD: rules和only 分支-rules:- if: ‘$CI_COMMIT_BRANCH == “main”‘ when: on_success

问题

1.ERROR: Job failed: Error response from daemon: pull access denied for center, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied (docker.go:196:18s)

镜像不存在的错误:

(2) Maven依赖
在参考文章中,还提到了一个问题:

每次maven:3-jdk-8去执行build和test都会重新拉取镜像,下载依赖的jar包,比较耗时耗资源。这是因为docker image每次构建都是在独立的container里, maven的 .m2文件并不会被多次构建公用,这里我们可以通过修改gitlab-runner的配置,将maven .m2目录加到volumes中,并增加镜像拉取规则(默认是从远程拉取镜像,这里修改为优先获取本地镜像,不存在时才去远程拉取镜像)

这里需要将.m2的目录挂载到docker镜像中,”/Users/wanyang3/.m2:/root/.m2” 意思是将本地 /Users/wanyang3/.m2 挂载成docker镜像的 /root/.m2 目录。

1
2
3
4
5
6
7
[[runners]]
...
[runners.docker]
...
volumes = ["/cache","/Users/wanyang3/.m2:/root/.m2"]
pull_policy = "if-not-present"
...

2.拉取代码失败

我编写了 yml 配置文件,但是拉取代码的时候,没有用 使用ssh拉取,却使用了 http 拉取。致命错误:无法访问 ‘http://192.168.1.8:10007/zjhjkj/drone-cloud.git/':The requested URL returned error: 403

【解决方案】
这个错误就是当前用户没有执行权限,将用户加入到项目中即可。

项目管理(Manage)-> Members -> 找到提交用户,然后加入项目。

参考文章:
【1】.解决gitlab-runner拉取代码失败 将构建目录/home/dev/opbin/gitlab-runner/builds/a64e29e6/0/fe清空,重新执行pipeline,成功!!
【2】.Gitlab Runner执行CI/CD时报错:fatal: unable to access ‘http://gitlab-xxxxxxxxxxxxx/gitlab-instance-xxxxxxx 在我们创建的runner的配置文件中加入参数clone_url = “http://ip:port”, 与url的值相同
【3】.在 GitLab CI/CD 中使用 SSH 密钥
【4】.Gitlab CI, unable to access ‘http://*.git‘: The requested URL returned error: 403 将gitlab的root用户加入项目即可。

3.pnpm:未找到命令

运行 runner 的时候,出现这个问题。

【尝试方案】
(1)后来我尝试了去输出 mvn,这个倒是可以输出的。

(2)尝试使用 .sh 文件

(3)尝试使用docker进行打包

(4)尝试 nvm alais default v20.10.0

(5)尝试修改 gitlab-runner 运行用户

1
2
3
4
5
6
7
8
9
10
# 查看
ps -aux |grep gitlab-runner
# 卸载
gitlab-runner uninstall
# 停止
gitlab-runner stop
# 安装
gitlab-runner install --user gitlab-runner --working-directory /home/gitlab-runner
# 重启
gitlab-runner start

【解决方案】
使用yum重新安装nodejs

1
2
3
4
5
6
7
8
9
10
11
# https://github.com/nodesource/distributions#rpminstall
curl -fsSL https://rpm.nodesource.com/setup_20.x -o nodesource_setup.sh
# 安装源
bash nodesource_setup.sh
# 安装nodejs
yum install -y nodejs

# 设置镜像
npm config set registry https://registry.npmmirror.com

pnpm config set registry https://registry.npmmirror.com

4.Job’s log exceeded limit of 4194304 bytes

【解决方案】

1
2
3
4
5
6
7
# 编辑 runner配置文件
vi /etc/gitlab-runner/config.toml
# 增加
output_limit = 10240

# 重启
gitlab-runner restart
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。