1、GitLab CI/CD介绍
CI(Continuous Intergration):即持续集成,将代码的合并、部署、自动化测试都在一起,不断地执行这个过程,并对结果反馈。
CD(Continuous Delivery):即持续交付,持续交付是一种软件工程方法,用来保证软件可以稳定持续地保持着随时可发布的状态,与持续集成相比,持续交付偏重于可交付的产物。
CD(Continuous Deployment):即持续部署,通过自动化的手段将软件频繁的交付,部署到相应的环境。
整个流程如上图所示:本地提交代码到gitlab服务器上,gitlab要使用CI/CD功能的话要先安装gitlab-runner,gitlab-runner的作用是用来构建各个任务,比如:build、test、package、deploy等等的任务。因为gitlab-runner构建任务比较耗资源,因此为了不影响gitlab的正常使用,通常gitlab和gitlab-runner不是安装在同一个服务器上。而gitlab-ci是负责管理各个项目的构建状态(pending、failed、running、pass等)。
- 概况来说,整个gitlab ci/cd流程如下:
- 本地代码改动
- 变动代码推送到GitLab上
- GitLab 将这个变动通知GitLab-CI
- GitLab-CI找出这个工程相关联的gitlab-runner
- gitlab-runner把代码更新到本地
- 根据预设置的条件配置好环境
- 根据预定义的脚本(一般是.gitlab-ci.yml)执行
- 把执行结果通知给GitLab
- GitLab显示最终执行的结果
2、安装软件
我在我自己的windows10电脑上装了gitlab-runner、maven、jdk、mysql。我的gitlab私服是装在了虚拟机Ubuntu里面。
之所以在windows里面装gitlab-runner,是因为我在ubuntu虚拟机里面装了gitlab-runner在注册到gitlab私服的时候一直出现这个报错(Runner has never contacted this instance)
网上的主流解决方法是重启或者重装其他版本的gitlab-runner,这些我都试过,都不行,最后不想折腾了,于是就在windows里面装了gitlab-runner注册到gitlab私服的时候就不报这个错了!
2.1、windows安装gitlab-runner
win10安装gitlab-runner可以参考一下这篇
windows 安装 gitlab-runner - 青S衫% - 博客园 (cnblogs.com)
我简单概况一下:
1、 先去gitlab官网下载windows版本的gitlab Install GitLab Runner on Windows | GitLab
2、安装gitlab-runner
//安装gitlab-runner
.\gitlab-runner.exe install
//使用指定账户安装gitlab-runner
.\gitlab-runner.exe install --user your-username --password your-password
//启动gitlab-runner
.\gitlab-runner.exe start
//停止gitlab-runner
.\gitlab-runner.exe stop
2.2、Ubuntu安装gitlab
Ubuntu安装gitlab可以参考一下这篇【Ubuntu安装GitLab 指南】_不完美的小小鸟的博客-CSDN博客_ubuntu安装gitlab
我简单概况一下:
//安装需要的库和软件
sudo apt-get install curl openssh-server ca-certificates postfix
//添加GitLab的包并进行安装
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh |sudo bash
sudo apt-get install gitlab-ce
gitlab安装好后,默认账户为root,密码在 /etc/gitlab/initial_root_password 文件中。
新建一个gitlab项目。
3、把gitlab-runner注册到gitlab上
.\gitlab-runner.exe restart
注册成功后,Runners下面会生成一个runners,可以看到这个runners是正常运行的,没有什么错误。
CI/CD里面生成了runners后,相应的在gitlab-runner的config.toml文件里面也会生成一个新的[[runners]],对新生成的[[runners]]的配置信息做一些修改。
pre_clone_script = "chcp 65001"
pre_build_script = "chcp 65001"
shell = "powershell"
.\gitlab-runner.exe restart 重启一下以免修改的配置不生效!
4、在Maven项目中新增.gitlab-ci.yml文件
.gitlab-ci.yml要和pom.xml处于同一级目录下
.gitlab-ci.yml
# 本次构建的阶段: compile、package、deploy
stages:
- compile
- package
- deploy
# 编译
compile:
stage: compile
tags:
- maven
only:
- master
script:
- echo "=============== 开始编译任务 ==============="
- mvn compile
# 打包
package:
stage: package
tags:
- maven
only:
- master
script:
- echo "=============== 开始打包任务 ==============="
- mvn clean package
- copy D:\gitlab-runner\builds\H-iQC7zA\0\gitlab-instance-40d3d67d\erp\target\erp.jar D:\package
#启动jar包
deploy:
stage: deploy
tags:
- maven
only:
- master
script:
- echo "=============== 开始部署任务 ==============="
- java -jar D:\package\erp.jar
对.gitlab-ci.yml里面脚本的说明:
具体.gitlab-ci.yml里面脚本的语法可以参考这篇:.gitlab-ci.yaml 编写说明,示例带注释说明_kunyus的博客-CSDN博客
5、推送代码到gitlab
我把master分支的代码推送到gitlab上面,然后它就自动触发CI/CD的流程了!
compile阶段
package阶段
deploy阶段
部署成功,可以访问了!
6、总结
因为目前工作中有用到这种推送自动打包发布的模式,所以顺便就学习了。我公司用的是gitlab-ci,但我在查资料的过程有发现有其他方法也可以做到这种自动打包发布,比如使用gitee的webhooks:Docker+jenkins+gitee+springboot实现自动化部署流程(详细教程)(附下载工具地址)(1)_盖被子的冰块的博客-CSDN博客
我参考了这篇但没搞出来,碰到了这个问题,私信那位博主,但是人家一直没回我。
当然目前对于gitlab-ci/cd也只是了解会用的阶段,因为不太了解docker,那些dcoker的自动发布构建镜像脚本不太会写,所以这次我没有用docker,等我系统学习了docker以后再说。工作中其实也没有机会去写.gitlab-ci.yml脚本。我公司信息系统整个微服务架构是以docker镜像的方式部署在linux服务器上的k8s集群上,整个发布集成是基于gitlab-ci的。所有的dockerfile,shell脚本这些都是放在一个单独的项目上的。在每个的项目的.gitlab-ci.yml里面是直接include引入进来的。我看了下存放dockerfile,shell脚本的这个项目的提交历史,基本上比较大的修改都是三年前的了,最近一两年没什么修改最多也就改改参数这种小修改,或者把某些地方注释掉应该为了测试吧。嗯,其实对于一个系统来说,有一个好的稳定的运行开发环境是尤为重要的,对于开发团队来说有一个好的开发规范,代码规范,Git分支模式的选择,人员项目的管理。对于业务来说还得有个规范,我目前是在公司内网的系统,会涉及财务人事销售库管等这些业务。就是erp了。但感觉很多需求其实都是用户他们拍脑袋想出来的,我们开发人员更多或者只会考虑这个需求在技术上好不好实现,至于这个是不是符号规范是否合理貌似很少会去考虑,也不知道怎么考虑,毕竟用户人家一直搞相关业务,肯定比我们开发人员专业吧!在软件行业有个职位叫“咨询顾问”,他们通常某个领域业务的专家,我大二的时候曾去一家专门搞erp的公司实习过,他们给用户做系统的话,开发人员只占少数,相反顾问却很多,比如财务顾问,销售顾问,物流顾问,库管顾问,CRM顾问等等。顾问们跟据用户的需求以及实地调研的结果会提供相应模块的设计方案(业务层面),然后又开发人员去实现。他们是做sap的,因为sap本身就是一个成熟的平台了,他们开发人员是基于平台进行开发,因此有很多现有的模板可以直接拿来用的,因此就不需要那么多开发人员了。sap erp系统的重点在于解决方案!
当然对于我来说,我不太会去走咨询顾问这条路线,之前也和前同事以及一些大学同专业同学有聊过,基本上技术的路不适合一直走,要么争取转项目管理,要么走业务路线,资深的业务其实就是咨询顾问了。其实目前我也没怎么想好以后的发展路线,目前的打算也是现在正在学习的方向就是devops方向了,关于语言框架也有一段时间没去新学习了,java8以后就没怎么再去关注过!
7、参考资料
简述gitlab-ci(入门篇) - 掘金 (juejin.cn)
DevOps案例:Gitlab CI/CD 自动化部署项目_哔哩哔哩_bilibili
GitLab CI 打造一条自己的流水线 - 知乎
Docker安装Gitlab和Gitlab-Runner并实现项目的CICD-阿里云开发者社区
gitlab-ci&gitlab-runner完整自动化部署过程 - 知乎
Gitlab-runner+Docker自动部署SpringBoot项目 - 咔嚓船长117 - 博客园
Ubuntu 20.04 系统5分钟后老是自动锁屏怎么取消?_传说中的暗暗的博客-CSDN博客_ubuntu关闭自动锁屏 从0开始,gitlab+gitlab-runner+springboot+docker,实现CICD流水线自动部署_木子芳兮的博客-CSDN博客
gitlab-ci - gitlab-runner : prepare environment failed to start process pwsh in windows - IT工具网
windows 安装 gitlab-runner - 青S衫% - 博客园
持续集成Gitlab-CI/CD项目MAVEN项目_无声的雾的博客-CSDN博客
【CMD】复制并覆盖目标文件_sayyy的博客-CSDN博客_cmd copy 覆盖
Docker+jenkins+gitee+springboot实现自动化部署流程(详细教程)(附下载工具地址)(1)_盖被子的冰块的博客-CSDN博客
Docker+jenkins+gitee+springboot实现自动化部署流程(详细教程)(附下载工具地址)(2)_盖被子的冰块的博客-CSDN博客 Ubuntu 安装 jdk8 - 追梦滴小蜗牛 - 博客园 (cnblogs.com)
Ubuntu系统下文件带小锁如何解决_木可木可❀的博客-CSDN博客_ubuntu文件夹上有锁
Linux查看所有用户用什么命令 - lclc - 博客园
Ubuntu 安装Maven步骤 - xiondun - 博客园
如何在 Ubuntu 20.04 上安装 Git - 知乎
"/etc/docker/daemon.json" E212: Can't open file for writing_Coder_贾俊浩的博客-CSDN博客
Linux 退出&保存/不保存_qq_27327261的博客-CSDN博客_linux不保存退出
Docker 搭建 Jenkins 实现自动部署-阿里云开发者社区
Jenkins基础: root URL设定_淼叔的博客-CSDN博客_can only set resource root url if jenkins url is s 系列学习 Jenkins 之第 4 篇 —— 亲测成功 Jenkins + Gitee + Docker 实现自动化部署微服务项目(完结)_流放深圳的博客-CSDN博客
docker常规操作——启动、停止、重启容器实例_Michel4Liu的博客-CSDN博客_docker关闭容器