当前位置: 首页 > news >正文

jenkins pipeline实现CI/CD

在企业级的架构中,CI/CD是必不可少的一个环节,它可以让开发人员只关注于开发,而不必去关注项目的构建和部署,从而提高开发人员的效率。

本文我们来介绍一下使用jenkins 的pipeline来进行java项目的自动构建以及部署。我们通过脚本来生成docker镜像,并推送到镜像仓库,供k8s使用。

整体思路是先通过maven构建项目,然后通过build_docker.sh脚本来打包生成镜像,该脚本接收3个参数,-j 需要执行的jar包的名字,-F 项目文件名 -p ,镜像需要推送的环境

根据参数会打包成相应的镜像,并且推送到镜像仓库。

一 基础镜像环境

1 因为是基于springboot的java项目启动项目需要java环境,我们构建一个自己的jdk环境,使用jdk8。

Dockerfile 如下

FROM ubuntu
WORKDIR /usr/local/jdk1.8.0_301
ADD jdk-8u301-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_301
ENV PATH=$JAVA_HOME/bin:$PATH
CMD ["java","-version"]

构建自己的jdk8镜像

docker build -f Dockerfile -t jdk8img .

2 Jenkins我们也通过docker的方式来运行,基于官方jenkins镜像我们加进去自己的jdk版本(因为目前项目大部分使用jdk8,而最新jenkins官方镜像为jdk11),以及使用宿主机的maven,docker环境,来制作一个jenkins镜像。

这里基于官方镜像,这里安装libltdl7是为了运行宿主机docker环境需要。

FROM jenkins/jenkins
ADD jdk-8u301-linux-x64.tar.gz /usr/local
ENV JAVA_HOME=/usr/local/jdk1.8.0_301
ENV PATH=/usr/local/maven/bin:$JAVA_HOME/bin:$PATH
USER root
RUN apt-get update && apt-get install -y libltdl7

    

这里的前提是宿主机提前安装好maven和docker环境,具体安装方式这里就不详细讲述了。

启动jenkins

这里启动命令挂载了宿主机的docker,以及maven目录

docker run --name jenkins -d -v /etc/localtime:/etc/localtime:ro -v /data1/services/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /usr/local/maven:/usr/local/maven  -p 8080:8080 -p 50000:50000 --dns=8.8.8.8 jenkins

二 脚本编写

前面我们制作好了各个基础镜像,现在需要编写脚本来将镜像编译打包以及镜像生成,并推送到镜像仓库

我们有4个脚本要编写

1 jenkins pipeline的配置文件Jenkinsfile,这个是jenkins多分支流水线作业必须的配置文件

2 Dockerfile:构建应用镜像的描述文件

3 build_docker.sh:打包镜像的脚本,我们的项目通过maven打包以后,需要按一定规范存放文件,并且执行启动应用的脚本

4 start.sh项目启动的脚本,用于在镜像启动时执行

Jenkinsfile

pipeline {agent anystages {stage('package') {steps {sh 'mvn -Dmaven.test.skip=true -Dmaven.source.skip=true  -am clean package -U'}}stage('Test') {steps {sh './build_docker.sh -j smart4-api-1.0-SNAPSHOT.jar -F smart4-api'sh './build_docker.sh -j smart4-web-1.0-SNAPSHOT.jar -F smart4-web'}}}
}

   Dockerfile

FROM jdk8img
ARG jarfile
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezoneWORKDIR /data/app/smart4ENV DWPROJECTNO=smart4
ENV EXECJAR=$jarfileADD workspace /data/app/smart4EXPOSE 8081CMD ["sh","-c","shell/start.sh $EXECJAR"]

    build_docker.sh

