GitLab-Runner使用
1.HelloWorld
安装完了gitlab-runner,就可以使用了。在项目的根目录下创建.gitlab-ci.yml文件,编写如下内容。
1 | stages: |
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 | [[runners]] |
当使用” if-not-present拉取策略时,运行程序将首先检查image是否在本地存在. 如果是,则将使用image的本地版本. 否则,Runner将尝试拉取远程镜像。修改了此文件,重启gitlab-runner
1 | ## 重启gitlab-runner |
这样说起来,其实使用docker作为执行器还是不方便的。
(3) 执行
代码中我定义了一个image:centos:7.2.1511,本地没有,所以会去远程拉取镜像
1 | image: centos:7.2.1511 |
最后输出的系统版本也是: 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 | # 切换用户 |
【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 | stages: # 阶段 |
说明:
- 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 | deploy-serve: |
【1】.手动打jar包,利用GilLab CI/CD流水线(.gitLab-ci.yml文件)自动打jar并放到服务器运行。 这里用scp的方式部署了jar,大部分都是图片,所以还是要自己写。
【2】.scp覆盖命令 这里是文件目录的问题。
【3】.为什么SCP传输没有覆盖 这里其实也是说的是文件夹的覆盖
5.配置文件
1 | only: |
【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 | [[runners]] |
1.Docker搭建自己的Gitlab CI Runner
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 | # 查看 |
【解决方案】
使用yum重新安装nodejs
1 | # https://github.com/nodesource/distributions#rpminstall |
【1】.GitLab CI/CD - npm not found
【2】.Use pnpm in diferent Gitlab CI stages
【3】.Nvm in Gitlab-ci script and ssh
【4】.GitLab的环境变量配置指南
【5】.【问题解决】gitlab-runner更改执行用户 切换用户
【6】.修改 gitlab runner 默认用户 (gitlab-runner) 为 root
【7】.如何在Linux中安装NVM(Node Version Manager)
【8】.Linux环境yum安装nodejs curl -sL https://rpm.nodesource.com/setup_17.x | bash -
【9】.在CentOS 7上安装Node.js的4种方法(yum安装和源码安装) 源码安装,使用EPEL安装 (yum安装方式),使用已编译版本安装,通过NVM安装
在 GitLab CI/CD 中通过 SCP 运行 Composer 和 npm 脚本 如何将文件传输到实时服务器,如何部署
4.Job’s log exceeded limit of 4194304 bytes
【解决方案】
1 | # 编辑 runner配置文件 |
【1】.Gitlab CI/CD job’s log exceeded limit
【2】.Job’s log exceeded limit of 4194304 bytes. output_limit = 10240