首页 > 其他分享 >Jenkins流水线共享库

Jenkins流水线共享库

时间:2024-09-03 10:48:06浏览次数:10  
标签:map name params env 流水线 put Jenkins 共享 description

绝大部份项目的构建流程是:拉取源码---执行单元测试---构建目标包---构建镜像---推送镜像---集群拉取镜像部署 ,此脚本为Jenkins流水线共享库(Jenkins pipline shared library),将所有步骤统一定义到此脚本中,所有项目引用共享库即可,支持多分支构建,不同的分支发布到不同的环境。引用共享库之后,就只需要在项目的Jenkinsfile中,定义各自项目的参数即可,避免了每个项目都编写大量高度重复的构建脚本:

#!groovy
library 'pipeline-shared-library'
    def map = [:]
    map.put('repoBranch',env.BRANCH_NAME)
    map.put('repoUrl','http://gitlab.balabala.com/development/balabala.git')
    map.put('appName','demo-app')
    map.put('k8sSvcName','kubernetes-service-name')
    map.put('tag','v1.0.1')
    map.put('k8sResourceType','Deployment')
    map.put('runUnitTest','0')
    map.put('credentialsId','3818ec5a-b476-4471-8c47-db36ed4d5eb0')
    map.put('proRegistryAddr','127.0.0.1:8888/registry')
    map.put('fatRegistryAddr','registry.cn-hangzhou.aliyuncs.com/app_k8s')
    map.put('multibrachComposeName','demo-app-multi_master')
    map.put('pubRepoUrl','https://nexus.balabala.com/repository/maven-releases/')
    map.put('pubRepoUrl','https://nexus.balabala.com/repository/maven-snapshots/')
    map.put('gradleConfigFileName','build.gradle')
    if(env.BRANCH_NAME == 'master') {
        map.put('k8sNamespace','pro')
        map.put('multibrachComposeName', 'demo-multi_master')
        map.put('buildJar','demo-service-1.0.0-RELEASE.jar')
    }
    if(env.BRANCH_NAME == 'feature/demo'){
        map.put('k8sNamespace','fat')
        map.put('multibrachComposeName', 'demo-multipipeline_feature_demo')
        map.put('buildJar','demo-service-1.0.0-SNAPSHOT.jar')
    }

ci("gradle",map)

 

#!groovy

