docker+jenkins+git搭建java自动化部署

2023-11-19

一、杂言

首先今天在写这篇文章的时候,刚好LOL洲际赛,RW赛前不被看好的情况下,为LPL扳回一城,RNG成功的在BO5最后一场拿下AFS,LPL成功的拿下了洲际赛的冠军.恭喜LPL!田忌赛马的故事大家都耳熟能详,但是不可避免的也会出现逆转的情况,正如我们这个行业,不学习你就输了,这篇文章本应该在这周一就开始写的,但是我太懒了,硬生生的拖到了周日,还在看完比赛后才开始写,为自己的拖延症感到惭愧啊.

按照之后的学习的进度,每周更新一篇文章才是常态,希望自己能做到...

下面开始正式的搭建过程.

ps:文章直接从我的知乎上copy过来的,貌似图片显示不出来,请直接访问知乎吧!文末附知乎地址!


二、准备工作

1.背景说明

本次实验是模拟项目发布流程,因为目前工作是负责java的ci部分,所以以java为例子来写。一般java项目的发布流程如下:

本地项目开发-->提交代码变更到远程仓库-->jenkins拉取代码、ci测试、编码源代码-->发布java代码-->测试

本文也是基于这样的理念来操作的.

2.准备工作

按照以上的流程,我们需要一个git服务器、jenkins服务器以及一个运行java代码的服务器,本篇文章中的git服务器选择github仓库;jenkins服务器就直接选择我windows上安装的jenkins;运行java代码环境的服务器这里选择一个docker容器,运行在我本地的虚拟机上.

说明:git、jenkins都可以使用docker容器来进行构建,但是本篇文章的重点不在这.

3.本篇文章使用的tale博客项目,tale访问地址:https://github.com/otale/tale.git,我已经clone到自己的项目库作为演示了.


三、构建过程

1.启动jenkins

本机cmd命令,到jenkins.war包目录下执行以下命令:

java -jar jenkins.war start   //如果启动失败报端口已被使用的话,启动时指定端口号


2.jenkins系统配置

  • 配置好邮件提醒,当构建失败的时候会发邮件提醒

ps: 出现‘553 Mail from must equal authorized user’错误的话,将用户名和Jenkins Location-->系统管理员邮件地址 配置一致即可;出现‘535 Error: authentication failed’错误的话,表示用户名和密码不一致,密码要填写对应的授权码

  • 全局工具配置中jdk、maven、git都配置自己本地的相应目录,也可以不配置(可参考我之前写的文章)
  • Publish over SSH配置(在系统设置中)

其他的部分配置成默认的就好,配置结束后点击Test Configuration,当出现success时表示配置成功.

3.新建maven的job

  • 新建job

选择构建一个maven项目,填写上项目名称,点击确定就行,如果没有显示maven项目,那可能是你没有下载相应的插件(maven intergration)

  • job配置

源码管理选择git,配置如下:

这里需要自己添加一个ssh认证,因为是通过http的方式clone代码的,所以只需要使用用户名和密码就行,这里checkout的是master分支

构建触发器,这里勾选下轮询SCM(poll scm),填写 “* * * * *”,表示每分钟去检查代码是否有变更,有变更的话就执行构建过程.

Build,这里是maven执行的指令,配置如下:

构建后操作,jenkins此时已实现将打好的tale包发送到该机器下的/data目录下,因此构建后的操作主要是开启tale进程即可,配置如下:

说明:

  • Name:默认的,不用填写
  • Source files:传到对应服务器的目录
  • Remove prefix:从source files中过滤掉的
  • Remote directory:传到服务器上对应的目录,这里是已设置好了的
  • Exec command:在服务器上的运行命令



四、测试结果

1.提交代码变更到git仓库,然后jenkins会自动开始构建(poll scm中设定的)

2.直接在jenkins上手动点击立即构建

以上虽然jenkins上显示的是黄球,但表示的是执行成功了.

然后输入地址:IP:9000即可访问,出现以下界面表示本次实验成功

说明:9000端口是tale默认的.


五、总结

  1. 以上是全部的构建过程,jenkins构建过程出错的话,多看看日志,然后分析。这篇文章应该昨天写的,然后被我拖到了今天......公司机器上没有docker环境(因为在公司使用的开发服务器本身是一个docker容器),所以演示不了构建docker镜像的过程,这部分晚上回家后再进行更新.
  2. tale可以不在tomcat环境下执行,如果是war包的话,需要构建tomcat环境.
  3. 在jenkins中那个shell命令是可以通过脚本的形式来执行的,因为本次试验命令比较少,就直接写了.
  4. 选择tale是因为依赖少,并且界面还挺美观.这个也可以使用自己的项目作为测试

六、更新部分

本篇文章的标题是基于docker构建,但是之前都是直接搭建在服务器上,接下来补充利用docker搭建部分。

