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
目录
相关文章
|
存储 算法 Java
深入理解JVM - ZGC收集器
深入理解JVM - ZGC收集器
478 2
|
6月前
|
数据采集 资源调度 算法
基于数据驱动的Koopman库普曼算子谱分析(Matlab代码实现)
基于数据驱动的Koopman库普曼算子谱分析(Matlab代码实现)
309 0
|
7月前
|
人工智能 供应链 API
降本90%的秘密:开放银行API如何让电商分账系统“自动跑”?
在数字经济时代,开放银行与电商API的深度融合正在重塑支付清算与分账系统。通过标准化接口,银行服务与电商生态实现数据互通、流程自动化与资金高效流转,构建“银行即服务”(BaaS)新生态。本文从技术原理、协同场景、典型案例与未来趋势四方面,解析其在支付清算与分账系统中的创新应用与发展方向。
|
安全 Linux Shell
HDFS常用命令
HDFS常用命令
482 1
|
测试技术 开发工具 git
git 提交规范
git 提交规范
1223 2
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
1383 0
|
开发框架 机器人 .NET
我们需要安装`pybullet`模块,这可以通过pip来完成:
我们需要安装`pybullet`模块,这可以通过pip来完成:
|
关系型数据库 MySQL Linux
linux环境下查看mysql服务状态和重启命令
linux环境下查看mysql服务状态和重启命令
1157 0
|
分布式计算 Hadoop
HDFS教程(02)- HDFS命令汇总
HDFS教程(02)- HDFS命令汇总
874 0
|
分布式计算 Hadoop 大数据

热门文章

最新文章