1 项目架构如图
git 地址为整体结构 未拆分 :
http://127.0.0.1:8888/gtilab/顶级父工程.git
文章来源地址https://www.toymoban.com/news/detail-770795.html
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/hbsh/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的图
文章来源:https://www.toymoban.com/news/detail-770795.html
到了这里,关于jenkins 打包cloud多模块项目,一体化方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!