def call(String type, Map map) {
    if (type == "gradle") {
        pipeline {
            agent any
            //triggers {
            //    parameterizedCron(env.BRANCH_NAME != 'master' ? '''H/1 * * * * % ABC=XYZ''' : '')
            //}
            parameters {
                choice(
                        name: 'env',
                        choices: ['fat', 'uat', 'pro'],
                        description: 'fat:测试环境部署\nuat:演示环境部署\npro:生产环境部署'
                )
                string(name: 'repoBranch', defaultValue: "${map.repoBranch}", description: 'git分支名称')
                string(name: 'repoUrl', defaultValue: "${map.repoUrl}", description: '项目仓库的地址')
                string(name: 'appName', defaultValue: "${map.appName}", description: '应用的名称,打包Docker镜像时以此命名')
                string(name: 'k8sSvcName', defaultValue: "${map.k8sSvcName}", description: 'Kubernetes服务的名称,不要超过24个字符(实际使用时根据Kubernetes服务名称的规定)')
                string(name: 'tag', defaultValue: "${map.tag}", description: '版本标签,镜像标签')
                string(name: 'k8sResourceType', defaultValue: "${map.k8sResourceType}", description: 'Kubernetes资源类型,如Deployment、StatefulSet等等')
                string(name: 'runUnitTest', defaultValue: "${map.runUnitTest}", description: '是否运行单元测试')
                string(name: 'k8sNamespace', defaultValue: "${map.k8sNamespace}", description: 'Kubernetes命名空间')
                string(name: 'credentialsId', defaultValue: "${map.credentialsId}", description: 'Jenkins认证凭据ID,用于获取原始码')
                string(name: 'fatRegistryAddr', defaultValue: "${map.fatRegistryAddr}", description: 'FAT环境注册地址')
                string(name: 'multibrachComposeName', defaultValue: "${map.multibrachComposeName}", description: '' +
                        '多分支构建时,分支组合名称,例如项目的名字是dolphin,有一个hotfix分支,在多分支构建时,传入Jenkins自动生成的名称dolphin_hotfix')
                string(name: 'pubRepoUrl', defaultValue: "${map.pubRepoUrl}", description: 'Jar包发布的仓库地址')
                string(name: 'buildJar', defaultValue: "${map.buildJar}", description: '构建目标Jar包名称')
            }
            tools {
                gradle "Gradle"
            }
            environment {
                GRADLE_HOME = "${tool 'Gradle'}"
                PATH = "${env.GRADLE_HOME}/bin:${env.PATH}"
                repoUrl = "${map.repoUrl}"
                registryAddr = getRegistryAddr("${params.env}" == null ? "fat" : "${params.env}", map)
                k8sResourceType = getKubernetesResourceType("${params.k8sResourceType}")
            }

            stages {
                stage('checkout-source') {
                    steps {
                        git branch: "${params.repoBranch}",
                                credentialsId: "${params.credentialsId}",
                                url: "${params.repoUrl}"
                    }
                }

                stage('unit-test') {
                    when {
                        expression {
                            "${params.runUnitTest}" == '1'
                        }
                    }
                    steps {
                        sh "./gradlew test"
                    }
                }

                stage('build-api') {
                    steps {
                        script {
                            try {
                                sh "./gradlew :${params.multibrachComposeName == null ? params.appName : params.multibrachComposeName}:${params.appName}-api:build publishMavenPublicationToMavenRepository -x test"
                            } catch (err) {
                                echo "Publish jar failed, but will be continue," + err.getMessage()
                            }
                        }
                    }
                }

                stage('build') {
                    steps {
                        sh "./gradlew :${params.multibrachComposeName == null ? params.appName : params.multibrachComposeName}:${params.appName}-service:build -x test"
                    }
                }

                stage('prune-image'){
                    steps{
                        sh "docker system prune"
                    }
                }

                stage('package-image') {
                    steps {
                        sh "docker build -f ./Dockerfile --build-arg buildJar=\"${params.buildJar}\" -t=\"${params.appName}:${params.tag}\" ."
                    }
                }

                stage('tag-image') {
                    steps {
                        sh "docker tag ${params.appName}:${params.tag} ${registryAddr}/${params.appName}:${params.tag}"
                    }
                }

                stage('push-image') {
                    steps {
                        sh "docker push ${registryAddr}/${params.appName}:${params.tag}"
                    }
                }

                stage('rolling-update-fat') {
                    when {
                        expression {
                            "${params.env}" == 'fat'
                        }
                    }
                    steps {
                        sh "kubectl rollout restart ${k8sResourceType} ${k8sSvcName} -n ${params.k8sNamespace}"
                    }
                }

                stage('rolling-update-uat') {
                    when {
                        expression {
                            "${params.env}" == 'uat'
                        }
                    }
                    steps {
                        sh "kubectl rollout restart ${k8sResourceType} ${k8sSvcName} -n ${params.k8sNamespace}"
                    }
                }

                stage('rolling-update-pro') {
                    when {
                        expression {
                            "${params.env}" == 'pro'
                        }
                    }
                    steps {
                        sh "/Users/dabaidabai/.jenkins/workspace/build_shell/update-production-pod.sh ${params.tag} ${k8sSvcName} ${params.k8sNamespace} ${params.appName} ${k8sResourceType}"
                    }
                }
            }
        }
    }
}

/**
 * 获取不同部署环境的容器推送地址
 *
 * @param env
 * @param map
 * @return
 */
def getRegistryAddr(env, Map map) {
    print("choice:" + env)
    if ("pro" == env) {
        return "${map.proRegistryAddr}"
    }
    if ("fat" == env) {
        print("fataddress:" + "${map.fatRegistryAddr}")
        return "${map.fatRegistryAddr}"
    }
    if ("uat" == env) {
        return "${map.uatRegistryAddr}"
    }
}

