利用Jenkins自动构建并部署项目
一、安装Jenkins
1.下载依赖
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
2.导入秘钥
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
3.安装
yum install jenkins #等待安装时间较长,中途需要输入一次Y,确定安装
jenkins安装完毕
4.启动前检查是否已安装jdk
java #显示java参数即证明已安装jdk
5.查找jenkins安装路径
rpm -ql jenkins
jenkins安装路径
jenkins相关目录释义:
(1)/usr/lib/jenkins/:jenkins安装目录,war包会放在这里。
( 2 ) /etc/sysconfig/jenkins:jenkins配置文件,“端口”,“JENKINS_HOME”等都可以在这里配置。
(3)/var/lib/jenkins/:默认的JENKINS_HOME。
(4)/var/log/jenkins/jenkins.log:jenkins日志文件。
6.配置jenkins
(1)查找jenkins端口
vim /etc/sysconfig/jenkins
查找到jenkins端口为8080
(2)查看其他端口占用情况
netstat -ntlp
显示已被占用端口
被占用端口与jenkins端口8080无冲突,即可进入下一步启动jenkins
(3)启动jenkins
java -jar /usr/lib/jenkins/jenkins.war --httpPort=8888
(4)修改jenkins端口
若默认8080端口未被占用,可不修改
若端口已被占用,则修改端口为其他端口,并将对应端口开放
#端口改为8888
java -jar /usr/lib/jenkins/jenkins.war --ajp13Port=-1 --httpPort=8888
#启动
java -jar /usr/lib/jenkins/jenkins.war --httpPort=8888
#后台启动
nohup java -jar /usr/lib/jenkins/jenkins.war --ajp13Port=-1 --httpPort=8888 >/dev/null 2>&1
启动完成
(5)验证jenkins能否打开
在宿主机浏览器输入http://IP:Port
进入jenkins解密界面(首次进入,需要等待初始化一段时间)
(6)解锁jenkins
获取密码
cat /var/lib/jenkins/secrets/initialAdminPassword
输入密码=>继续
(7)安装插件
选择第一个,安装推荐的插件,后续需要的插件再自行安装
等待安装插件完毕,打×的插件是由于网络传输导致的安装失败,后面再重新安装即可。注意:这个步骤中如果选择了安装插件则系统必须能够联网
(8)创建用户
可以选择使用admin账户继续,后面有需要仍然有机会注册新账户。
(9)安装完毕
开始使用Jenkins
(10)配置Maven
1.安装maven
mkdirs /soft/maven #创建存放maven文件的目录
cd /soft/maven #切换到maven目录
1.1.下载安装文件
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
1.2.解压安装:
tar -zxvf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 maven #这一步骤可省略,主要是为了后面方便操作
1.3配置环境变量
vim /etc/profile
在/etc/profile文件末尾增加以下配置:
M2_HOME=/soft/maven/maven
PATH=$PATH:${M2_HOME}/bin
source /etc/profile #重载/etc/profile配置文件
1.4检验maven是否安装成功
mvn -v
2.修改maven配置文件
2.1将maven配置文件/soft/maven/maven/conf/settings.xml导出到本地
2.2修改maven配置
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
</pluginGroups>
<proxies>
</proxies>
<servers>
<server>
<id>releases</id>
<username>admin</username>
<password>admin-1234</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin-1234</password>
</server>
</servers>
<mirrors>
<mirror>
<id>public</id>
<mirrorOf>*</mirrorOf>
<name>Public Repositories.</name>
<url>http://13.12.2.25:8088/repository/maven-public/</url>
</mirror>
<!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>nexus</id>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://13.12.2.25:8088/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://13.12.2.25:8088/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<profile>
<id>release</id>
<properties>
<svn.username>guangjianyang</svn.username>
<svn.password>jeking</svn.password>
</properties>
</profile>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>trye</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.comilerVersion>1.8</maven.compiler.comilerVersion>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
2.3导入覆盖服务器/soft/maven/maven/conf/settings.xml
3.jenkins配置maven
3.1.点击系统管理
3.2.配置maven和jdk
保存save
二、安装插件
1.安装Deploy to container Plugin插件
1.1右上角Filter输入deploy to container
1.2选中该插件,点击Install without restart/直接安装
安装插件时受到网络状况的影响有可能会失败,不要紧,多试几次,直到成功。
2.安装Publish Over SSH插件
Publish Over SSH插件用于构建项目完毕后,自动部署到指定机器使用
一样选中插件,然后点击Install without restart/直接安装
2.1xshell生成秘钥
保存为文件后,点击完成
Xshell生成的秘钥如下
2.2公钥上传到服务器
(1)把公钥上传到服务器任意目录
(2)剪切公钥到/root/.ssh/目录
mv /home/zhuxiange/id_rsa_2048.pub /root/.ssh
2.3配置jenkins上SSH
三、配置项目
1.创建hse工程
(1)构建项目
选择构建一个自由风格的软件项目
(2)配置源码来源
(3)配置触发构建条件
(4)配置构建命令
Save保存
2.创建hse-protal-web工程
(1)构建项目
选择构建一个自由风格的软件项目
(2)配置源码来源
(3)配置触发构建条件
此处和hse工程的的Post-build Actions,二选一
(4)配置构建命令
(5)配置构建完成后发送到服务器自动运行
start-hse-web-service8080.sh的源码为:
#!/bin/bash
APP_NAME=/soft/hse-protal-web-0.0.1-SNAPSHOT.jar
APP_PORT=8080
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh start-hse-web-service.sh [start|stop|restart|status|start8080|stop8080|restart8080|status8080]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#检查程序是否在运行
is_exist8080(){
pid=`lsof -i:$APP_PORT|grep -v grep|awk '{print $2}'`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq 0 ]; then
echo "${APP_NAME} is already running. pid=${pid}"
else
nohup java -jar ${APP_NAME} --spring.profiles.active=prod >/dev/null 2>&1 &
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
sleep 5
start
}
#启动方法8080
start8080(){
is_exist8080
if [ $? -eq 0 ]; then
echo "${APP_PORT} is already running. pid=${pid}"
else
#此处为重点,默认情况下jenkins构建完毕会kill掉他创建出来的进程
source /etc/profile
BUILD_ID=dontKillMe
nohup java -jar ${APP_NAME} --spring.profiles.active=prod >/dev/null 2>&1 &
sleep 10
fi
}
#停止方法8080
stop8080(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_PORT} is not running"
fi
}
#输出运行状态8080
status8080(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_PORT} is running. Pid is ${pid}"
else
echo "${APP_PORT} is NOT running."
fi
}
#重启8080
restart8080(){
stop8080
sleep 1
start8080
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
"start8080")
start8080
;;
"stop8080")
stop8080
;;
"status8080")
status8080
;;
"restart8080")
restart8080
;;
*)
usage
;;
esac
四、构建工程
1.手动构建
2.自动构建
jenkins会自动检测svn代码是否有提交,如果有提交,则自动更新代码,然后先构建hse工程,然后处罚hse-protal-web工程,最后发送jar包到服务器,跑sh脚本自动部署
最后总结:
1.Jenkins很好用,SVN代码提交,Jenkins自动检测出来,然后自动构建部署
2.Publish Over SSH插件是自动部署的关键,Jenkins自动构建出来后,通过SSH推送jar包到远程服务器,然后自动执行配置的shell命令
3.值得注意的一个地方,就是就是启动jar的时候,要添加如下命令,不然无法启动,因为Jenkins会在build完毕后,kill掉所有他构建出来的所有衍生进程
4.还有个地方也是SSH,需要配置SSH时,填入公钥的地址和私钥的全部内容,使用authorized_keys时无法连接上去