1.首先服务器得安装docker,这里我在虚拟机中已经安装好了(不知道如何安装的小火鸡请参考我之前的文章)

2.部署tale.jar的环境,其实只需要安装java环境就好,这里因为是测试,就直接选用官方的tomcat镜像,也可以在centos镜像上挂载安装好的jdk,也可以直接用java镜像,这里我使用的tomcat镜像。

  • 下载tomcat镜像
docker pull tomcat   //一般是先docker search tomcat,然后选择好相应的版本
  • 打tag上传到自己的本地仓库
docker tag tomcat:latest 192.168.147.129:5000/tomcat  //打tag
docker push 192.168.147.129:5000/tomcat  //上传镜像到自己的本地仓库

3.接下来的步骤就是将Publish over SSH中的主机换成我本地的虚拟机,当构建成功后将jar包上传到我虚拟机的/home/wangkang/data目录下,然后利用docker启动tomcat镜像,挂载虚拟机的/home/wangkang/data目录到tomcat镜像的/opt/data目录下,分配8091的端口号给该镜像,然后执行java -jar /opt/data/tale/tale-latest.jar,命令如下:

docker run -it -d --name tale_test -p 8091:9000 -v /home/wangkang/data/:/opt/data/ tomcat:latest java -jar /opt/data/tale/tale-latest.jar

-d : 以服务的方式启动容器

--name:为容器命名,以后可以直接以docker start tale_test的方式启动该容器

-p 8091:9000 : 虚拟机的8091端口号映射容器内的9000端口号

-v :将虚拟机的/home/wangkang/data目录到tomcat镜像的/opt/data目录

java -jar /opt/data/tale/tale-latest.jar :在容器内的启动命令

以上命令是启动一个容器并执行相应的shell命令,最后本地输入网址jenkins:8091就能直接访问

ps:在配置publish over ssh插件的过程中遇到了一些麻烦,所以另外写了一篇文章记录自己的解决方案以及讲解下这个插件的配置,jenkins配置publish over ssh遇到的问题

jenkins中该插件的配置如下:

接下来是job中的配置,其他的保持不变,只需要更改构建后的配置即可,配置如图所示:

执行的shell命令是将tale_test容器重启,更新数据源等同于docker restart tale_test命令

这里增加一个邮件通知的设置(我在系统设置中已经配置好了,不懂如何配置的童鞋参考我之前的文章),当失败或者不稳定的时候,就发邮件通知我们:

4.在浏览地址输入jenkins:8091即可访问(在windows上做了域名重定向)

以上基于docker部分算是实验成功了.当每次提交代码变更到github仓库时,会触发jenkins的job,重新打包编译部署到服务器上,服务器启动docker容器来运行该项目,该操作基本实现了java代码的自动化部署,如果你想做CI部分,那可以利用maven来实现该功能,以后实践的时候我再尝试.


七、一些想法

CI部分暂且不提,以这样方式来实现自动化部署java代码固然可以,但有其局限性,ssh只能访问这台服务器,也就是说你能做的操作只能在这台服务器上.这时如果有个需求,需要你直接部署到不同的服务器呢?虽然此时可以用ansible或者其他方式来实现,但是不推荐在服务器上既部署代码,又部署其他服务,以免相互影响。这时我突然想到jenkins的分布式部署,下一篇文章会基于这来实现该功能.

写着写着就到凌晨两点半了...当真是码字不易啊,哈哈!

如果对文章有疑问或者哪里不懂的请联系我,在力所能及的范围内帮助解答;如果文章有错误,也欢迎指出。

知乎:https://zhuanlan.zhihu.com/p/39289273




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker+jenkins+git搭建java自动化部署 的相关文章

