基于Jenkins,docker实现自动化部署(持续交互)【转】

news2024/12/28 9:22:04

前言

随着业务的增长,需求也开始增多,每个需求的大小,开发周期,发布时间都不一致。基于微服务的系统架构,功能的叠加,对应的服务的数量也在增加,大小功能的快速迭代,更加要求部署的快速化,智能化。因此,传统的人工部署已经心有余而力不足。
持续集成,持续部署,持续交互对于微服务开发来说,是提高团队整体效率不可或缺的一环。合理的使用CI,CD能够极大的提高了生产效率,也提高了产品的交互质量。本文不对三个概念做过多的介绍,有兴趣可以读读这篇文章:The Product Managers’ Guide to Continuous Delivery and DevOps 我想会有一定的收获。
本文主要介绍下基于Jenkins+docker 实现自动化部署

希望阅读此文对maven,docker的使用有一定的了解

Jenkins + Docker

下图是构想的网络结构图

大体结构

  1. 开发人员在gitLab上打了一个tag
  2. gitLab把tag事件推送到Jenkins
  3. Jenkins 获取tag源码,编译,打包,构建镜像
  4. Jenkins push 镜像到阿里云仓库
  5. Jenkins 执行远程脚本
    5-1. 远程服务器 pull 指定镜像
    5-2. 停止老版本容器,启动新版本容器
  6. 通知测试人员部署结果

基于maven构建镜像,上传阿里云docker仓库

maven 构建镜像配置

pom.xml 文件添加docker插件

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.11</version>
    <configuration>
        <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
        <imageTags>
            <imageTag>${project.version}</imageTag>
            <imageTag>latest</imageTag>
        </imageTags>
        <dockerDirectory>src/main/docker</dockerDirectory>
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
</plugin>
  • ${docker.image.prefix} 是镜像的前缀
  • ${project.artifactId} 是镜像名字
  • ${project.version} 版本号,此处也用来当做镜像的版本号

docker-maven-plugin 使用可以自行百度。

src/main/docker 目录下新增文件 Dockerfile,内容如下:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD demo-service-ver-0.0.1.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

以上的配置可以把一个服务打包成镜像,只需要执行

  $ sudo mvn package docker:build

阿里云docker仓库使用

注册或者启用阿里云docker仓库就不赘述。下面简单介绍上传拉取docker镜像

  • 登录

    $ sudo docker login --username=用户名 --password=密码 registry-internal.cn-hangzhou.aliyuncs.com
    
  • push 之前生成的镜像

    $ sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/xxx/demo-service:[镜像版本号]
    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/xxx/demo-service:[镜像版本号]
    

    xxx : 是你镜像仓库的namespace

    一堆push后,你就可以在阿里云的Docker镜像仓库里面看到你对应的镜像了。下图是我们公司的部分镜像列表

    • 镜像列表

  • pull 镜像

    登录操作同上

    $ sudo docker pull  registry.cn-hangzhou.aliyuncs.com/xxx/demo-service:[镜像版本号]
    

jenkins 部署配置

构建Jenkins镜像

