环境版本:

jenkins:jenkins-2.60.3-1.1.noarch

JDK:jdk1.7

maven:3.3.9

 

什么是jenkins:

解决开发中的人为编译操作会影响项目个模块。

Jenkins安装及部署脚本配置教程_maven

 

安装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,安装完后会出现如下按钮:

Jenkins安装及部署脚本配置教程_自动构建_02

3 ssh远程执行shell脚本插件:

系统管理 -> 管理插件 -> 可用插件,搜索:SSH Plugin,然后安装

 

项目创建配置讲解:

1 前提说明:

下面凡是以下格式:

  • xxxx - xxx

表示项目配置的对应选项,如果填勾选/取消勾选 代表的是这个配置项是否勾选,其他内容知识表示这个输入框就填写这样的的内容,如:

  • Goals and options - -Dmaven.test.skip=true clean deploy

真实的形式为:

Jenkins安装及部署脚本配置教程_jenkins_03

 

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项目:

Jenkins安装及部署脚本配置教程_jenkins_04

进入选择配置如下:

General:

  • 丢弃旧的构建 - 勾选
  • 保持构建的最大个数 - 3

源码管理:

  • Subversion - 勾选        ---其配置如下:

Jenkins安装及部署脚本配置教程_自动构建_05

如果Credentials为空,需先点击Add添加一个如下(这里的username、password就对应你的svn张账号密码):

Jenkins安装及部署脚本配置教程_maven_06

  • 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(执行顺序跟创建顺序有关,所以必须按顺序)如下:

Jenkins安装及部署脚本配置教程_jar_07

然后往这两个填充内容如下:

Jenkins安装及部署脚本配置教程_服务器_08

注: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

Jenkins安装及部署脚本配置教程_jenkins_09

因为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例子配置如下:

Jenkins安装及部署脚本配置教程_maven_10

注:每天凌晨12点10分运行该配置的项目一次

然后再Build中添加如下就会每天定时执行这个脚本,然后这个脚本就回去跑,对应的脚本如下:

Jenkins安装及部署脚本配置教程_jar_11

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/