Pipeline 实践:将 Jenkinsfile 与项目分离 - 简书
Jenkinsfile之伤
在Pipeline中至关重要的就是Jenkinsfile,类似Dockerfile,包含了Job所有需要执行的步骤,根据Pipeline的使用规则,我们常常需要把Jenkinsfile文件放到对应工程代码的根目录,Jenkins在获取工程代码后会解析Jenkinsfile,然后根据代码顺序执行下去,达到持续集成的效果。
但是这种模式有一个致命的缺点:
所有的Jenkinsfile分散到不同的工程中,对于后期的维护和功能扩展成本会非常高
实际操作: 参考: https://github.com/jenkinsci/pipeline-multibranch-defaults-plugin
1 先在Jenkins的Managed Jenkins的 Managed files 下添加默认的pipeline:
Id: default-jenkinsfile
#!/usr/bin/env groovy
import groovy.transform.Field
@Field def job_name=""
node()
{
// 获取当前job名称。也可以按需自定义
job_name="${env.JOB_NAME}".replace('%2F', '/').split('/')
job_name_to_list = job_name[0].split('-')
project = job_name_to_list[0]
service = ""
for(int i=1;i<job_name_to_list.size();i++){
if(i==job_name_to_list.size()-1){
service = service.concat(job_name_to_list[i])
}else{
service= service.concat(job_name_to_list[i]).concat("-")
}
}
println("job_name is: $env.JOB_NAME")
println("project is: $project")
println("service is: $service")
// 自定义workspace
workspace="/home/.jenkins/workspace/${project}-${service}_${env.BRANCH_NAME}"
ws("$workspace")
{
dir("cicd")
{
// clone Jenkinsfile项目
git credentialsId: 'gitee_account', url: 'https://gitee.com/cmlfxz/cicd.git'
// 根据job name、构建分支,自动加载对应的Jenkinsfile
def check_groovy_file = ""
if (env.BRANCH_NAME == 'develop') {
check_groovy_file="${project}/${service}/test/Jenkinsfile"
}else if (env.BRANCH_NAME == 'master'){
check_groovy_file="${project}/${service}/prod/Jenkinsfile"
}
load "${check_groovy_file}"
}
}
}
这段代码不能照抄,必须根据自己的job name和工程目录进行修改,而且必须反复测试,很繁琐,没招,每次修改还得approve一下.
我的jenkins Job name如下图是以项目名-服务名命名的 default-jenkinsfile的前面那段就是提取项目名和服务名出来,然后下载公共的git文件到每个job的cicd目录下,然后根据分支名调用不用项目和服务的不同分之下的jenkinsfile
其中dir("cicd")是把jenkins的独立git文件下载到每个job中的cicd目录下, 每个job一份,如果是各个job共享一个目录会有问题,啥问题没记下来.
2 新建Multibranch pipeline job,job名称保持和步骤1中的"项目名称"一致。 Build Configuration 中选择by default Jenkinsfile
,输入步骤1中的script ID。
我的git独立仓库的目录结构:
vars下面就封装了拉代码,钉钉通知和sonar的函数 src目录实践中没用到
yaml文件我目前是用helm组织的,最早使用kustomize, 同时使用了小技巧解决helm install upgrade出现各种资源冲突问题,可以看
如果你有别的处理办法,欢迎留言告知.