FROM jenkins
USER root
RUN apt-get update && apt-get install -y sudo && rm -rf /var/lib/apt/lists/* 
RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
USER jenkins

一开始使用官方的镜像直接启用,一些插件和配置多少都有点问题,比如不能使用sudo,等等。因此基于官方镜像构建一个更符合我们需要的镜像。

构建命令:

 $ sudo docker build -t buxiaoxia/jenkins:1.0

启动Jenkins容器

sudo docker run --memory 1.5G  --name buxiaoxia-jenkins \ 
-p 18181:8080 -p 50000:50000 -u root -d \ 
--env JAVA_OPTS="-Xms256m -Xmx512m  -XX:MaxNewSize=256m"  \ 
-v /var/run/docker.sock:/var/run/docker.sock   \ 
-v /usr/bin/docker:/usr/bin/docker  \ 
-v /home/buxiaoxia/software/jenkins:/var/jenkins_home  \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
buxiaoxia/jenkins:1.0

简单解释下:

-v /var/run/docker.sock:/var/run/docker.sock-v /usr/bin/docker:/usr/bin/docker是把宿主机docker 映射到容器内。

-v /home/buxiaoxia/software/jenkins:/var/jenkins_home 指定Jenkins的宿主机存储路径

-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 在centos7 系统下会出现个别的包丢失,对应的引下宿主机的包就可以。

docker在容器内构建的时候,如果出现权限不够什么的。可以在宿主机中使用以下两种方式:

  $ sudo chmod 777 /var/run/docker.sock

或者

  $ usermod -a -G docker jenkin

jenkins 启动后,访问对应的Jenkins页面,初始化只要一步步跟着走就可以了。

Jenkins配置

插件下载

所需要的插件:

  • Maven Integration plugin
  • docker-build-step
  • Docker plugin
  • Gitlab Hook Plugin
  • GitLab Plugin

因为使用的是gitlab,对应的插件也是必须的。下载完插件后,maven等相关插件配置好(此处省略…)

maven 镜像地址配置

可以直接在宿主机修改,路径在: /home/buxiaoxia/software/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven3-1/conf 下的settings.xml

setting.xml 镜像改成阿里云的就OK,飞起。。。

新建一个maven job

源码配置
构建
构建后执行特定脚本

脚本内容如下:

echo '================开始推送镜像================'
sudo docker login --username=用户名 --password=密码 registry-internal.cn-hangzhou.aliyuncs.com 
sudo docker push registry-internal.cn-hangzhou.aliyuncs.com/xxx/demo-service
echo '================结束推送镜像================'
echo '================开始远程启动================'
ssh buxiaoxia@192.168.100.2 -tt << remotessh            ###首先要ssh上去注意这里的<< remotessh,需要做公钥密钥

####从这里开始都是在远程机器上执行命令
cd /home/buxiaoxia/xiaw
./jenkins.sh registry-internal.cn-hangzhou.aliyuncs.com/xxx/demo-service
sudo docker login --username=用户名 --password=密码 registry-internal.cn-hangzhou.aliyuncs.com 
sudo docker pull registry-internal.cn-hangzhou.aliyuncs.com/xxx/demo-service

sudo docker run -d -m 300m  --name=demo-service-`date +%Y-%m-%d` --restart=always registry-internal.cn-hangzhou.aliyuncs.com/xxx/demo-service
echo "finished!"

#####执行完毕

exit  ###退出远程机器
remotessh  ###结尾哦
echo '================结束远程启动================'

jenkins.sh 脚本内容:

#!/bin/sh
sudo docker stop $(sudo docker ps | grep $1|awk '{print  $1}'|sed 's/%//g')

以上就完成了一个简单的自动化构建

gitlab配置webhook

Jenkins安装完对应的gitlab插件,配置中的构建触发选择如下

复制红框中的url

再在gitlab的对应项目中webhooks页面中的url填入前面复制的url

保存即可,右下角可以点击测试哦。

配置完成后,每次该项目有个tag push event ,都会触发Jenkins的自动构建。接着,Jenkins就执行 拉取源码 -> 编译 -> 构建镜像 -> 推送镜像 -> 执行远程启动脚本完成部署。

总结

一步步的配置,基本就跑通了我们基于Jenkins,docker实现自动化部署的初始版本。开发人员完成功能开发后,需要交互一个测试版本,只需要推送一个tag到git仓库,就能够将代码自动部署到特定的服务器上。可喜可贺~ 可以省去一堆的从一个服务器跑到另一个服务器,然后执行各种命令的琐碎操作。。。

关于配置

目前我是使用了consul的配置共享,把不同环境的配置放在了consul上,镜像中没有保留可变的配置,而是根据启动的参数就可以自由切换环境配置。
当然,consul的配置共享可以看看我git上关于consul的项目:http://git.oschina.net/buxiaoxia/spring-demo

存在问题

  • docker未使用编排,较为独立,需要知道特定的服务器网络位置
  • docker镜像的push与pull,都需要明文执行阿里云账号密码,可进一步改进
  • 未构建版本回退流程
  • shell脚本健壮性不够,异常未处理

优化

可以针对以上问题做相应的优化,完善初始化版本的CD流程。例如,docker 使用swarm,让swarm管理docker 容器等等。

PS:本文只是提供了一个自认为较为简单的一种方式吧,有什么建议的可以留言提供给我,谢了各位~

转至:https://developer.aliyun.com/article/611302

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Apple 设备(包括 iPad、iOS 和 MacBook)上为用户提供完整的 SAP GUI

苹果应用功能 高效且直观的用户界面。 访问 VA01、MI31、MI04、IW21 等。– 无编程 自动化和简化您的 SAP 流程&#xff0c;如库存盘点 在 Apple 设备&#xff08;包括 iPad、iOS 和 MacBook&#xff09;上为用户提供完整的 SAP GUI&#xff0c;利用他们已经了解的 UI 丰富性并…

持续集成——web自动化测试集成实战

文章目录 一、Web自动化测试持续集成的好处二、环境准备三、Jenkins节点挂载四、节点环境的配置1、JDK2、Chrome 浏览器3、chromedriver4、Python3环境5、allure-commandline工具6、allure插件 五、本地运行待测代码(保证代码没有问题)六、库文件的导出七、Jenkins上运行代码配…

高功率激光切割中不良现象的排除技巧

高功率切割市场现状 随着激光行业的发展和下游产业需求的变化&#xff0c;高功率的激光切割设备已逐渐成为市场关注的热点。高功率激光切割凭着速度和厚度上无可比拟的优势&#xff0c;目前已获得了市场的广泛认可。 但由于高功率激光切割技术尚处于普及的初级阶段&#xff0c;…

栈溢出的原理

目录 缓冲区 我们先以解决这个题目为准 然后通过这个题目去做透 gdb 代码段 栈中 当前时刻寄存器存储的内容 1 寻找漏洞函数 输入 输出 字符串 2 确定填充长度 覆盖函数返回地址 覆盖栈上变量的内容 覆盖bss段 栈溢出是在堆栈中 对某一个变量无限制的输入 超出了…

【三十天精通Vue 3】第十九天 Vue 3的渐进式Web应用程序详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、什么是渐进式 Web 应用程序1.1 渐进式 Web 应用程序的定义…

市场预测美联储加息的有效性几何

美联储加息已狂飙一年&#xff0c;很多相关预测美联储加息降息的文章都会提到“一年内加息多少次的概率是多少多少”这种表述&#xff0c;那么这个数据是怎样计算的&#xff1f;本期笔者将简单讨论美国联邦利率的运作机制&#xff0c;介绍用于预测联储加/降息概率的方式&#x…

vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode

通过使用 qrcode 生成二维码&#xff0c; 使用 jszip 打包批量二维码文件&#xff0c; 使用 file-saver 下载打包好的zip文件&#xff0c; 使用 vue-print-nb 打印生成的二维码 生成二维码&#xff1a; 打印二维码 下载二维码 1. 批量生成二维码—安装依赖 ![请添加图片描述]…

CH32F203RCT6 pin2pin兼容STM32F103RCT6

32位大容量通用型Cortex-M3单片机 CH32F203是基于Cortex-M3内核设计的工业级大容量通用微控制器&#xff0c;此系列主频高达144MHz&#xff0c;独立了GPIO电压&#xff08;与系统供电分离&#xff09;。资源同比增加了随机数单元&#xff0c;4组运放比较器&#xff1b;提高串口…

硅烷PEG马来酰亚胺,Silane-PEG-Mal,马来酰亚胺聚乙二醇硅烷

中文名称&#xff1a;马来酰亚胺聚乙二醇硅烷 英文名称&#xff1a;Silane-PEG-Maleimide&#xff0c;Silane-PEG-MAL 性状&#xff1a;液体或者固体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水、DMSO、DMF、DCM等常规性有机溶剂 活性基团&#xff1a;MAL 分子量&am…

【spring事务】源码分析

项目启动时&#xff0c;创建代理过程 initializeBean.applyBeanPostProcessorsAfterInitialization 由AnnotationAwareAspectJAutoProxyCreator来处理 AnnotationAwareAspectJAutoProxyCreator wrapIfNecessary 通过getAdvicesAndAdvisorsForBean获取bean满足的Advisor&…

DHCP 服务器监控

网络中使用了数千个 IP 地址&#xff0c;当今大多数组织中的 IP 地址都由 DHCP 服务器提供服务。必须发现可用的 IP 地址、了解如何预配 IP 并了解 IP 池利用率。使用 DHCP 服务器进行 IP 预配可以更轻松地获得这些重要见解&#xff0c;并根据组织的不同需求分配不同的范围。这…

SYSU程设c++(第十周)继承与派生、继承的访问控制、继承的构造函数与析构函数

继承与派生 使用背景&#xff1a; 当定义一个新的类 B 时&#xff0c;如果发现类 B 拥有某个已写好的类 A 的全部特性&#xff0c;此外还有类 A 没有的特性&#xff0c;那么就不必从头重写类 B&#xff0c;而是把类 A 作为一个“基类”&#xff08;也称“父类”&#xff09;&a…

【正则表达式上】——03全栈开发——如桃花来

目录索引 介绍&#xff1a;常见匹配模式&#xff1a; re.match()方法&#xff1a;常规匹配&#xff1a;泛匹配&#xff1a; 匹配目标-匹配分组&#xff1a;贪婪匹配&#xff1a;非贪婪匹配&#xff1a; 介绍&#xff1a; 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就…

Unsupervised Point Cloud Pre-training via Occlusion Completion

题目&#xff1a;Unsupervised Point Cloud Pre-training via Occlusion Completion 摘要 方法&#xff1a; 提出一种用于点云的预训练方法Occlusion Completion (OcCo) 技术细节&#xff1a; mask相机视角里被遮挡的点学习一个encoder-decoder模型&#xff0c;用于重建被遮…

如何批量修改删除html文件中的标签属性

最近工作中遇到一个问题&#xff0c;一份html文档因为内容里面的样式标签过多导致文件整体过大。 这些描述标签不是必须的&#xff0c;现在需要优化删除掉这些标签从而减小文件体积。 对于这种批量修改删除的任务&#xff0c;我们首先想到的就是使用编辑器处理。 编辑html文…

Linux网络——Shell编程规范与变量

Linux网络——Shell编程规范与变量 一、Shell脚本概述1.Shel脚本的概念2.Shell脚本应用场景3.Shell的作用 二、编写第一个Shell脚本1.Shell脚本的构成2.运行 Shell 脚本 三、重定向与管道操作1.交互式硬件设备2.重定向操作3.管道操作符号 " | " 四、Shell变量的作用、…

滤筒除尘器

滤筒除尘器以滤筒作为过滤元件所组成或采用脉冲喷吹的除尘器。 滤筒除尘器按安装方式分&#xff0c;可以分为斜插式 侧装式&#xff0c;吊装式&#xff0c;上装式。 滤筒除尘器按滤筒材料分&#xff0c;可以分为长纤维聚酯滤筒除尘器&#xff0c;复合纤维滤筒除尘器&#xff0c…

Whistle安装与使用

1、安装npm 网上搜索安装教程&#xff0c;但是使用npm安装软件的时候一直报错 修复方案&#xff0c;将http改成https 2、安装whistle : npm install whistle -g 以及配置见下面两篇文章 爬虫工具—whistle安装与使用 - 简书 whistle安装以及使用_奔跑的蜗牛_爱阳光的博客-C…

拼多多Temu新增欧洲六国站点,席卷全球,你还在观望吗?

4月24日消息&#xff0c;消息称&#xff0c;拼多多跨境电商平台Temu已于4月21日正式上线其英国站点&#xff0c;而其德国站、荷兰站、意大利站、法国站与西班牙站也均于昨日上线。至此&#xff0c;拼多多Temu已在全球共开设了10个海外市场。 登陆上述六大欧洲站点&#xff0c;…

【self-instruct方式生成语料代码实战】

self-instruct方式生成语料代码实战 self-instruct 介绍self-instruct 框架生成语料代码实现过程Step1 通过模型生成新的指令Step2 对模型生成的指令进行判断Step3&#xff1a;根据Step2的判断结果&#xff0c;给出不同的输出Step4&#xff1a;过滤及后处理 本文对 self-instru…