详解 Jenkins 自动化部署平台


来源 | 浅沫与记忆
本文字数:5452 字,37 图,预计阅读时间:14 分钟


Jenkins介绍


    Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。前身是Hudson是一个可扩展的持续集成引擎。可用于自动化各种任务,如构建,测试和部署软件。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。


    Jenkins能实时监控持续集成过程中所存在的问题,提高详细的日志文件和提醒功能,用图表的形式,形象地展示项目构建的趋势和稳定性。


CI/CD:持续集成,持续交付/持续部署


持续集成


    CI(Continuous Integration):软件工程流程,可以帮助开发人员更加频繁地将代码更改合并到共享分支或“主干”中。一旦开发人员对应用所做的更改被合并,系统就会通过自动构建应用并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。这意味着测试内容涵盖了从类和函数到构成整个应用的不同模块。如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。


    就是说只要开发人员提交新的代码,Jenkins就会立刻将新代码与旧代码进行合并构建测试。确定新代码与原代码是否可以集成在一起。



持续交付 


    CD(Continuous delivery):软件工程手法,在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。


持续部署


    CD(Continuous Deployment):是持续交付的下一步,如果代码通过评审以后自动部署到生产环节中。在持续交付的基础上,自动部署到生产环境中。处于业务考虑,也可以选择不部署。要想持续部署,必须先实施持续交付。



Maven介绍

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。(用于在java项目中构建war包)


Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于Maven的面向项目的方法,许多Apache Jakarta项目发文时使用Maven,而且公司项目采用Maven的比例在持续增长。


Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。

安装Jenkins

Jenkins的rpm包下载


https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.183-1.1.noarch.rpm


[root@Jenkins ~]# rpm -ivh jenkins-2.183-1.1.noarch.rpm
[root@Jenkins ~]# /etc/init.d/jenkins start
[root@Jenkins ~]# netstat -anpt | grep java
tcp6 0 0 :::8080 :::* LISTEN 1635/java
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
71f1cd3fbe504d10b61504cab1cc8288

配置Jenkins

浏览器访问:http://192.168.225.112:8080



安装推荐的插件


也有可能出现部分插件没有安装成功,重试安装即可




创建管理员用户




安装Jenkins必要插件


访问:http://192.168.225.112:8080



安装Publish Over SSH、Maven Integration插件,直接安装 





插件管理安装Maven Integration插件 





配置Jenkins并发执行数量


用于提高执行效率

Manage Jenkins >> Configure System>> Maven 项目配置




部署Tomcat

实验环境


192.168.225.111     git服务器
192.168.225.112     jenkins服务器
192.168.225.113     webtomcat)服务器


1.配置git主机


安装git配置git用户


[root@git ~]# yum -y install git
[root@git ~]# useradd git
[root@git ~]# echo "123456" | passwd --stdin git


创建本地仓库probe


[root@git ~]# su - git
[git@git ~]$ mkdir probe.git
[git@git ~]$ cd probe.git/
[git@git probe.git]$ git --bare init


初始化空的 Git 版本库于 /home/git/probe.git/


[git@git probe.git]$ exit


克隆项目代码同步到自己创建的仓库中


[root@git ~]# git clone https://github.com/psi-probe/psi-probe
[root@git ~]# git clone git@192.168.225.111:/home/git/probe.git
正克隆到 'probe'...
git@192.168.225.111's password:
warning: 您似乎克隆了一个空版本库。
[root@git ~]# cp -rf psi-probe/* probe/
[root@git ~]# cd probe/
[root@git probe]# git add .
[root@git probe]# git config --global user.name “kun”
[root@git probe]# git config --global user.email kun@163.com
[root@git probe]# git commit -m "all probe"

create mode 100644 web/src/site/site.xml
create mode 100644 web/src/test/resources/logback-test.xml
[root@git probe]# git push origin master
git@192.168.225.111's password:
Counting objects: 1164, done.
Compressing objects: 100% (1118/1118), done.
Writing objects: 100% (1164/1164), 2.01 MiB | 0 bytes/s, done.
Total 1164 (delta 398), reused 0 (delta 0)
To git@192.168.225.111:/home/git/probe.git
* [new branch] master -> master


