- 原因:原先的jenkins放在window server下,在centos安装完jenkins之后,需要对原先的部署打包进行优化
- 关联阅读:
步骤一
1,改绝对路径为相对路径。
- 项目war部分使用ant来构建,用来压缩静态文件如js,由于我对ant不是特别了解,因此,暂时不打算去掉。但是原ant的 build.xml 使用了两个绝对路径,这个很不方便,因此要修改
- 一个是ant构建时使用到的script和lib,这个我把整个script也放进项目路径中。这样子路径就和项目一起了,不用写死路径。
- 一个是之后的输出路径,也写死了,这个也是极不合理的,这样子导致我换个jenkins打包都不行。因此这里我改成和项目一起。
修改前:
修改后:
2,设置maven文件. 根据不同环境设置不同的参数值.
- 项目打包也用到了maven,但是我们自己也简单分了测试和灰度环境,原先也没有做区分。因此也需要在打包的时候分开。这里由于配置不一样参数不多,因此我这里只是提取几个地方进行区分设置。一般建议不同环境通过maven设置使用不同配置文件路径。
- 开启值设置,使资源文件里的值可以在maven打包时根据参数(如dev和test环境)设置为不同的值
<build>
<!-- 设置最后生成的jar包或war包名称-->
<finalName>t9-ecm</finalName>
<resources>
<!-- 设置需要设置参数的资源路径-->
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
参数值设置,使用profile在设置具体参数
<!-- profile设置不同环境参数-->
<profiles>
<profile>
<id>153</id>
<properties>
<websocket.ip>192.168.0.153:8055</websocket.ip>
</properties>
</profile>
</profiles>
不传参数时默认值
<!-- 设置一些默认参数 -->
<properties>
<websocket.ip>192.168.0.153:8055</websocket.ip>
<uat.time>${maven.build.timestamp}</uat.time>
</properties>
3,ant和maven设置之后,有svn和帐号就可以在jenkins进行build了。
- 在jenkins,新建任务选择,构建一个maven项目。build 填写.
clean deploy -Dmaven.test.skip=true -P153
Pre Steps 增加 ant. 填写如下
步骤二
进行上面修改设置之后,打包的功能基本完成,接下来向其中增加一些功能。
1,版本问题
- 环境问题之后,还有版本问题。由于灰度通过的版本可能会给客户升级,因此我想在war包记录这个版本。
- 在resource 下,uat.properties 里面记录了,version=xxx,在每次发布不同版本时能够动态设置。
- 这个可以通过maven的profile解决。但是每次发版都去修改 jenkins任务设置,肯定是不合适的。
- 这时候参数化构建就起到作用了,对于一些个别参数即可通过这种方式解决。
uat.properties里用version=${uat.version}
, maven构建增加-Duat.version=${uat}
,并且,我为了方便查看版本, 不用进到文件里查看。还想在外面新建一个以这个值为名称的空文件. 如下
2,打包结果通知
- 我想在打包不成功的时候,能够有通知,以便让我及时查看失败原因,及时解决。
- 增加构建后操作,点 Editable Email Notification。
- 打开 Advanced Setting, Add Trigger ,选择相应的通知Trigger。 这里选择Failure Any,如下,同时,由于我们在 之前系统配置 已经配置了接收人,Send To选择 Recipient List 即可.
3,获取包问题
- 我想把当次打包成功的包供内网下载(目的是为下一步自动部署)
- 在部署jenkins的机器上简单放了一个下载服务<即tomcat>, 然后把生成的war包copy到该tomcat下, 供外界下载
4,自动发布1
- 对于测试环境,经常需要构建完成之后要发布上到测试环境上。
- 可以在这个任务继续加这样的功能。这里我新建了另外的 jenkins 任务来操作发布。 达到职能分离。
- 新建简单任务,源码什么的都不用填。在构建那里,选 Execute shell script on remote host using ssh。填入以下内容:
#先关闭tomcat,可以这样关闭是因为我设置了tomcat启动的进程名为tomcat7x-t9,也可以通过其它方式进行tomcat关闭。
pkill tomcat7x-t9
#移除旧应用, 也可以使用备份的方式
rm -rf /home/usr/local/t9ecm/tomcat7x-t9/webapps/t9-ecm
rm -rf /home/usr/local/t9ecm/tomcat7x-t9/webapps/t9-ecm.war
#下载最新打包的war包
wget -P /home/usr/local/t9ecm/tomcat7x-t9/webapps http://192.168.0.249:7080/t9/t9-ecm.war
#启动tomcat
sh /home/usr/local/t9ecm/tomcat7x-t9/bin/startup.sh
在这里碰到了几个问题
1)原先运行的tomcat无法通过执行 shutdown.sh 进行关闭,只能通过进程强制关闭。因此, 我就想能不能.通过设置进程名称,通过 pkill 进程名来关闭。
2)启动的时候报没有java_home错误,但是我明明在/etc/profile配置了的。找了很久才发现,原来还需要设置bash环境,需要在 /etc/bashrc 再配置一次.
3)如何修改tomcat进程的名称 linux下, 打开 tomcat_home/bin/setclasspath.sh 将 _RUNJAVA="$JRE_HOME"/bin/java
替换为
cp "$JAVA_HOME/bin/java" "$JAVA_HOME/bin/tomcat7x-t9"
_RUNJAVA="$JRE_HOME/bin/tomcat7x-t9"
5,自动发布2
- 上面将构建和部署分成了两个任务,现在我想一步到位,点一次就可以整个流程执行。
- 可以通过第一个任务构建成功之后trigger部署。 这里不再说这个方式
- 为了方便控制,我又新建了一个任务把这俩个步骤结合起来。由于其中一个任务构建时有参数传递,因此,新建的任务也需要一个参数来传递给这个任务。
- 首先,构建打包任务, 在构建步骤选 Trigger/call builds on other projects。
- 构建ecm,由于该任务有参数。 使用 Predefined parameters,传递参数。并且, 如果ecm构建失败了,则该集合任务也应该是失败的状态(即状态等同), 进行相应选择
- 部署ecm, 该任务只有在上一个任务成功,才进行运行。在Block until the triggered projects finish their builds. 打勾。
- 这样子,就把 这两个任务集合起来了。
6,定时构建
- 接下来,我想定时自动打包部署。
- 由于我们上面建了一个任务,集合其它任务,因此只需要在集合的任务里使用定时构建即可。
最终结果
- 点构建集合任务时,会需要填写参数值, 如果自动构建, 则使用默认的参数值。 构建失败时可以收到邮件.