💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
自动化运维之Git+Jenkins 基本使用
**技能目标: **
**- 了解 Jenkins 持续集成工具 **
**- 学会安装 Jenkins 持续集成工具 **
**- 学会利用Jenkins实现源码自动打包部署 **
**2.1 案例分析 **
**2.1.1 案例概述 **
**随着软件开发复杂度的不断提高,团队成员之间如何更好地协同工作以确保软件开发的 **
**质量,已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、 **
**部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代 **
**码变更的信息,从而可以更早的进入测试阶段;并且能够更早的发现问题,这样解决问题的 **
**成本就会显著下降。持续集成缩短了从开发、集成、测试、部署各个环节的时间,从而也缩 **
**短了中间出现的等待时间。持续集成也意味着开发、集成、测试、部署得以持续。所以,当 **
**配置完 Jenkins 持续集成持续交付环境后,就可以把发布的任务交给集成服务器去处理了。 **
**本章将使用 Maven(Ant) 等来实现 Java 项目自动化构建发布部署。这些工具可以帮助在构 **
**建过程中实现自动化发布、回滚等动作。 **
**2.1.2 案例前置知识点 **
**1. 什么是 Jenkins **
**Jenkins 原名 Hudson,2011 年改为现在的名字,它是一个开源的实现持续集成的软件 **
**工具。官方网站网址:https://jenkins.io/。 **
**Jenkins 能实时监控持续集成过程中所存在的问题,提供详细的日志文件和提醒功能, **
**还能通过图表的形式,形象地展示项目构建的趋势和稳定性。 **
**Jenkins 包含以下几个特点: **
** **
**易安装:从官网仅需要下载一个 jenkins.war 文件后,直接运行,无需额外的安装,更 **
**无需安装数据库; **
** **
**易配置:提供友好的 GUI 配置界面; **
** **
**变更支持:Jenkins 能从代码仓库(SVN /Git)中获取并产生代码更新列表,并显示到 **
**编译输出信息中; **
** **
**支持永久链接:用户是通过 Web 来访问 Jenkins 的,而这些 Web 页面的链接地址都是 **
永久链接地址,可以在各种文档中直接使用该链接;
** **
**集成 E-Mail/RSS/IM:当完成一次集成后,可通过这些工具实时收取集成结果(构建一 **
**次集成需要花费一定时间,有了这个功能,就可以在等待结果过程中,干别的事情); **
** JUnit/TestNG 测试报告:是以图表等形式提供详细的测试报表功能; **
** **
**支持分布式构建:Jenkins 可以把集成构建等工作分发到多台计算机中完成; **
** **
**文件指纹信息:Jenkins 会保存构建集成所产生的 jars 文件、集成构建使用了哪个版本 **
**的 jars 文件等构建记录; **
** **
**支持第三方插件:Jenkins 支持第三方插件,这使得 Jenkins 功能变得越来越强大。 **
**2. 持续集成的作用 **
**持续集成(Continuous Integration,简写为 CI)可以保证团队开发人员提交代码的质量, **
**减轻软件发布的时间压力。在持续集成过程中任何一个环节都是自动完成的,无需太多的人 **
**工干预,这样有利于减少重复过程,从而可以节省时间、费用和工作量。 **
**3. 持续集成的特点 **
**持续集成是一个自动化的、周期性的集成测试过程,检出代码、编译构建、运行测试、 **
**结果记录、测试统计等过程都是自动完成的,无需人工干预。持续集成需要有专门的集成服 **
**务器来执行集成构建操作,同时需要有代码托管工具的支持。 **
**4. 持续集成的工作原理 **
**Jenkins 的工作原理是先将源代码从 SVN/Git 版本控制系统中拷贝一份到本地,然后根 **
**据设置的脚本进行 build(构建)。整个系统的关键就是 build 脚本,build 脚本告诉 Jenkins **
在一次集成中需要执行的任务,如图 2.1 所示。**图 2.1 持续集成工作原理 **
**5. Maven 介绍 **
**Maven 项目对象模型(POM)是可以通过一小段描述信息来管理项目的构建、报告和文 **
**档的软件项目管理工具。 **
**Maven 除了程序构建能力出色之外,还提供高级项目管理工具。由于 Maven 的缺省构 **
**建规则有较高的可重用性,所以常常用两三行 Maven 脚本就可以构建简单的项目。由于 **
**Maven 是面向项目的方法,许多 Apache Jakarta 项目发布时都使用 Maven,而且公司企业 **
**项目采用 Maven 的比例也在持续增长。 **
**Maven 这个单词意为知识的积累,最初在 Jakata Turbine 项目中用来简化构建过程。 **
**当时,有一些项目(有各自 Ant build 文件)仅有细微的差别,而 JAR 文件都由 CVS 维护。 **
**于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式 **
**发布项目的信息,以及一种简单的方式在多个项目中共享 JARs,因此 Maven 就这样诞生 **
**了。 **
**2.1.3 案例环境 **
**1. 本案例环境 **
**本案例共使用三台服务器,每台服务器划分不同的服务角色,最后通过配置 Jenkins 实 **
**现自动打包部署 Java 项目。本案例具体实验环境如表 2-1 所示。 **
*表 2-1 Git+Jenkins 基本环境主机操作系统 主机名/IP 地址主要软件服务器CentOS 7.3-x86_64Jenkins/192.168.8.91Jenkins服务器CentOS 7.3-x86_64Docker/192.168.8.92Docker服务器CentOS 7.3-x86_64Git/192.168.8.93*Git/SVN **
**2. 案例拓扑 **
本章案例拓扑图,如图 2.2 所示。
**图 2.2 案例拓扑 **
**3. 案例需求 **
**(1)从 GitHub 下载开源的博客系统到本地,然后将开源的博客系统源码提交到 Git 本 **
**地代码版本控制系统。 **
**(2)配置 Jenkins 持续集成持续交付工具,完成 Java 项目自动打包部署等工作。 **
**4. 案例实现思路 **
**(1)准备 Jenkins 基础环境。 **
**(2)Jenkins 基本配置。 **
**(3)实现 Jenkins 自动打包。 **
**2.2 案例实施 **
2.2.1 准备 Jenkins 基础环境
**1. 准备系统环境 **
**三台主机都执行以下操作,主机名根据不同主机做调整。 **
**[root@localhost ~]# hostnamectl set-hostname jenkins **
**[root@localhost ~]# bash **
**[root@jenkins ~]# systemctl stop firewalld && systemctl disable firewalld **
**[root@jenkins ~]# systemctl stop NetworkManager && systemctl disable NetworkManager **
**[root@jenkins ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config **
**[root@jenkins ~]# setenforce 0 **
**2. 使用 YUM 安装并配置 Git **
**[root@git ~]# yum install -y git **
**//jenkins 主机也需执行此条命令 **
**[root@git ~]# useradd git **
**[root@git ~]# passwd git **
**更改用户 git 的密码 。 **
**新的 密码: **
**//输入 git 用户的密码,密码可自行设定 **
**重新输入新的 密码: **
**passwd:所有的身份验证令牌已经成功更新。 **
**[root@git ~]# su - git **
**[git@git ~]$ mkdir tale.git **
//创建 Git 版本仓库,一般以.git 为后缀
**[git@git tale.git]$ git --bare init **
**初始化空的 Git 版本库于 /home/git/tale.git/ **
**[git@git tale.git]$ ll **
**total 12 **
**drwxrwxr-x. 2 git git **
**6 Jul 1 17:10 branches **
**-rw-rw-r--. 1 git git 66 Jul 1 17:10 config **
**-rw-rw-r--. 1 git git 73 Jul 1 17:10 description **
**-rw-rw-r--. 1 git git 23 Jul 1 17:10 HEAD **
**drwxrwxr-x. 2 git git 242 Jul 1 17:10 hooks **
**drwxrwxr-x. 2 git git 21 Jul 1 17:10 info **
**drwxrwxr-x. 4 git git 30 Jul 1 17:10 objects **
**drwxrwxr-x. 4 git git 31 Jul 1 17:10 refs **
**此时,Git 服务器就已经部署完成。但是,用户还不能向服务器推送数据,也不能克隆 **
**Git 版本仓库。因为要在服务器上开放至少一种支持 Git 的协议,比如:HTTP/HTTPS/SSH **
**协议等,现在使用最多的就是 HTTPS 和 SSH 协议。切换至 Git 客户机(192.168.8.91)生 **
**成免交互 SSH 密钥认证。 **
**[root@jenkins ~]# ssh-keygen **
**//一路回车 **
**[root@jenkins ~]# ssh-copy-id git@192.168.8.93 **
**//将客户机的公钥传递给 Git 服务器 **
**这样,就可以从 Git 服务器中克隆版本仓库了(此时目录内没有文件是正常的)。[root@jenkins ~]# git clone git@192.168.8.93:/home/git/tale.git **
**正克隆到 'tale'... **
**warning: 您似乎克隆了一个空版本库。 **
**3. 下载开源博客系统 **
**将开源博客系统源码克隆到本地 Git 仓库目录,然后添加注释“all tale”,并提交到 Git **
**版本仓库中。 **
**[root@jenkins ~]# mkdir tale-test **
**[root@jenkins ~]# cd tale-test/ **
**[root@jenkins table-test]# git clone https://github.com/otale/tale.git **
**[root@jenkins table-test]# cd **
**[root@jenkins ~]# cp -rf tale-test/tale/* tale/ **
**[root@jenkins ~]# cd tale **
**[root@jenkins tale]# git add . **
**[root@jenkins tale]# git commit -m "all tale" **
***** Please tell me who you are. **
**Run **
**git config --global user.email "you@example.com" **
**git config --global user.name "Your Name" **
**to set your account's default identity. **
**Omit --global to set the identity only in this repository. **
**fatal: unable to auto-detect email address (got 'root@Jenkins.(none)') **
**[root@jenkins tale]# git config --global user.email "admin@example.com" **
**[root@jenkins tale]# git config --global user.name "admin" **
**[root@jenkins tale]# git commit -m "all tale" **
**[root@jenkins tale]# git push origin master **
**//默认 push 到 master 主干 **
**Counting objects: 349, done. **
**Compressing objects: 100% (302/302), done. **
**Writing objects: 100% (349/349), 5.29 MiB | 5.54 MiB/s, done. **
**Total 349 (delta 37), reused 0 (delta 0) **
**To git@192.168.8.93:/home/git/tale.git **
*** [new branch] **
**master -> master **
**4. 安装部署 Jenkins **
**(1)部署 Tomcat **
**提前下载好 JDK 与 Tomcat 软件包,用于部署 Tomcat 服务。 **
**[root@jenkins ~]# tar zxvf jdk-8u202-linux-x64.tar.gz **
**//先上传 JDK 安装包 **
**[root@jenkins ~]# mv jdk1.8.0_202/ /usr/local/java/ **
**[root@jenkins ~]# vim /etc/profile **
**export JAVA_HOME=/usr/local/java/ **
**export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexport PATH=$JAVA_HOME/bin:$PATH **
**[root@jenkins ~]# source /etc/profile **
**[root@jenkins ~]# java -version **
**java version "1.8.0_202" **
**Java(TM) SE Runtime Environment (build 1.8.0_202-b08) **
**Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode) **
**[root@jenkins ~]# tar zxvf apache-tomcat-8.5.56.tar.gz **
**[root@jenkins ~]# mv apache-tomcat-8.5.56 /usr/local/tomcat **
**[root@jenkins ~]# tar zxvf apache-maven-3.6.0-bin.tar.gz **
**[root@jenkins ~]# mv apache-maven-3.6.0 /usr/local/maven **
**[root@jenkins ~]# cd /usr/local/tomcat/bin/ **
**[root@jenkins bin]# sh startup.sh **
**(2)部署 Jenkins **
**从官网 http://mirrors.jenkins.io/war,下载 jenkins.war 软件包,尽量下载较新版本的 **
**Jenkins,旧版本在实验中可能会出现默认插件不支持安装。将 jenkins.war 文件保存到 **
**Tomcat 服务的 /usr/local/tomcat/webapps 目录下。启动 Tomcat 就会自动部署 Jenkins。 **
**将 jenkins.war 软件包上传到 Tomcat 服务的对应目录后,在浏览器的地址栏中输入 **
http://192.168.8.91:8080/jenkins 便可开始部署 Jenkins,如图 2.3 所示。
**图 2.3 解锁 Jenkins **
**从图 2.3 中可以看出 Tomcat 方式启动 Jenkins 已经成功。初次部署 Jenkins,会生成 **
**一个初始登录密码。 **
**[root@jenkins ~]# cat /root/.jenkins/secrets/initialAdminPassword **
**909ce9e5e72440d2b90ea891ef8148d9 **
**//每个人的密码不同 **
**复制这段密码到浏览器的“管理员密码”框中,并单击“继续”登录 Jenkins,然后选择“安 **
装推荐插件”,如图 2.4 所示。在实际生产环境下,可以根据需求安装 Jenkins 插件。**图 2.4 安装推荐插件 **
**在安装插件的过程中,个别插件可能因为网络问题会出现安装失败现象。如果出现插件 **
**安装失败现象,可暂时忽略,之后可到“插件管理”内安装对应插件。 **
**插件安装完后,会出现“创建第一个管理员用户”的提示,本案例中创建的用户、密码与 **
邮件地址,如图 2.5 所示。
**图 2.5 创建管理员用户 **
**创建完管理员用户后单击“保存并完成”→“开始使用 Jenkins”,可进入 Jenkins 首页,如 **
图 2.6 所示。
**图 2.6 Jenkins 首页 **
**至此,Jenkins 已经部署完毕。 **
**2.2.2 Jenkins 配置 **
**在部署完 Jenkins 工具后,就可以对 Jenkins 进行配置。本案例的配置主要包括以下几 **
**个步骤。 **
**(1) 安装 Jenkins 必要插件; **
**(2) 添加验证凭据; **
**(3) 添加 Publish Over SSH 远程主机; **
**(4) 配置 Maven、JDK、Git 环境; **
**(5) 构建 tale 基础镜像; **
**(6) 构建新的工程项目; **
**(7) 验证 Jenkins 持续集成持续交付。 **
**1. 安装 Jenkins 必要插件 **
**在 Jenkins 首页中,单击左侧的“Manage Jenkins”→“Manage Plugins”→“可选插件”, **
**进入如图 2.7 所示插件安装界面,在搜索框中,输入要安装的 Publish Over SSH 、Maven **
Integration 插件,并勾选其左侧的复选框,单击“直接安装”按钮,开始插件安装操作。
**图 2.7 可选插件页面 **
**2. 添加 Publish Over SSH 远程主机 **
**在 Docker 主机上创建远程目录。 **
**[root@docker ~]# mkdir /data **
**在 Jenkins 首页中,单击“Manage Jenkins”→“Configure System”→“Publish over **
**SSH”→“SSH Servers”→“新增”选项,添加 SSH 远程主机,如图 2.8 所示。输入 Name、 **
**Hostname、Username 必要信息后,单击“高级”选项→勾选“Use Password authentication,or **
**use a different key”选项→输入“远程主机登录密码”→“Test Configuration”测试远程主机配 **
置。测试远程主机配置成功后,单击“保存”按钮。
**图 2.8 SSH Servers 配置 **
**3. 配置 Maven、JDK、Git 环境 **
**在 Jenkins 首页中,单击“Manage Jenkins”→“Global Tool Configuration”→“JDK”→“新 **
**增 JDK”。“JDK 别名”设置为“JDK1.8”,去掉“自动安装”选项,“JAVA_HOME”设置为本案例 **
中 JDK 实际安装路径“/usr/local/java”,如图 2.9 所示。
**图 2.9 JDK 配置 **
**在“Global Tool Configuration”配置界面中,找到“Maven”配置选项,然后单击“新增 **
**Maven”,并设置别名为“Maven3.6”、MAVEN_HOME 为“/usr/local/maven”,如图 2.10 所 **
示。
**图 2.10 Maven 配置 **
**Git 配置保持默认即可,以上各项配置完毕后,推荐重启下 Jenkins 服务,重启命令如 **
**下所示。 **
**[root@jenkins ~]# cd /usr/local/tomcat/bin **
**[root@jenkins bin]# sh shutdown.sh **
**[root@jenkins bin]# sh startup.sh **
**4. 构建 tale 基础镜像 **
**在 Docker 主机(192.168.8.92)上,构建 tale 基础镜像。在构建基础镜像之前需要先 **
**安装 Docker 与 JDK。 **
**[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 **
**[root@docker ~]# yum-config-manager --add-repo **
**https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo **
**[root@docker ~]# yum makecache fast **
**[root@docker ~]# yum -y install docker-ce **
**[root@docker ~]# mkdir /etc/docker **
**[root@docker ~]# cat << EOF >> /etc/docker/daemon.json **
**{ **
**"registry-mirrors": [ **
**"https://dockerhub.azk8s.cn", **
**"https://hub-mirror.c.163.com" **
**] **
**} **
**EOF **
**[root@docker ~]# systemctl start docker && systemctl enable docker **
**Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to **
**/usr/lib/systemd/system/docker.service. **
**[root@docker ~]# tar zxvf jdk-8u202-linux-x64.tar.gz **
**[root@docker ~]# mv jdk1.8.0_202/ /usr/local/java/ **
**[root@docker ~]# vim /etc/profile **
**export JAVA_HOME=/usr/local/java/ **
**export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar **
**export PATH=$JAVA_HOME/bin:$PATH **
**[root@docker ~]# source /etc/profile **
**[root@docker ~]# java -version **
**java version "1.8.0_162" **
**Java(TM) SE Runtime Environment (build 1.8.0_162-b12) **
**Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode) **
**构建 tale 基础镜像时依赖 Dockerfile 等相关文件,所以需要先创建 tale 基础镜像所用 **
**到的文件。 **
**[root@docker ~]# mkdir /git **
**[root@docker ~]# cd /git **
**[root@docker git]# ll **
**//上传并查看构建 tale 基础镜像所需文件 **
**总用量 186696 **
**-rw-r--r-- 1 root root 366 8 月 31 18:45 Dockerfile **
**-rw-r--r-- 1 root root 98 8 月 31 18:45 run.sh **
**[root@docker git]# docker build -t 192.168.8.92:5000/tale:v1 . **
**5. 构建一个新的工程项目 **
**在以上配置完成后,回到 Jenkins 首页,选择“新建任务”,输入一个任务名称“tale-test”, **
并选择“构建一个 maven 项目”配置项,单击当前页面下方的“确定”按钮,如图 2.11 所示。**图 2.11 新建任务 **
**在任务配置页面中,选择“源码管理”并选中“Git”,设置“Repository URL”地址为 **
“git@192.168.8.93:/home/git/tale.git”,如图 2.12 所示。
**图 2.12 源码管理 **
之后,选择“Build”模块,“Goals and options”填写“clean package”,如图 2.13 所示。
**图 2.13 Build 设置 **
**选择“构建后操作”中的“Send build artfacts over SSH”选项,并进行配置,如图 2.14 所 **
示。
**图 2.14 构建后操作 **
**Exec command 执行命令如下所示: **
**cd /data/tale && tar zxf *.tar.gz **
**docker run -itd --name kgc-tale-test -p 9000:9000 -v /usr/local/java:/usr/local/jdk -v /data/tale:/tale **
**192.168.8.92:5000/tale:v1 **
**以上全部配置完成后,单击“保存”即可。然后单击左侧的“立即构建”,就开始 tale 项目 **
**的编译构建,直至任务构建完成。在构建过程中可以单击进度条查看控制台输出,如图 2.15 **
所示。
**图 2.15 控制台输出 **
**如图 2.16 所示,可以看到此工程任务已构建成功,并且在构建后,用于创建 tale 项目 **
的 Docker Web 环境命令也执行成功。
**图 2.16 构建成功 **
**2.2.3 验证 Jenkins 自动打包部署结果 **
**1. 验证拷贝目录内容 **
**在 Docker 主机上查看 tale 目录是否拷贝到/data 目录下,查询结果如下所示。 **
**[root@docker ]# cd /data/tale/ **
**[root@docker tale]# ll **
**总用量 6296 **
**drwxr-xr-x 2 root root **
**4096 9 月 **
**4 11:19 lib **
**drwxr-xr-x 5 root root **
**118 9 月 **
**4 11:19 resources **
**-rw-r--r-- 1 root root 6371965 9 月 **
**4 11:19 tale-latest.jar **
**-rw-r--r-- 1 root root 23706933 9 月 **
**4 11:19 tale.tar.gz **
**-rw-r--r-- 1 root root **
**3409 9 月 **
**4 11:19 tool **
**从结果可知,Jenkins 已经将打好的 jar 包拷贝过来了。 **
**2. 验证 tale 项目 Docker Web 环境 **
**[root@docker ~]# docker ps -a **
**CONTAINER ID **
**IMAGE **
**COMMAND **
**CREATED **
**STATUS **
**PORTS **
**NAMES **
**9ce60aff10e5 **
**192.168.8.92:5000/tale:v1 **
**"/run.sh" **
**4 minutes ago **
**Up **
**4 minutes **
**0.0.0.0:9000->9000/tcp **
**kgc-tale-test **
**从上述结果可以得知,Web 容器已经创建成功,可以通过浏览器访问 tale 开源博客系 **
**统,在浏览器中输入 http://192.168.8.92:9000 即可访问,访问结果如图 2.17 所示。图 2.17 tale 博客安装首页 **
**至此,Jenkins 自动打包部署完毕。 **
版权归原作者 Linux运维老纪 所有, 如有侵权,请联系我们删除。