安装gitlab
参考文档:linux安装GitLab教程安装所需基础环境:
git(cenOS7自带的git版本较低,需要升级成最新版本,否则执行自动构建的时候会报错)
jdk1.8
maven
node.js安装gitlab-runner
3.1 添加GitLab官方仓库
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
3.2 安装GitLab Runner
运行以下命令以安装GitLab Runner:
sudo yum install -y gitlab-runner
安装成功后会创建一个gitlab-runner的用户,并且默认使用/home/gitlab-runner目录作为工作目,配置文件默认位于/etc/gitlab-runner/config.toml
3.3 注册Runner
sudo gitlab-runner register
在服务器中运行该命令,并按照提示输入GitLab的URL和Runner的Token,这将链接Runner到GitLab。
3.4启动GitLab Runner服务
完成注册后,你需要启动GitLab Runner服务。运行以下命令启动服务:
sudo systemctl enable gitlab-runnersudo systemctl start gitlab-runner// 查看状态sudo systemctl status gitlab-runner
现在你已经成功安装了GitLab Runner,它已经准备好为你的项目执行CI/CD任务了。
3.5 查看gitlab上的项目是否成功关联gitlab-runner
4. 配置ssh公私钥免密码登录
4.1 在GitLab Runner所在的服务器上执行以下命令来生成SSH密钥对:
ssh-keygen -t rsa
这将在当前用户的主目录中生成一个.ssh文件夹,并在其中包含公钥(id_rsa.pub)和私钥(id_rsa)。
4.2 将公钥添加到远程服务器
将公钥添加到远程服务器的authorized_keys文件中,可以使用以下命令将公钥添加到远程服务器中(回车后输入服务器密码即可):
ssh-copy-id root@192.168.1.88
4.3 执行完命令后可以使用 ssh root@192.168.1.88
测试是否可以免密码登录
- 编写.gitlab-ci.yml脚本,
5.1 参照下图打开gitlab中的配置
5.2 参照以下脚本编写适合自己的脚本,我这边在部署服务器中有一个叫boot.sh的脚本可以一键重启jar包,大家可以自行百度。
image: maven:3.6.3-jdk-8stages:- build- deploycache:key: gitlab-ci-cachepaths:- ./ltp-admin/target- ./ui-admin/distbuild:stage: buildscript:- echo "开始打包部署"- mvn package- echo "打包部署结束"- cd ./ui-admin- pwd- echo "前端-管理端开始打包"- npm install ---registry=http://registry.npm.taobao.org- npm run build:prod- echo "前端-管理端打包结束"- cd ../deploy:stage: deployscript:- scp ltp-admin/target/ltp-admin.jar root@192.168.1.88:/usr/local/learn-training-platform/jarProject- scp -r ui-admin/dist root@192.168.1.88:/usr/local/learn-training-platform/vueProject/dist# 此处直接用ssh命令,并且将后面要重启jar包的命令放在和ssh同一行执行- ssh root@192.168.1.88 "cd /usr/local/learn-training-platform/jarProject/;./boot.sh stop;"- ssh -tt root@192.168.1.88 "cd /usr/local/learn-training-platform/jarProject/;./boot.sh start"- ssh -tt root@192.168.1.88 "cd /usr/local/learn-training-platform/vueProject; rm -rf admin; mv dist admin;"
- 到此全部配置已经结束了,需要大家注意执行用户的权限,如果不是root用户部署可能会带来很多权限相关的问题,还有git的版本最好直接升级成新版本,避免gitlab-runner执行不会报错。下面附上踩坑集锦,有很多问题其实和其他人部署jenkins的时候遇到问题相似,大家查阅gitlab-runner相关的如果解决不了可以试试查阅jenkins。
踩坑集锦:
- git的版本
刚开始执行构建的时候报出了以下错误,其实就是git版本较低导致的,更新成最新版本即可
fatal: git fetch-pack: expected shallow listfatal: The remote end hung up unexpectedly
- 开始打包时遇到以下报错:
[INFO] Scanning for projects...Downloading from public: https://maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom[WARNING] Failed to create parent directories for tracking file /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.lastUpdatedDownloading from nexus-aliyun: http://maven.aliyun.com/nexus/content/groups/public/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom[WARNING] Failed to create parent directories for tracking file /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.lastUpdated[ERROR] [ERROR] Some problems were encountered while processing the POMs:[ERROR] Non-resolvable import POM: Could not transfer artifact org.springframework.boot:spring-boot-dependencies:pom:2.5.14 from/to public (https://maven.aliyun.com/repository/public): /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.part.lock (No such file or directory) @ line 40, column 25 @ [ERROR] The build could not read 1 project -> [Help 1][ERROR] [ERROR] The project com.xxx:ltp:1.0.0 (/home/gitlab-runner/builds/V2ymxA7-/0/xxx/learn-training-platform/pom.xml) has 1 error[ERROR] Non-resolvable import POM: Could not transfer artifact org.springframework.boot:spring-boot-dependencies:pom:2.5.14 from/to public (https://maven.aliyun.com/repository/public): /opt/maven/repo/org/springframework/boot/spring-boot-dependencies/2.5.14/spring-boot-dependencies-2.5.14.pom.part.lock (No such file or directory) @ line 40, column 25 -> [Help 2]
其实是因为没有maven仓库权限导致,将maven/conf/setting.xml中配置的localRepositor对应的目录配置777权限即可。
参考文档:
Jenkins构建maven项目失败
3. 打包job执行成功后,执行部署job时又报出了以下问题
明明gitlab-runner在执行build任务的时候已经成功了,并且对应的target中存在打好的jar包了,现在执行deploy任务的时候又执行了removing,把之前打的包又都删除了,一顿百度之后发现这就是gitlab-runner默认的机制,多个任务之间如果需要关联(用到之前任务打包之后的文件),则需要将对应的文件进行缓存(cache),所以在.gutlab-ci.yml文件中加入了以下内容,其中key可以随意起名,代表这个缓存的唯一性,这个cache可以写在最外面,也可以写到job里面,如果key相同里面的会覆盖外面的。
cache:key: gitlab-ci-cachepaths:- ./ltp-admin/target- ./ui-admin/dist
- .gitlab-ci.yml文件ssh相关
起初我使用的是ssh连接服务器,连接成功后再执行cd进入目录(在.gitlab-ci.yml中就是多行脚本),但是这么执行后报错显示找不到目录,可是我的目录是真实存在的,后来发现是ssh命令执行结束后就直接退出了那个终端(远程的服务器),然后查询了资料,说在ssh命令中,使用-tt参数代表分配一个伪终端,并且强制命令交互模式,遂改为使用Ssh -tt,发现可以正常进入目录并且执行重启jar包的脚本了,但是又发现执行结束后jar包启动失败,又查阅相关资料发现,ssh -tt命令会导致nohup命令结束后也无法正常执行后台运行,最后改为了Ssh 命令并且在同一行执行cd目录及重启命令,并且!要在启动jar包的脚本中设置BUILD_ID!参考文档:jenkins 退出后kill掉子进程的问题