02-Jenkins配置编译项目

简介: 本文介绍如何在Jenkins中配置编译任务,实现从GitLab拉取代码,使用Maven/Node构建,通过Docker打包镜像并推送至CCE镜像仓库,最后利用kubectl更新云上服务。涵盖后台Java模块、前端Vue项目及跨服务器镜像导出方案,支持手动与自动触发构建,提升持续集成效率。

Jenkins配置编译任务

项目的大致流程:

  1. 从gitlab上拉取程序
  2. 运行 maven/Node 编译打包
  3. 运行Dockerfile打包成镜像
  4. 上传镜像到cce云上镜像仓库
  5. 使用kubectl更新cce云上的负载镜像


需要打包编译的内容:

  • 后台项目的app-web模块
  • 后台项目的system-server模块
  • 前端VUE项目


后台编译

  1. 以admin登录Jenkins,选择新建任务
  2. 任务名称:任意起,例如dev_myproject_java
  3. 选择构建一个自由风格的软件项目(也可以选择复制,填写需要复制的任务的任务名称)


General组:

  1. 限制项目的运行节点:填写节点服务器的标签表达式,限制只在该服务器上运行任务。myproject_dev
  2. 点击高级
  3. 使用自定义的工作空间:填写源程序下载到的服务器路径。/root/build/source/myproject/myproject-vue
  4. 显示名称:可以配置一个中文名,用于在列表页面展示。dev-后台-app


源码管理组:

  1. 选择Git
  2. Repository URL:代码路径。填写git@xxxxxx那个。http:xxxxx的没有设置会报错。
    从gitlab复制下来的路径需要进行调整,前面加上ssh://前缀,ip后面加上gitlab的22端口映射出来的端口号8022。例如:从gitlab复制出来的路径为git@192.168.xxx.xxx:myproject/myproject-vue.git,调整后为ssh://git@192.168.xxx.xxx:8022/myproject/myproject-vue.git
  3. Credentials:选择前面创建的Jenkins用户私钥的那个凭据
  4. Branches to build:指定要拉取的分支。例如本项目的*/dev_20240712
  5. 源码库浏览器:用于在jenkins上直接看本地构建时的代码差异。
    源码库浏览器:gitlab
    URL:gitlab的本项目页面:http://192.168.xxx.xxx:8090/myproject/myproject-vue/
    version:gitlab版本:17.0


构建触发器组:

可以配置每次有代码push到gitlab时自动构建。为避免频繁构建,项目采用手动点击构建,不配置触发器。


构建环境组:

用于给节点服务器准备构建环境,使用Ant构建时可以配置。项目使用Maven、Node构建,且已经在节点服务器上手工部署了Maven、Node,无需进行配置。


Build Steps组:配置从gitlab拉取代码之后操作,即具体的构建执行步骤。项目全部使用shell方式执行。

  1. 登录CCE云:
/root/cce login <<EOF
aaa   # cce用户名
aaaaaaa # cce密码
EOF
  1. 执行Maven编译打包
cd /root/build/source/myproject/myproject-vue
source /etc/profile.d/maven.sh
export JAVA_HOME=/root/build/jdk1.8.0_411
# maven打包(跳过测试)
mvn clean package -Dmaven.test.skip=true
  1. 执行Dockerfile制作镜像、推送CCE镜像仓库、更新cce上的负载镜像
curDate=`date +%Y%m%d`
curTime=`date +%H%M%S`
export VERSION_ALL_TAG=${curDate}-${curTime}
# build app-web image; push to cce; delete local image
cd /root/build/source/myproject/myproject-vue/app-web
docker build -t cce.test.com/myproject/app-web:${VERSION_ALL_TAG} .
docker push cce.test.com/myproject/app-web:${VERSION_ALL_TAG} 
docker rmi cce.test.com/myproject/app-web:${VERSION_ALL_TAG} 
# build system-server image; push to cce; delete local image
cd /root/build/source/myproject/myproject-vue/system/system-server
docker build -t cce.test.jinanbank.com/myproject/system-server:${VERSION_ALL_TAG} .
docker push cce.test.jinanbank.com/myproject/system-server:${VERSION_ALL_TAG} 
docker rmi cce.test.jinanbank.com/myproject/system-server:${VERSION_ALL_TAG} 
# update cce deployment
export KUBECONFIG=/root/.kube/config
kubectl set image deployment/myproject container-app=cce.test.com/myproject/app-web:${VERSION_ALL_TAG} container-system=cce.test.com/myproject/system-server:${VERSION_ALL_TAG} -n myproject
  1. 登出CCE
