环境版本:
jenkins:jenkins-2.60.3-1.1.noarch
JDK:jdk1.7
maven:3.3.9
什么是jenkins:
解决开发中的人为编译操作会影响项目个模块。
安装JDK、Maven、Tomcat环境:
安装jenkins:
下载jenkins:
$ sudo wget http://pkg.jenkins-ci.org/redhat/jenkins-2.60-1.1.noarch.rpm
如果当前部署用户报 xxxis not in the sudoers file. This incident will be reported.添加方法如下:
$ su - //切换到超级用户
$ vim /etc/sudoers
在 "root ALL=(ALL) ALL"在起下面添加"xxx ALL=(ALL) ALL"(这里的xxx是你的用户名)
rpm安装jenkins:
$ sudo rpm -ih jenkins-2.60-1.1.noarch.rpm
安装完后会出现以下四种目录:
war包 | 配置文件 | JENKINS_HOME目录 | jenkins日志文件 |
/usr/lib/jenkins/jenkins.war | /etc/sysconfig/jenkins | /var/lib/jenkins | /var/log/jenkins/jenkins.log |
启动jenkins:
$ sudo
启动成功后,打开网页,输入localhost:8080 后按着步骤安装即可安装成功。
安装jenkins插件:
经过上面步骤我们部署成功了,接下来打开localhost:8080,然后安装如下插件:
1 安装maven插件:
在插件管理->可选安装 中选择Maven Integration 并安装
2 安装Console Coulumn Plugin插件
在插件管理->可选安装 中选择 并安装Console Coulumn Plugin,安装完后会出现如下按钮:
3 ssh远程执行shell脚本插件:
系统管理 -> 管理插件 -> 可用插件,搜索:SSH Plugin,然后安装
项目创建配置讲解:
1 前提说明:
下面凡是以下格式:
- xxxx - xxx
表示项目配置的对应选项,如果填勾选/取消勾选 代表的是这个配置项是否勾选,其他内容知识表示这个输入框就填写这样的的内容,如:
- Goals and options - -Dmaven.test.skip=true clean deploy
真实的形式为:
2 简单的把项目分为common、facade、service、timer、trigger、web,其中common、facade作为依赖可用maven直接添加到其他项目中,比如在pom.xml中添加如下:
<dependency>
<groupId>com.gw.facade</groupId>
<artifactId>gw-facade-xxx</artifactId>
<version>${gw-facade-xxx.version}</version>
</dependency>
首先新建一个项目,选择建构一个Maven项目:
进入选择配置如下:
General:
- 丢弃旧的构建 - 勾选
- 保持构建的最大个数 - 3
源码管理:
- Subversion - 勾选 ---其配置如下:
如果Credentials为空,需先点击Add添加一个如下(这里的username、password就对应你的svn张账号密码):
- Quiet check-out - 取消勾选 //这个取消勾选的作用是为了svn代码改变的地方在Console Coulumn Plugin插件能显示出来
Build:
- Root POM - pom.xml
- Goals and options - -Dmaven.test.skip=true clean deploy
3 service、timer、web则作为项目启动,其中service、timer以jar形式打包,取一个service作为例子讲解:
service的构建与facade基本一致,区别有以下几点:
Build:
- Goals and options - -Dmaven.test.skip=true -Dlog4j.leve=INFO clean package
Post Steps(本地和远程指令执行的地方):
点击 Add post-build step按钮,然后按顺序创建Execute shell、Execute shell script onremote host using ssh(执行顺序跟创建顺序有关,所以必须按顺序)如下:
然后往这两个填充内容如下:
注:Execute shell是服务器执行本地脚本,第二个是ssh执行远程服务器脚本。
第一个脚本在本地(即jenkins服务器,假设是192.168.0.100)内容如下:
#!/bin/bash
export BUILD_ID=$JOB_NAME
/home/normal/scripts/service.sh $JOB_NAME $JENKINS_HOME
其中在192.168.0.100对应存在一个/home/normal/scripts/service.sh 脚本内容如下:
if [ $# -eq 2 ]; then
# 项目名称
project_name=$1
# 工作目录
jenkins_home=$2
# 提示信息
echo '[INFO] ------------------------------------------------------------------------'
echo '[INFO] 正在部署应用,请稍后 . . .'
echo '[INFO] ------------------------------------------------------------------------'
# 拷贝文件到应用服务器的目录
scp $jenkins_home/workspace/$project_name/target/${project_name}.jar normal@10.10.10.129:/home/normal/services/${project_name}/source
else
echo '[ERROR] ------------------------------------------------------------------------'
echo '[ERROR] 参数不正确!语法:service.sh arg1(注:项目名称) arg2(注:工作目录)'
echo '[ERROR] ------------------------------------------------------------------------'
fi
第二个脚本是ssh连接远程服务器,首先到Credentials –> global –> Add Credentials去添加一个全局凭证,参考链接为:https://fanlychie.github.io/post/jenkins-remote-ssh.html
因为192.168.0.100需要拷贝文件到192.168.0.101上,所以需要设置免密登陆如下:
1. 192.168.0.100中停掉jenkins:service jenkins stop
2. 192.168.0.100中: vim /etc/sysconfig/jenkins //修改JENKINS_USER="jenkins" 为 JENKINS_USER="root"
3. 192.168.0.100中:su normal && cd //切换回部署用户账号,并cd回用户目录
4. 192.168.0.100中:ssh-keygen -t rsa //一直回车,生成的密钥会存在当前用户目录 .ssh中
5. 192.168.0.100中:cd .sssh
6. 192.168.0.100中:scp id_rsa.pub normal@192.168.0.101:/home/fanlychie/.ssh/authorized_keys
以上免密登录就设置成功了。
然后在192.168.0.101中编写startup.sh(这个文件是将编译好的service发布到远程服务器,并且运行起来--所以对应远程服务器也需要java环境配置),如下:
$ vim /home/normal/scripts/services/startup.sh //内容如下:
if [ $# -eq 1 ]; then
# 项目名称
project_name=$1
# 环境变量
JAVA_HOME=/usr/java/jdk1.7.0
CLASSPATH=.:$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME CLASSPATH PATH
# 应用路径
application_path=/home/normal/services/${project_name}
# 应用的进程ID
application_pid=`ps -ef | grep java | grep ${project_name} | grep -v grep | awk '{print $2}'`
# 如果应用的进程存在, 杀死该进程
if [ -n "$application_pid" ]; then
kill -9 $application_pid
fi
# 替换为最新的应用包
mv -f ${application_path}/source/${project_name}.jar ${application_path}
# 启动应用服务
nohup java -jar -Xms256m -Xmx512m -XX:PermSize=32m -XX:MaxPermSize=128m -Ddubbo.shutdown.hook=true -Ddubbo.registry.file=${application_path}/dubbo.registry.properties ${application_path}/${project_name}.jar >/dev/null 2>&1 &
else
echo '[ERROR] ------------------------------------------------------------------------'
echo '[ERROR] 参数不正确!语法:startup.sh arg1(注:项目名称)'
echo '[ERROR] ------------------------------------------------------------------------'
fi
总结:
其他的timer和web也是差不多,都是先在jenkins的服务器对其编译打包好,再执行本地脚本scp远程拷贝到部署服务器,然后通过ssh远程执行部署服务器的脚本来跑程序。当然timer比较特殊,只需执行本地编译打包,并远程拷贝到部署服务器,如何运行是通过Trigger来定时跑timer这个定时任务的,大致的trigger例子配置如下:
注:每天凌晨12点10分运行该配置的项目一次
然后再Build中添加如下就会每天定时执行这个脚本,然后这个脚本就回去跑,对应的脚本如下:
if [ $# -eq 2 ]; then
# 项目名称
project_name=$1
# 工作目录
jenkins_home=$2
# 提示信息
echo '[INFO] ------------------------------------------------------------------------'
echo '[INFO] 正在部署应用,请稍后 . . .'
echo '[INFO] ------------------------------------------------------------------------'
# 拷贝文件到应用服务器的目录
scp $jenkins_home/workspace/$project_name/target/${project_name}.jar normal@10.10.10.129:/home/normal/timers/${project_name}
#scp -r $jenkins_home/workspace/$project_name/target/lib normal@10.10.10.129:/home/normal/timers/${project_name}
else
echo '[ERROR] ------------------------------------------------------------------------'
echo '[ERROR] 参数不正确!语法:timer.sh arg1(注:项目名称) arg2(注:工作目录)'
echo '[ERROR] ------------------------------------------------------------------------'
fi
参考资料:
jenkins安装源:https://pkg.jenkins.io/redhat/