jenkins 打包cloud多模块项目,一体化方案

1 项目架构如图

git 地址为整体结构 未拆分 : 

http://127.0.0.1:8888/gtilab/顶级父工程.git

2 构建需求,需要针对模块 进行整体选择性构建部署

        

  2.1 CICD  gitlab->jenkins->harbor->rancher

   此篇主要关注jenkins 相关集成构建,重点不在于 gitlab,harbor,rancher等环境的搭建

   有空再补充吧,先搞个demo。

 2.2 jenkins 相关操作 :

  2.2.1  安装 gitlab插件 安装流水线相关插件;  这些插件  安装的时候会引导安装大部分; 缺少的 点进插件管理中心 , 进行安装就好了

 2.2.2 git配置

2.2.3 maven配置

直接使用默认的让jenkins自己安装

 使用自己安装的maven  取消勾选自动安装 然后如图操作

2.2.4  创建jenkins任务绑定项目(流水线)

2.2.5 项目配置 (重点 简单版本 一般够用)

选择gitlab connection  具体配置 看第二张贴图

  GITLAB CONNECTION  配置在这 反正就像这样  缺啥补啥

2.3 jenkins 操作流水线(重点)

2.3.1  jenkins项目配置相关, 看图点点点

 

 

2.3.2 jenkins 流水线构建脚本以及每个模块的dockerfile

//gitlab的凭证
def git_auth = "ASDASD*****DASD"

//构建版本的名称
def tag = createVersion()

//Harbor私服地址
def harbor_url = "127.0.0.1:5000"

//Harbor的项目名称
def harbor_project_name = "C_P_A_A"

// harbor用户名和密码
def username = "admin"
def password = "******"

def num = 2;

def createVersion() {
    return new Date().format('yyyyMMddHHmm') + "_${env.BUILD_ID}"
}

node{
		//maven地址
    def mvn = "/usr/local/maven/apache-maven-3.9.1/bin/mvn"

    //把选择的项目信息转为数组
    def selectedProjects = "${C_P}".split(',')
    echo "${selectedProjects}"

    stage('拉取代码'){
        echo '准备拉取代码'
        checkout([$class: 'GitSCM', branches: [[name: '*/${APP_BRANCH}']], extensions: [], userRemoteConfigs: [[credentialsId: '${git_auth}', url: 'http://127.0.0.1:18888/git/C_P_A_A.git']]])
        echo '代码拉取完毕'
    }

    stage('编译构建公共模块'){
    echo '开始编译公共模块 , 校验插件这玩意上线的时候 别忘了去掉跳过'
    sh "${mvn} -f C_P_A_A-modules clean install -Dpmd.skip=true -Dcheckstyle.skip=true"
    echo '公共模块编译完毕'
    }

    for(int i=0;i<selectedProjects.size();i++){
         num ++ ;

         //取出每个项目的名称和端口
         def currentProject = selectedProjects[i];
         echo "${currentProject}"
         //项目名称
         def currentProjectName = currentProject.split('@')[0]
         //项目启动端口
         def currentProjectPort = currentProject.split('@')[1]
         echo "${currentProjectName}"
         echo "${currentProjectPort}"

         if (num % 10 == 0) {
            echo ''
         }
         stage("编译项目: ${currentProjectName}"){
            num++;

            echo '开始编译构建 ======== ${currentProjectName}'

            //编译打包选中微服务项目
            sh "${mvn} -f ${currentProjectName} clean package -Dpmd.skip=true -Dcheckstyle.skip=true"

            echo "${currentProjectName} + 编译完毕"
         }

         if (num % 10 == 0) {
            echo ''
         }
         stage("制作并推送镜像: ${currentProjectName}"){
            num++;
            // 生成镜像
            sh "${mvn} -f ${currentProjectName} dockerfile:build"
            //定义镜像名称(因为原本微服务项目前面还有一个父项目的,所以 必须获取到项目的真正名称 ,例如 infrastructure/api_gateway 变成 api_gateway)
            def realProjectName = currentProjectName.split("/")
            def realName = realProjectName[realProjectName.length-1]
            def imageName = "${realName}:${tag}"
            echo "${imageName} + 镜像名称完毕"
            echo "${tag} + tag版本号"

            //登录
            sh "docker login -u ${username} -p ${password} ${harbor_url}"

            //给镜像打标签
            sh "docker tag ${realName}:latest ${harbor_url}/${harbor_project_name}/${imageName}"

            //上传镜像
            sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"

            //删除本地镜像 (根据镜像名称删除镜像和打标签的镜像,因为原本的镜像和打包后镜像是同一个镜像id,无法通过镜像id删除镜像)
            sh "docker rmi -f ${imageName}"
            sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
            //判断是否存在虚悬镜像  , 存在虚悬镜像,执行删除操作

            echo '制作并推送镜像完成 ======== ${currentProjectName}'
         }
    }

    stage('Cleanup'){
        sh '''
        if [ -n "$(docker images --format '{{.Repository}}:{{.Tag}} {{.ID}}' | awk '$1 == "<none>:" {print $2}')" ]; then
          docker rmi $(docker images -f 'dangling=true' --filter 'before=<none>' -q) 2> /dev/null
        fi
        '''
    }


    
}

dockerfile  及其简易版本  根据各自需求更改

FROM openjdk:17.0.2-oracle
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

2.4 最终实现 P的图

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值