/root/cce logout


前端VUE编译

app-web模块的操作步骤类似,只是将Maven编译换成Node编译:

cd /root/build/source/myproject/vue-web
export NODE_HOME=/root/build/node-v12.22.12
export PATH=$NODE_HOME/bin:$PATH
npm run build:clouddev


Jenkins打包docker镜像

86服务器上安装的Docker版本比较高,save出来的docker镜像tar文件无法直接在页面导入进CCE中。

164服务器上的Docker版本低,导出的镜像可以在页面导入CCE中,但是无法使用CCE客户端。

所以项目源码拉取、编译打包、生成镜像、kubectl更新等操作在86服务器上进行。如果需要导出docker镜像,则在164服务器上进行。


配置打包Docker的任务

在Jenkins上新建一个164节点。

新建一个任务save_docker,在164上运行,用于将docker镜像导出成tar文件。

勾选参数化构建过程

  • 字符参数IMAGE_LIST:需要打包的镜像列表(多个镜像以分号分隔)
  • 布尔参数NEED_SAVE_TAR:是否需要导出成tar

增加一个执行shell的步骤:

if [ "$NEED_SAVE_TAR" = true ] && [ -n "$NEED_SAVE_TAR" ]; then
    # 检查 IMAGE_LIST 是否为空
    if [ -z "$IMAGE_LIST" ]; then
        echo "IMAGE_LIST is empty."
    else
        # 保存原始的 IFS
        OLD_IFS=$IFS
        # 设置 IFS 为分号
        IFS=';'
        # 遍历 IMAGE_LIST
        for image in $IMAGE_LIST; do
            # 还原 IFS 为默认的值
            IFS=''
            
            fullImagePath=${image}
            echo "开始下载镜像:${fullImagePath}"
            docker pull ${fullImagePath}
            echo '镜像下载完成.'
            # 提取 registry, namespace, image, 和 tag
            registry_and_namespace_and_image=${image%:*}
            tag=${image##*:}
            # 将 registry 和 namespace/image 分开
            registry=${registry_and_namespace_and_image%%/*}
            namespace_and_image=${registry_and_namespace_and_image#*/}
            # 提取 namespace 和 image
            namespace=${namespace_and_image%%/*}
            image=${namespace_and_image#*/}
            imageName=${image%%:*}
            
            echo "转换tag"
            newImageName=${namespace}/${imageName}:${tag}
            docker tag ${fullImagePath} ${newImageName}
            echo "转换完成"
            
            echo "开始将镜像打成tar包:${namespace}-${imageName}-${tag}.tar"
            docker save -o /root/DockerSaveTar/${namespace}-${imageName}-${tag}.tar  ${newImageName}
            echo "打成tar包完成."    
            
            echo "删除本地下载的镜像"
            docker rmi ${fullImagePath} ${newImageName}
            echo "删除完成"
        done
        # 恢复原始的 IFS
        IFS=$OLD_IFS
    fi
else
    echo "NEED_SAVE_TAR为false或空,不执行保存tar包的操作"
    exit 0
fi


直接调用该任务

可以在Jenkins上直接调用该任务,需要传入参数。例如:

IMAGE_LIST=192.168.xxx.xxx:8889/myproject/app-web:20240903-194055;192.168.xxx.xxx:8889/myproject/system-server:20240903-194055
NEED_SAVE_TAR=true # 勾选即可

任务便会自动拉取这两个镜像导出成tar


在其他任务执行后自动调用该任务

例如在预警后台的编译任务中,生成docker镜像推送仓库后,将docker镜像名称写入一个文件中:

echo "IMAGE_LIST=192.168.xxx.xxx:8889/myproject/app-web:${VERSION_ALL_TAG};192.168.xxx.xxx:8889/myproject/system-server:${VERSION_ALL_TAG}" > /root/build/source/myproject/myproject-java-env.properties


新增一个构建后操作:选择Trigger parameterized build on other projects(需要安装对应插件后才会有该选项)。

  • Projects to build(构建后需要执行的任务,多个任务逗号分隔):save_docker(即打包docker任务)
  • Trigger when build is(什么情况下调用后续任务):Stable or unstable but not failed(稳定、有警告都执行,只要不是失败)

添加参数:

  • Parameters from properties file(从properties文件中获取参数):路径为前面写入的文件/root/build/source/myproject/myproject-java-env.properties
  • Boolean parameters(添加一个布尔参数):NEED_SAVE_TAR,手动修改该参数的值来控制是否生成tar
目录
相关文章
|
应用服务中间件 nginx
【Nginx异常】[error] 4236#29900: OpenEvent(“Global\ngx_reload_27128“) failed (5: Access is denied)
【Nginx异常】[error] 4236#29900: OpenEvent(“Global\ngx_reload_27128“) failed (5: Access is denied)
1478 0
|
8月前
|
人工智能 缓存 决策智能
AI律师数字分身:法律科技领域的多智能体架构实践
AI数字分身破解法律服务规模化难题,通过多模态智能体实现7×24小时咨询响应、案情结构化提取与智能分流。基于知识图谱与推理引擎,提升律所线索留存率与律师人效,推动法律服务降本增效。
1208 11
|
26天前
|
人工智能 测试技术 API
OpenCode Agent 编排能力:如何让 AI 自主拆解任务、并行推进?
本文详解 OpenCode 的 AI Agent 编排能力:如何让主 Agent 自动拆解任务、生成子 Agent 并行执行(如调研、编码、测试),支持 DAG 依赖调度与模型/权限精细化配置。实战案例展示 40 分钟完成单元测试补全与异常重构,真正实现“AI 团队协同开发”。
|
运维 虚拟化 Windows
VMware Workstation常见的故障处理
关于VMware Workstation常见故障处理的指南,包括Windows 10开启虚拟机蓝屏问题的解决方案和虚拟机无法开机时的解决方法。
1160 21
VMware Workstation常见的故障处理
|
移动开发 jenkins 持续交付
jenkins配置git
通过上述步骤,您可以在 Jenkins 中成功配置 Git,从而实现自动拉取代码并进行构建和部署。这些配置不仅提高了开发效率,还保证了代码的连续集成和交付。确保每一步配置正确,以避免在实际使用中遇到问题。
2312 1
阿里云企业邮箱登陆地址,阿里云个人免费邮箱邮箱登陆地址分享
最近碰到好多用户问,阿里云企业邮箱怎么买,个人免费邮箱怎么申请,企业邮箱和个人免费邮箱登陆地址是多少?给大家分享一下: 阿里云个人免费版企业邮箱注册,登陆地址:https://mail.aliyun.com/ 阿里云企业邮箱登陆地址:https://qiye.aliyun.com/ 另外阿里云最近还有免费版企业邮箱+钉钉智能移动办公套件+邮件推送包1元抢购活动哦,非常实惠呢!活动地址:https://wanwang.aliyun.com/mail/freemail/需要的亲们可以看看哈。
|
人工智能 供应链 API
降本90%的秘密:开放银行API如何让电商分账系统“自动跑”?
在数字经济时代,开放银行与电商API的深度融合正在重塑支付清算与分账系统。通过标准化接口,银行服务与电商生态实现数据互通、流程自动化与资金高效流转,构建“银行即服务”(BaaS)新生态。本文从技术原理、协同场景、典型案例与未来趋势四方面,解析其在支付清算与分账系统中的创新应用与发展方向。
|
Java 数据库连接 mybatis
mybatis 返回map
mybatis 返回map
556 0
|
缓存 JavaScript
nodejs安装和环境配置
nodejs安装和环境配置
859 0
|
安全 API 数据库
一文带你了解银行卡验证api接口
银行卡验证api接口指的是通过天眼数聚这样的合规性api接口服务商,接入银联数据库,对用户提供的银行卡信息进行真实性核验的一种实名认证方法
2154 0
一文带你了解银行卡验证api接口