随机推荐

  • chatgpt赋能python:Python写一个抽奖程序:从随机数生成到实现

    Python写一个抽奖程序 从随机数生成到实现 Python是当今最热门的编程语言之一 无论是开发网站 进行数据分析 实现机器学习 还是进行游戏开发 Python都可以胜任 在本文中 我们将介绍如何使用Python编写一个简单的抽奖程序 程
  • 文件上传 华为云服务器,文件上传云服务器

    文件上传云服务器 内容精选 换一换 HPC是高性能计算 High Performance Computing 的简称 通常指以计算为目的 使用了很多处理器的单个计算机系统或者使用了多台计算机集群的计算机系统和环境 能够执行一般个人电脑无法处
  • djangorestframework 序列化

    djangorestframework 序列化 序列化常用字段参数 1 选项参数 name serializers CharField min length 3 max length 20 max length 最大长度 min lengh
  • Matplotlib画条形图和柱形图并添加数据标注

    这里放上我比较喜欢的一种条形图设置 使用的是之前爬取的重庆地区链家二手房数据 数据如下 链接 https pan baidu com s 17CMwUAdseO8tJWHEQiA8 A 提取码 dl2g import pandas as p
  • java list stream 去除 null_Stream流的这些操作,你得知道,对你工作有很大帮助

    Stream流 Stream 流 是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象 形成一个队列 Java中的Stream并不会存储元素 而 是按需计算 数据源 流的来源 可以是集合 数组等 聚合操作类似SQL语句一样的操作
  • 信号和槽

    1 信号和槽是一种高级接口 应用于对象之间的通信 它是QT的核心特性 也是QT区别于其它工具包的重要地方 信号和槽是QT自行定义的一种通信机制 2 moc Meta ObjectCompiler QT工具 该工具是一个C 预处理程序 它为高
  • Charles 安装及配置,详细步骤

    一 安装激活 1 1 下载 https www charlesproxy com download 1 2 激活 打开Charles gt Help gt Register Charles gt 输入 Registered Name htt
  • 2020.11.13 奇偶链表

    2020 11 13 奇偶链表 题目描述 给定一个单链表 把所有的奇数节点和偶数节点分别排在一起 请注意 这里的奇数节点和偶数节点指的是节点编号的奇偶性 而不是节点的值的奇偶性 请尝试使用原地算法完成 你的算法的空间复杂度应为 O 1 时间
  • Java:List<Map>指定Key去重,差集(针对集合里面只有Map非实体对象)

    ListMap去重 差集 针对集合里面只有Map非实体对象 问题 由于业务需求 接口的入参出参都是List格式 对于有些查出来的数据 为了防止重复的数据 需要对集合去重 以下分享一种去重的方法 该方法可根据指定字段对List
  • 最全 VxLAN 知识详解

    什么是VXLAN VXLAN Virtual eXtensible Local Area Network 虚拟扩展局域网 是由IETF定义的NVO3 Network Virtualization over Layer 3 标准技术之一 是对
  • 容器修改完成的镜像打包到自己的docker hub

    容器修改完成的镜像打包到自己的docker hub 一 步骤 首先 我们基于当前的容器进行了修改 比如 我们首先创建了一个Ubuntu的容器 然后在容器当中安装了python3 安装了Django框架 安装NGINX服务器 安装了mysql
  • rt-thread中使用WebClient WebNet总结 http学习

    HTTP学习资料 1 需求背景 WebClient主要用来传输文件 WebNet用来支持cgi接口 需要支持get post put delete方式 2 webnet中使用 2 1 webnet存在问题 2 11 rt thread 使用
  • Web基础 HTML标签 六种超链接标签的使用方式

    超链接标签 重点 1 链接的语法格式 a href 跳转目标链接 target self 文本或图像 a a 标签里的a是单词anchor的的缩写 意为 锚 两个属性的作用如下 属性 作用 href 用于指定链接目标的url地址 必须属性
  • 【物联网毕设基础】NBIOT 窄带物联网

    文章目录 1 简介 2 NBIOT简介 3NB的型号介绍 3 1 BC95 3 2 BC35 3 3 BC28 3 4 BC26 3 5 BC20 3 6 BC30 4 NB物联网卡 5 OpenCPU 6 BC260模块详解 6 1 基本
  • 【周末闲谈】二进制VS三进制

    个人主页 个人主页 系列专栏 周末闲谈 周末闲谈 第一周 二进制VS三进制 文章目录 周末闲谈 前言 一 效率 二 三进制计算机 三进制计算机的最后 总结 前言 作为计算机是20世纪最先进的科学技术发明之一 对人类的生产活动和社会活动产生了
  • yolov7 onnx tensorrt 批量预测 全网首发

    目录 deepstream yolov7 mask yolov5的TensorRT部署 动态batch 开源tensorrt 调研笔记 tensorrt 加载模型batch size为 1的原因
  • JS解混淆-AST还原案例

    目录 一 js混淆了解 1 为什么要混淆 2 常见的混淆模样 ob sojson jsfuck AAencode jjEncode eval 二 AST初步认识 三 解混淆常用的方法 一 js混淆了解 1 为什么要混淆 js混淆的作用 为了
  • 为什么计算机中的整数要用补码表示?补码表示有什么好处?

    为什么计算机中的整数要用补码表示 补码表示有什么好处 在计算机中 补码可谓是十分神奇而又重要的存在 我们知道整数在计算机内部的机器数一般都是补码表示的 这里给出几个这样表示的好处 符号位可以和数值为一起参加运算 比如俩个负数相加 只要结果在
  • 风投平台

    一 天使湾创投 http www tisiwi com 二 天使汇 http angelcrunch com 三 蚂蚁天使 https www mayiangel com index htm 四 梦想小镇孵化器平台 http www dre
  • docker+jenkins+git搭建java自动化部署

    一 杂言 首先今天在写这篇文章的时候 刚好LOL洲际赛 RW赛前不被看好的情况下 为LPL扳回一城 RNG成功的在BO5最后一场拿下AFS LPL成功的拿下了洲际赛的冠军 恭喜LPL 田忌赛马的故事大家都耳熟能详 但是不可避免的也会出现逆转