介绍
随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致。基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化。因此,传统的人工部署已经心有余而力不足。
持续集成,持续部署,持续交互对于微服务开发来说,是提高团队整体效率不可或缺的一环。合理的使用CI,CD能够极大的提高了生产效率,也提高了产品的交互质量。
流程梳理:
1.开发人员对上线版本在gitLab上打了一个tag
2.jenkins获取tag版本.
3.编写pipeline
3.1 拉取代码 git clone
3.2 maven 构建jar包
3.3 编写dockerfile文件
3.4 创建镜像并推送到本地harbor镜像仓库
3.5 首先删除容器,拉取镜像并启动容器
jenkins准备:(相关插件使用)
1.1 安装插件
1.2.使用Role-Based Strategy插件
1.3 添加全局角色和项目角色
1.4 赋予用户权限
2.master-slave 介绍
2.1解决jenkins单点构建任务多,负载高,性能不足的场景。
2.2 构建项目的时候选择,构建这个项目的时候,就会在192.168.17.7服务器上来执行pipeline中的一系列操作。
jenkins图像化界面设置:
1.设置保留构建历史(个数与天数)
2.参数化构建,选取对应的tag来发版。(一般以日期时间分钟来命名tag版本,便于区分)
3.pipeline编写
详细内容参考:
node() {
stage(' Git clone ') {
git branch: 'test', credentialsId: 'dc404ee2-350e-4934-a668-da4aee1ba535', url: 'git@xx.xx.xx.xx:meiyeyun/backend/xxxx/yx_${service_name}.git'
}
stage('maven buid'){
def mvnhome = '/usr/local/maven/'
def jdkhome = '/usr/local/jdk1.8.0_161'
env.PATH = "${mvnhome}/bin:${jdkhome}/bin:${env.PATH}"
sh "mvn clean package -Dmaven.test.skip=true"
}
stage("Create Dockerfile"){
sh '''cat << EOF > Dockerfile
FROM java
ADD target/${service_name}-0.0.1-SNAPSHOT.jar app.jar
enter ["java","-Djava.library.path=/usr/local/lib -server -XX:ReservedCodeCacheSize=64m -XX:TLABWasteTargetPercent=10 -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+ParallelRefProcEnabled -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UnlockDiagnosticVMOptions -XX:ParallelGCThreads=8 -XX:ConcGCThreads=4 -Xss256k -server -Xms2g -Xmx2g -XX:MaxDirectMemorySize=256m -XX:MaxTenuringThreshold=3 -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UnlockDiagnosticVMOptions -XX:ParGCCardsPerStrideChunk=32768 -XX:+AlwaysPreTouch","-jar","/app.jar","--spring.profiles.active=test"]
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
'''
sh 'cat Dockerfile'
}
stage("build images and push to harbor"){
sh '''
containerPool=172.10.2.10/myy_test
docker build -t ${service_name}:v1 .
docker tag ${service_name}:v1 ${containerPool}/${service_name}:v1
docker login -u admin -p 124356 172.10.2.10
docker push ${containerPool}/${service_name}:v1
'''
}
stage("pull images and deploy"){
sh '''
containerPool=172.10.2.10/myy_test
ansible myy_test -a "docker rm -f ${service_name}"
ansible myy_test -a "docker login -u admin -p 124356 172.10.2.10"
ansible myy_test -a "docker pull ${containerPool}/${service_name}:v1"
ansible myy_test -a "docker run -d -p 8991:8991 --name ${service_name} -v /data/${service_name}/:/data/ --network=host ${containerPool}/${service_name}:v1"
ansible myy_test -m shell -a "docker ps |grep ${service_name}"
'''
}
}
注明:
1.172.10.2.10为harbor地址。
2.微服务较多,可以在gitlab定义多个,如yx_oms.git;yx_ums.git; jenkins部署的时候可根据选择来部署。3.为了达到后端高可用及负载均衡,一般部署在两台上,因此用ansible来管理后端节点,如删除容器,拉取镜像,启动容器。