我们今天讨论下如何将K8S中部署的Jenkins利用好,做到和Git集成,直接检测到变化,自动进行部署
首先需要在Git上创建一个私库
然后给Git的私库配置一个公钥,我们本地保存私钥
比如GitLab上fork一个ruoyi的项目
Ruoyi这个也是老熟人了,比如就使用了mysql的docker-entrypoint-initdb.d文件夹,来在docker启动的时候加载这个目录下的sql文件
接下来我们就利用这个私库,做到有pull等git动作的时候,自动发送webhook到jenkins进行通知,Jenkins拉取检测变更,然后打包部署
在这之前,我们需要给Jenkins安装插件,方便获取WebHook中的信息
https://plugins.jenkins.io/generic-webhook-trigger/
安装完成,需要分别打通,Git -> Jenkins和 Jenkins->Git两方面沟通问题
首先是Jenkins 到 Git, 因为我们将本地私钥对应的公钥放在了Git上,那我们也将本地私钥放在Jenkins上,也就可以访问Git了
所以在Jenkins上配置私钥
在系统 -> 全局凭据 -> add credentials
然后是Git访问Jenkins
我们参照插件文档上的提示,配置一个Token
然后配置Jenkins本地host
之后便是在git上配置webhook地址,携带参数便是token
之后我们看我们Jenkins的文件
首先分为三个大块,
Pipeline{
agent any Environment{} Triggers{} Stages{} } |
分别是生成环境变量,确定构建的项目
然后进行构建,打包需要打包的项目
环境变量这个由自己根据环境配置
主要是Triggers流程
也就是WebHook触发的流程,可以由任何分支触发,交给Jenkins进行自动化打包部署
然后我们首先获取所有更改的文件
GenericVariables: [
[key: ‘added’,value: ‘$.commits[*].added’]
]
然后分别将所有修改的文件组成一个文档
Def matcher= “${modified}” + ”,” + “${added}” + “,” + “${removed}” =~ /[\[\]}]/
选择这些文件中的[]
然后替换空格为,
Def changes= match.replaceA(‘’).split(“,”)
并组成一个数组
HashSet h = new HashSet();
For (change in changes) { Int I = change.indexOf(‘/’) If(I > 0){ Change = change.substring(0,i) } } |
利用上述的方式,我们获取到了有哪些子项目被改变了
获取到了之后,判断是否有些common的子项目被改变了
For (baseChange in “${BASE_PROJECTS}”.split’(“,)){
Def mm = matcher.replaceAll(‘’).contains(baseChange) If (mm){ BASE_PROJECTS_CHANGED = mm.toString() } } |
并且保存我们所有的改变的项目
CHANGED_PROJECTS = result.join(“,”)
ORIGIN_CHANGED_PROJECTS = change.join(“,”)
后边便是根据这个变更的项目列表,进行打包了
在打包的过程中,如果出现了无法将项目目录进行上下文传递的时候
可以考虑使用 Jenkins提供的stash和unstash命令
stash includes: ‘**/**’, name: ‘projectfile’
unstash ‘projectfile’
来进行上下文的传递
并将打包好的jar包进行一个上下文的传递