/**
 * 获取Kubernetes资源类型
 * @param value
 * @return
 */
def getKubernetesResourceType(value) {
    return value == null ? "Deployment" : value
}

 

标签:map,name,params,env,流水线,put,Jenkins,共享,description
From: https://www.cnblogs.com/zgq123456/p/18394127

相关文章

  • CentOS 7配置iSCSI共享存储案例
    案例说明:在CentOS7环境下,配置iscsi共享存储。操作系统版本:[root@node201KingbaseHA]#cat/etc/centos-releaseCentOSLinuxrelease7.9.2009(Core)集群架构:如下所示,node1和node2为集群节点:节点信息:[root@node201KingbaseHA]#vi/etc/hosts192.168.1.201node201......
  • Jenkins - 在Rocky Linux系统下安装Jenkins和配置Agent节点
    安装Jenkins主节点下载和安装JenkinsLTS版本本机信息[root@localhost~]#cat/etc/system-releaseRockyLinuxrelease9.4(BlueOnyx)[root@localhost~]#[root@localhost~]#uname-aLinuxlocalhost.localdomain5.14.0-427.33.1.el9_4.x86_64#1SMPPREEMPT_DYNA......
  • java并发 第四章共享模型之管程 3 synchronized 原理
    1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是synchronized假设有两个方法同步块,利用同一个对象加锁 staticfinalObjectobj=newObject();......
  • 多媒体信息共享|基于SprinBoot+vue的多媒体信息共享平台(源码+数据库+文档)
    多媒体信息共享平台目录基于SprinBoot+vue的多媒体信息共享平台一、前言二、系统设计三、系统功能设计  系统前台功能模块后台模块实现四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设布道师,阿......
  • CentOS 8 安装 jenkins、gitlab-ce、SonarQube教程
    一、在CentOS8上安装jenkins在一台CentOS8(IP:10.0.0.81RAM:2GB)上安装jenkins-2.452.41、配置Java环境从Jenkins-2.357版本开始JDK最低要求java11,而jenkins-2.346.1是最后一个支持java1.8的版本。点击查看代码1.先查看系统是否自带了jdk,若有输出信息,批量卸载......
  • 共享LLC来减少ipi中断
    linuxkernel唤醒进程的步骤:selecttaskrq,enqueue,activetask。对于enqueue调用链是:try_to_wake_up->ttwu_queue->ttwu_queue_wakeliststaticboolttwu_queue_wakelist(structtask_struct*p,intcpu,intwake_flags){if(sched_feat(TTWU_QUEUE)&&ttwu_......
  • 共享栈:两栈共享空间
            现在这里插个链接,这是笔者之前写的一篇文章,讲的是基础版的栈,如果对栈不太熟悉可以先看看这一篇文章。引入    上一篇文章我们学到了栈的顺序存储,这种方法只允许在栈顶针对元素进行操作,所以他并不存在像线性表一样在插入或删除操作时考虑移动元素的问......
  • 计算机毕业设计django+vue校园共享单车管理系统【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着校园规模的不断扩大和师生出行需求的日益增长,校园内的交通问题日益凸显。传统步行方式虽环保但效率低下,而私家车与电动自行车的无序停......
  • 多线程篇(ThreadLocal & 内存模型 & 伪共享(ThreadLocal ))(持续更新迭代)
    目录一、ThreadLocal1.前言2.简介3.与Synchronized的区别4.简单使用5.原理5.1.set5.2.get5.3.remove5.4.与Thread,ThreadLocalMap之间的关系5.常见使用场景场景一:存储用户Session场景二、数据库连接,处理数据库事务场景三、数据跨层传递(controller,servi......
  • 多线程篇(ThreadLocal & 内存模型 & 伪共享(内存可见性))(持续更新迭代)
    目录一、内存可见性问题(并发编程之美)二、Java内存模型(深入理解JVM第三版)1.简介2.硬件的效率与一致性3.Java内存模型3.1主内存与工作内存3.2内存间交互操作3.3对于volatile型变量的特殊规则3.4针对long和double型变量的特殊规则3.5原子性、可见性与有序性原......