2.配置Jenkins主机


1)添加验证凭据

在Jenkins首页中点击“凭据”---系统---添加域



添加凭据



添加后的web主机




2)添加Publish Over SSH远程主机

在web主机创建远程目录      

     

[root@web ~]# mkdir /data


Manage Jenkins >> Configure System >>往下翻最底部找到Publish over SSH --->> SSH Servers--“新增”选项




3)配置Maven、JDK、Git环境


[root@jenkins ~]# which java
/usr/bin/java
[root@jenkins ~]# rm -rf /usr/bin/java
[root@jenkins ~]# tar xf jdk-8u191-linux-x64.tar.gz
[root@jenkins ~]# mv jdk1.8.0_191/ /usr/bin/java
[root@jenkins ~]# vim /etc/profile
export JAVA_HOME=/usr/bin/java/
export PATH=$PATH:$JAVA_HOME/bin/
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# javac -version
javac 1.8.0_191



 Jdk的实际安装路径



设置maven


[root@jenkin ~]# tar xf apache-maven-3.6.1-bin.tar.gz
[root@Jenkins ~]# mv apache-maven-3.6.1 /usr/local/maven-3.6.1




配置Git


[root@Jenkins ~]# which git
/usr/bin/git



基本配置完成保存


3. 配置web主机


[root@web ~]# tar xf apache-tomcat-8.5.16.tar.gz
[root@web ~]# tar xf jdk-8u191-linux-x64.tar.gz
[root@web ~]# mv jdk1.8.0_191/ /usr/local/java
[root@web ~]# mv apache-tomcat-8.5.16 /usr/local/tomcat
[root@web ~]# 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@web ~]# source /etc/profile
[root@web ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)


web主机生成密钥

发布公钥给Jenkins主机,后边项目构建后需要scp文件到本地


[root@web ~]# ssh-keygen
[root@web ~]# ssh-copy-id 192.168.225.112


4. 新建Maven项目

1)新建ltem



2)选择源码管理---选择git

添加为:git@192.168.225.111:/home/git/probe.git



图中的警告因为没有生成密钥对给git,Jenkins默认用Jenkins用户去git拉下来代码,需要连接git用户主机


Jenkins用户生成密钥对


[root@Jenkins ~]# id jenkins
uid=988(jenkins) gid=982(jenkins) 组=982(jenkins)
[root@jenkins ~]# grep jenkins /etc/passwd
jenkins:x:988:982:Jenkins Automation Server:/var/lib/jenkins:/bin/false


因为jenkin用户的shell是/bin/false,su不过去,所以使用-s指定shell切换到Jenkins用户


[root@Jenkins ~]# su -s /bin/bash jenkins
bash-4.2$ ssh-keygen
bash-4.2$ ssh-copy-id git@192.168.225.111


尝试连接git,验证密钥对是否成功


bash-4.2$ ssh git@192.168.225.111
[git@git ~]$ exit


3)选择build



4)构建后操作:




当Jenkins利用maven打包成war包,web主机去Jenkins主机上下载war包到本地



Build构建



查看控制台输出:



5.验证自动打包部署结果

注意:

有些项目的war包不能删除,删除war包,项目也就没有了


[root@web ~]# ls /usr/local/tomcat/webapps/
docs examples host-manager manager probe probe.war ROOT
[root@web ~]# ls /usr/local/tomcat/webapps/probe
css flags index.jsp js META-INF WEB-INF
[root@web ~]# netstat -anpt | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 63947/java


访问tomcat



访问项目



本公众号已将全部文章整理成一个目录,请在公众号里回复「m」获取! 

推荐阅读

 2019年世界500强完整榜单,出炉!

 老板要给我涨薪,原来是这个缘故……

 如何优雅地给妹子优化电脑(Windows)?

 世界上最有价值的10家公司 (1997-2019)

 Shell 脚本中 '$' 符号的多种用法

 Linux 性能调优的思路

 如何检测用户是否存在弱口令的现象?

20分钟速通 ansible 自动化工具

 如何在 Saltstack 组件下收集被控主机的信息?



好文!必须点在看!