(转)Jenkins持续集成
【课程14】持续集...概念.xmind0.6MB
【课程14】持续集成...kins.xmind43.3KB
【课程14预习】持续...kins.xmind0.4MB
程序员开发应用,开发后需要提交svn,然后从svn拉取代码,进行构建,发布到tomcat中,发布,然后看呈现效果,这样的工作是频繁反复的在进行的,浪费了程序员的大量时间,那么能不能把这些工作自动化呢,只需要程序员更新代码到svn,然后自动的构建,发布,呈现效果,当然是可以的,通过jenkins来实现。
互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)。
持续集成指的是,频繁地(一天多次)将代码集成到主干。
它的好处主要有两个。
(1)快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
(2)防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
这种做法的核心思想在于:既然事实上难以做到事先完全了解完整的、正确的需求,那么就干脆一小块一小块的做,并且加快交付的速度和频率,使得交付物尽早在下个环节得到验证。早发现问题早返工。
持续集成
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
持续交付
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境中。
持续部署
持续部署则是在持续交付的基础上,把部署到生产环境的过程自动化。
持续,就是说每完成一个完整的部分,就向下个环节交付,发现问题可以马上调整。是的问题不会放大到其他部分和后面的环节。
集成,是指软件个人研发的部分向软件整体部分交付,以便尽早发现个人开发部分的问题;
部署,是代码尽快向可运行的开发/测试节交付,以便尽早测试;
交付,是指研发尽快向客户交付,以便尽早发现生产环境中存在的问题。
1)核心价值体现在:
a、持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
b、持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
c、持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。
2)持续集成系统的组成
由此可见,一个完整的构建系统必须包括:
A、一个自动构建过程,包括自动编译、分发、部署和测试等。
B、 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
C、一个持续集成服务器。本文中介绍的 Jenkins/Jenkins 就是一个配置简单和使用方便的持续集成服务器。
Jenkins是一个开源的持续集成的服务器,Jenkins开源帮助我们自动构建各类项目。Jenkins强大的插件式,使得Jenkins可以集成很多软件,可能帮助我们持续集成我们的工程项目。
Jenkins对于maven工程完整的编译和发布流程如下:
1、Jenkins从SVN上拉取代码到指定的编译机器上。
2、在编译机器上触发编译命令或脚本。
3、编译得到的结果文件。
4、把结果文件传到指定的服务器上。
5、重启服务
1、本地下载jdk8.tar.gz包,然后通过xshell和xftp工具上传到/opt【可自定义】目录。
2、使用tar -zxvf jdk8.tar.gz 解压文件。
3、打开/etc/profile文件中配置java环境
export JAVA_HOME=/opt/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使用命令source /etc/profile 让环境重新加载,输入java -version坚持是否配置成功
1、查看地址
https://maven.apache.org/download.cgi
2、复制要下载的链接地址,使用linux的wget命令下载。切换到/opt目录,直接下载:
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.3/binaries/apache-maven-3.5.3-bin.tar.gz
3、使用tar -zxvf apache-maven-3.5.3-bin.tar.gz 解压文件得到apache-maven-3.5.3
4、/etc/profile配置环境,并使用命令source /etc/profile 让环境重新加载
export MAVEN_HOME=/opt/apache-maven-3.5.3
export PATH=${MAVEN_HOME}/bin:$PATH
5、检验是否配置成功。
maven的配置setting.xml最好修改镜像源:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
按照以下命名安装:
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
wget https://www.kernel.org/pub/software/scm/git/git-1.8.3.1.tar.gz
tar xzf git-1.8.3.1.tar.gz
cd git-1.8.3.1
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=$PATH:/usr/local/git/bin" >>/etc/bashrc
source /etc/bashrc
git --version
查看默认密码:
grep 'temporary password' /var/log/mysqld.log
修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'admin';
直接下载war包,windows和linux环境通用。linux可以通过wget命令直接下载到指定目录。windows直接把链接复制到浏览器链接栏即可下载。
wget http://mirrors.shu.edu.cn/jenkins/war-stable/2.121.1/jenkins.war
下载完了之后可以在当前目录看到jenkins.war包,表示已经下载完成。
jenkins.war包可以有两种运行方式:
- 第一种是把war包放到tomcat的webapps目录下运行;
- 第二种是直接通过java -jar来启动项目,因为jenkins.war包里面已经内置了jetty服务器,可以直接启动,通过--httpPort来指定启动端口,添加&表示以服务形式启动。
java -jar jenkins.war --httpPort=8081 &
打开链接地址http://你的ip:8081,
获取秘钥:
cat /root/.jenkins/secrets/initialAdminPassword
新手最好直接选择安装推荐的插件就可以,熟悉以后下次就可以自定义插件安装即可。
正在下载推荐的额插件
插件安装完毕,跳转到创建管理员。填入用户名密码。
jenkins安装成功。
本次课程主要讲发布maven项目到tomcat中。所以还需要安装以下两个插件:
打开管理插件页面:
- 一个构建maven项目插件
- 一个发布到tomcat的插件
选择,直接安装!
系统管理--》全局工具配置,需要把服务器的jdk、maven、git等环境配置好。
- 新建一个maven项目。
- 配置git或者svn地址,jenkins会自动从远程仓库拉去最新代码。
如果是私有项目的话,需要加入用户名密码
- 开始maven打包构建的命令,可以去掉test测试
clean install -Dmaven.test.skip=true -Ptest
- 经过上一个步骤之后,jenkins会在默认路径/root/.jenkins/workspace/上看到打包的项目,/root/.jenkins/workspace/homework/target目录下有打包的jar文件。spring-boot-homework-0.0.1-SNAPSHOT.jar。因此我们打包完成之后的工作就是要替换原来的jar文件,然后重启项目。
这里我们使用shell脚本来完成。
- DIR表示存放jar文件、和启动项目的文件夹。JAEFILE是指jar包的名称。
- 接下来的工作其实就是杀掉原来的spring-boot-homework-0.0.1-SNAPSHOT.jar进程
- 备份原来的jar包
- 把新生成的jar覆盖原来的
- 然后java -jar启动项目
- BUILD_ID=dontKillMe表示jenkins不杀掉衍生的线程
- nohup表示不用提示
shell脚本如下:
echo '开始启动项目~~~~~~~~~'
DATE=$(date +%Y%m%d_%H%M)
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/opt/jdk1.8.0_181
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
DIR=/opt/jar
JARFILE=spring-boot-homework-0.0.1-SNAPSHOT.jar
if [ ! -d $DIR/backup ];then
mkdir -p $DIR/backup
fi
cd $DIR
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
mv $JARFILE backup/$JARFILE$DATE
mv -f /root/.jenkins/workspace/homework/target/$JARFILE .
BUILD_ID=dontKillMe nohup java -jar $JARFILE > out.log &
if [ $? = 0 ];then
sleep 30
tail -n 50 out.log
fi
cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
echo '结束启动项目~~~~'
致此,项目就会自动部署,只需要点击构建按钮,jenkins就会自动拉去最新代码,然后备份、重启项目。
回顾一下流程:
- 首先创建maven项目
- 配置项目的git仓库地址
- 配置maven构建命令(打包命令)
- 打包文成之后执行shell实现切换jar,重新部署项目。
上面的过程是当jenkins与应用服务器同一台的时候才能直接复制过去,当服务器不同的时候就不能这样做了,可以通过ssh或者scp来传输jar包过去,然后再执行shell脚本。
- 配置ssh免密登录
为了方便演示,我这里用的还是同一台机器,不过不再使用复制的方式,而是通过ssh吧文件传输给自己。
在配置之前,输入ssh 127.0.0.1,会提示要输入密码。
ssh的配置可使用密钥,也可以使用密码,这里我们使用密钥来配置,在配置之前先配置好jenkins服务器和应用服务器的密钥认证。
jenkins服务器上生成密钥对,使用ssh-keygen -t rsa命令。输入下面命令 一直回车,一个矩形图形出现就说明成功,在~/.ssh/下会有私钥id_rsa和公钥id_rsa.pub
ssh-keygen -t rsa
然后把生成的公钥推动到应用服务器上,加入47.106.38.101是应用服务器的ip,因为这里用的jenkins和应用服务器同一台,所以ip是一样的。
ssh-copy-id -i ~/.ssh/id_rsa.pub 47.106.38.101
第一次需要验证密码,输入应用服务器的登录免密。出现以下提示,说明成功了。
在应用服务器上重启ssh服务,
service sshd restart
这时候再次ssh 47.106.38.101或者ssh 127.0.0.1就会直接登录成功,不再需要免密。
致此,免密登录配置完成~
接下来的工作就是上次jar文件到应用服务器,然后执行shell实现重启应用。
这里使用一种比较简单的方法,直接替换之前的命令行就行。
命令行的意思是通过scp命令把jar上次到远程服务器的指定目录,然后通过ssh免密登录指定远程的脚本。
cd target/
scp spring-boot-homework-0.0.1-SNAPSHOT.jar 127.0.0.1:/opt/jar/target/
ssh 127.0.0.1 "cd /opt/jar; ./republish.sh;"
远程脚本如下:和之前的差不多,改了一下jar的目录而已。
DATE=$(date +%Y%m%d_%H:%M:%S)
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/opt/jdk1.8.0_181
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
DIR=/opt/jar
JARFILE=spring-boot-homework-0.0.1-SNAPSHOT.jar
if [ ! -d $DIR/backup ];then
mkdir -p $DIR/backup
fi
cd $DIR
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
mv $JARFILE backup/$JARFILE$DATE
mv -f /opt/jar/target/$JARFILE .
java -jar $JARFILE > out.log &
if [ $? = 0 ];then
sleep 30
tail -n 50 out.log
fi
cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
另一种方法,还没测试成功。(暂时放弃)---------------------------------------------------------
配置jenkins的ssh传输
首先安装publish over ssh插件
安装之后,点击系统管理 > 系统设置
选择 Publish over SSH
- Passphrase 不用设置
- Path to key 写上生成的ssh路径:/root/.ssh/id_rsa
下面的SSH Servers是重点
- Name 随意起名代表这个服务,待会要根据它来选则
- Hostname 配置应用服务器的地址
- Username 配置linux登陆用户名
- Remote Directory 不填
点击test configuration之后,出现success,表示成功。
- 新建一个maven构建项目home_server_split。复制之前的项目配置。
大部分的配置都是和同一台机器的一样的,需要修改的地方是打包完成之后的操作。
- Source files配置:target/xxx-0.0.1-SNAPSHOT.jar 项目jar包名
- Remove prefix:target/
- Remote directory:代码应用服务器的目录地址,
- Exec command: 应用服务器对应的脚本。
此种方法,还没测试成功。(暂时放弃)---------------------------------------------------------
与发包jar项目的前面相同,不同的是打包构建之后的步骤不一样,之前是使用shell来完成项目的重新部署,现在打成war之后我们需要做的是替换原来的war包
springboot打包成war包请参考
因为jenkins把项目打包成war包之后需要把项目发布到tomcat的webapp目录下运行,所以需要给tomcat这是发布的账号密码。
- tomcat7在conf/tomcat-users.xml下添加如下代码
<role rolename="tomcat"/>
<role rolename="manager-script"/>
<role rolename="manager"/>
<role rolename="admin"/>
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="admin" password="123456" roles="admin,admin-gui,manager-gui,manager-script,manager-gui"/>
- tomcat8和tomcat9还需要在打开webapps/manager/META-INF/context.xml,把一行代码注释掉,如图:
- WAR/EAR files:是war包的相对路径,如target/xxx.war
- content path:Tomcat的发布路径,即项目的上下文,用于访问项目。如http://localhost:8080/heo,heo
- 即为content path。
- contaners :发布到的容器,主要可发布到tomcat、jboss、GlassFish
- deploy on failure:发生错误的时候是否发布到tomcat
这里要利用的其实是码云的webhook功能。
- 首先jenkins安装gitee插件,实现自动部署插件
- 添加码云链接配置
- 前往 Jenkins -> Manage Jenkins -> Configure System -> Gitee Configuration -> Gitee connections
- 在 Connection name 中输入 Gitee 或者你想要的名字
- Gitee host URL 中输入码云完整 URL地址: https://gitee.com (码云私有化客户输入部署的域名)
- Credentials 中如还未配置码云 APIV5 私人令牌,点击 Add - > Jenkins
- Domain 选择 Global credentials
- Kind 选择 Gitee API Token
- Scope 选择你需要的范围
- Gitee API Token 输入你的码云私人令牌,获取地址:https://gitee.com/profile/personal_access_tokens
生成的令牌:
- ID, Descripiton 中输入你想要的 ID 和描述即可。
- Credentials 选择配置好的 Gitee APIV5 Token
- 点击 Advanced ,可配置是否忽略 SSL 错误(适您的Jenkins环境是否支持),并可设置链接测超时时间(适您的网络环境而定)
- 点击 Test Connection 测试链接是否成功,如失败请检查以上 3,5,6 步骤。
点击测试成功,标识gitee配置完成。
配置了gitee的链接之后,接下来就是使用。
分为以下几个步骤:
1、打开x项目的配置,然后Gitee链接处。选择刚才配置的链接id
2、配置构建触发器:
生成hook密码。
3、打开gitee上的项目,打开管理界面的webhooks。
url的配置需要注意一下,jenkins上建议的地址是Gitee webhook 触发构建,需要在 Gitee webhook 中填写 URL: http://47.106.38.101:8080/project/homework。但是我的jenkins端口其实是8081,所以需要改回来。然后把jenkins上生成的gitee webhook密码复制过来。
点击测试,会发现,jenkins会自动开始构建完成项目发布了。也就是说,以后只要发布代码到git上,jenkins就会自动构建了,完成了自动化过程。
(转)Jenkins持续集成的更多相关文章
- python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法?
python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法: 原因:因为jenkins是用windows installer 安装成 windo ...
- jenkins持续集成源码管理选项为None,构建失败找不到git.exe解决办法
我的jenkins版本为Jenkins ver. 2.19.1 1.源码管理选项只有None的解决办法: 在插件管理中心,搜索对应的源码管理插件这里以git为例,搜索git plugin点击右下角的安 ...
- 【转】jenkins持续集成配置
搭建jenkins持续集成服务器 1.jenkins简介 Jenkins,前身为Hudson,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,包括: 持续的软件版本发布/测试项目. 监控 ...
- Jenkins持续集成
Jenkins持续集成 & .NET 最近受累于测试环境每次发布都很麻烦,而且我们有多个测试环境,因此专门抽时间做了Jenkins的配置和研究. 折腾了两天终于绿灯以后,先来个截图,Blu ...
- Jenkins持续集成相关文章整理
构建iOS持续集成平台(一)——自动化构建和依赖管理 构建iOS持续集成平台(二)——测试框架 构建iOS持续集成平台(三)——CI服务器与自动化部署 使用Jenkins搭建iOS开发的CI服务器 一 ...
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...
- Docker+Jenkins持续集成环境(5): android构建与apk发布
项目组除了常规的java项目,还有不少android项目,如何使用jenkins来实现自动构建呢?本文会介绍安卓项目通过jenkins构建的方法,并设计开发一个类似蒲公英的app托管平台. andro ...
- windows部署jenkins持续集成maven测试项目不能访问测试报告
买了一台阿里云的服务器用于练习maven test项目,系统版本wiondows server 2012,将jenkins war包部署在Tomcat服务器上,项目构建后,生成的报告在C:\Windo ...
- Linux-GitLab+Jenkins持续集成+自动化部署
GitLab+Jenkins持续集成+自动化部署 什么是持续集成? (1)Continuous integration (CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个 ...
- 行为驱动:Cucumber + Selenium + Java(二) - extentreports 测试报告+jenkins持续集成
1.extentreports 测试报告 pom文件 <dependency> <groupId>com.vimalselvam</groupId> <art ...
随机推荐
- html5-增强的表单-表单的重写
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- WEB应用程序:AJAX全套
概述 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 1.传统的Web应用 一个简单操作需要 ...
- spring部分注解
@Controller @SpringBootApplication @Configuration @ComponentScan(basePackages={"first",&qu ...
- SpringMVC中的自定义参数绑定案例
由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适 ...
- php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小
php 当前时间 当前时间戳和数据库里取出的时间datetime格式进行比较大小 UNIX时间戳转换为日期用函数: date() ,date('Y-m-d H:i:s', 1500219870); 日 ...
- jenkins1
持续集成工具: Jenkins 和 Hudson是同源的. 甲骨文和开源社区之间的关系破裂,该项目被分成两个独立的项目. Jenkins:由大部分原始开发人员组成,Hudson:由甲骨文公司继续管理 ...
- Twemproxy和Redis性能压力测试
性能测试 Redis自带了一个叫 redis-benchmark的工具来模拟N个客户端同时发出M个请求,(类似于Apache ab程序),你可以使用redis-benchmark -h来查看基准参数. ...
- flask框架----蓝图
蓝图(flask中多py文件拆分都要用到蓝图) 如果代码非常多,要进行归类.不同的功能放在不同的文件,吧相关的视图函数也放进去.蓝图也就是对flask的目录结构进行分配(应用于小,中型的程序), 小中 ...
- mysql union 和 left join 结合查询用法
union 和 left join 结合查询用法 SELECT u.nickname,z.group_comming_type,z.id,z.user_id,z.title,z.create_time ...
- 微信小程序canvas把正方形图片绘制成圆形
wxml代码: <view class="result-page"> <canvas canvas-id='firstCanvas' style='width:1 ...