#!/bin/bash
DOCKER_REGISTRY="harbor.udblogin.87yy.com:4443"
NAMESPACE="yygame"
BASEDIR=$(pwd)
PRONAME=`basename $BASEDIR`
DIRNAME=`dirname  $BASEDIR`
folder=`basename $DIRNAME`
dockerfile="Dockerfile"
product="test"
jarfile=""while getopts "f:F:p:j:" option
docase "$option" inf)dockerfile="$OPTARG";;F)folder="$OPTARG";;p)product="$OPTARG";;j)jarfile="$OPTARG";;\?)usageexit 1;;esac
doneecho "begin copy workspace"
rm -rf $BASEDIR/workspace
mkdir -p $BASEDIR/workspace/web
mkdir -p $BASEDIR/workspace/lib
mkdir -p $BASEDIR/workspace/shell
mkdir -p $BASEDIR/workspace/configfind . -maxdepth 4 -regex ".*/target/[^\/]*.war"  -exec cp -f {} $BASEDIR/workspace/web/ \;
find . -maxdepth 4 -regex ".*/target/[^\/]*.jar"  -exec cp -f {} $BASEDIR/workspace/lib/ \;
cp -Rf  config/* $BASEDIR/workspace/config/
cp ./start.sh $BASEDIR/workspace/shellecho "workspace is ready"echo "begin build docker"timestamp=$(date "+%Y%m%d%H%M%S")echo "build -f $dockerfile -t ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp . --build-arg jarfile=$jarfile"docker build -f $dockerfile -t ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp . --build-arg jarfile=$jarfileecho "docker build done"echo "start push to registry"
docker login --username=yygame harbor.udblogin.87yy.com:4443 -p xxxxxx
if [[ $product == "test" ]];thendocker push ${DOCKER_REGISTRY}/${NAMESPACE}/${folder}:$timestamp
fi
echo "folder $folder"
echo "product $product"
echo "exec jarfile $jarfile"

start.sh 

#!/bin/bash
jarfile=$1
echo "exec $jarfile"
echo "start app"
echo "java -Xss1m -server -d64 -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600  -Xms256m -Xmx2048m -cp /data/app/smart4/lib/$jarfile org.springframework.boot.loader.JarLauncher"
java -Xss1m -server -d64 -XX:MaxGCPauseMillis=200 -Dnetworkaddress.cache.ttl=600  -Xms256m -Xmx2048m -cp /data/app/smart4/lib/$jarfile org.springframework.boot.loader.JarLauncher

   

三 jenkins新建多分支流水线

新建任务,选择多分支流水线。主要配置git地址,凭据。配置发现分支策略,这里可以按项目代码规范来配置,比如开发版本就过滤掉,因为每次构建都会去打包生成镜像,如果不过滤会构建所有分支的镜像,比较耗时,耗费资源。配置好以后,运行构建,会自动打包并推送镜像到镜像仓库了。

四 构建

我们在jenkins后台选择smart4项目的master分支,点击构建

然后查看构建日志

待构建完成以后,去镜像仓库后台查看镜像仓库是否生成

我们看到已经生成了新的镜像了。整个流程完成。  

相关文章:

  • Java中的伪共享(False Sharing):隐藏的性能杀手与高并发优化实战
  • 安卓应用层抓包通杀脚本 r0capture 详解
  • 贝叶斯公式:用新证据更新旧判断: P(B∣A)⋅P(A)
  • Java正则表达式:从基础到高级应用全解析
  • 第4章 部署与固件发布:OTA、版本管理与制品仓库
  • Python爬虫实战:通过PyExecJS库实现逆向解密
  • 深度估计中为什么需要已知相机基线(known camera baseline)?
  • C++23 放宽范围适配器以允许仅移动类型(P2494R2)
  • vmware虚拟机运行多个产生卡顿问题
  • Spring源码主线全链路拆解:从启动到关闭的完整生命周期
  • 微服务项目->在线oj系统(Java版 - 1)
  • Vue-计算属性
  • 【QGIS二次开发】地图编辑-09
  • 1-机器学习的基本概念
  • 网络流算法
  • 进程与线程:10 信号量临界区保护
  • 【通用智能体】Serper API 详解:搜索引擎数据获取的核心工具
  • Redis 学习笔记 4:优惠券秒杀
  • GEE谷歌地球引擎批量下载逐日ERA5气象数据的方法
  • 《P4551 最长异或路径》
  • 宫崎骏的折返点
  • 波兰总统选举投票开始,将是对亲欧路线的一次严峻考验
  • 荣盛发展:新增未支付债务11.05亿元
  • 武康大楼再开发:一栋楼火还不够,要带火街区“朋友圈”
  • 淄博一酒店房间内被曝发现摄像头,当地警方已立案调查
  • 陕西三原高新区违法占用土地,被自然资源局罚款10万元