Jenkins是基于Java开发的一种持续集成工具,集成了一些测试和部署技术。常用于用于持续重复的测试、部署工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能, 大大简化了频繁的开发和部署工作,使自动部署成为可能。
由于之前已经介绍过gitlab,这里gitlab安装部署不再介绍,可参看https://blog.csdn.net/lzxlfly/article/category/7826362
角色模式如下图:
主机名 | 角色 |
node01 | Jenkins所在服务器 |
node02 | Gitlab所在服务器 |
node03 | 服务部署的服务器 |
在Jenkins所在服务器(node01)配置maven和git,后边要用到。
去http://mirror.bit.edu.cn/apache/maven/maven-3/下载apache-maven-3.5.4-bin.tar.gz
解压 $ tar zxvf apache-maven-3.5.4-bin.tar.gz
移动 $ mv apache-maven-3.5.4 /usr/local/maven
编辑$ vim /etc/profile环境变量
MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
生效$ source /etc/profile
yum安装git $ yum install -y git, yum安装的git版本较低,不过不影响使用。若想安装高版本可以参看之前的文章https://blog.csdn.net/lzxlfly/article/details/81160113或自行查找。
Jenkins由java语言开发,有rpm和war两种安装方式,war包安装不受平台限制,故选择war方式安装。
去https://jenkins.io/download/下载jenkins.war
启动 $ nohup java -jar jenkins.war & ,默认8080端口
指定端口启动 $ nohup java -jar jenkins.war & --httpPort=9090
访问http://192.168.17.10:9090,首次访问须输入管理员密码
也可以去启动控制台复制密码
选择自定义安装,勾选Publish over SSH和Email Extension Template插件
勾选完成后点击右下方的“Install”进行插件安装,等待安装完成即可
依次点击“系统管理 》全局工具配置”进入全局工具配置页面。
依次点击“系统管理 》系统设置”进入全局系统设置页面。
1、在Jenkins机器与部署机器ssh免登录
在node01执行 $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa,一路回车便可在/root/.ssh/生成公私钥,私钥:id_rsa 公钥:id_rsa.pub。把公钥id_rsa.pub写入到部署服务器(node03)的/root/.ssh/authorized_keys 路径下,可以手动粘贴过去,也可以命令复制$ ssh-copy-id node03便可直接写入node03的/root/.ssh/authorized_keys中
执行 $ ssh node03测试免登录,不用输入密码就可以登录到node02,表明免登录成功
2、找到Publish over SSH 进行配置
Publish over SSH 配置是用于Jenkins(node01)从Gitlab(node02)上拉代码打包后发送到项目所在服务器(node03)的指定路径下。这里我配置了但是没有用这样用,我是用Jenkins编译打包后,通过脚本复制到项目所在服务器(node03)的指定路径下
依次点击“系统管理 》系统设置”进入全局系统设置页面,找到Jenkins Location,开始配置
这里需要注意的是Recipient List 是空的,没有值,需要写上默认值,不写在执行job构建时候会报错
An attempt to send an e-mail to empty list of recipients, ignored.不能发送邮件
1、点击“新建任务”,去构建页面
2、选中第一项,并在框中填写job名
3、点击下方“OK”,来到构建页,配置General
勾选参数化构建,用于动态传参
4、源代码管理配置Source Code Management
填写gitlab的用户和密码,用于拉取代码
5、触发构建Build Triggers
配置后可以通过url访问触发构建,但我更习惯于手动触发构建
6、构建Build
执行部署项目的脚本,后边可以传入一个参数,需要部署多个服务时候,多个服务用逗号分隔如
$ sh exxcute.sh user-service,order-service,pay-service;把传入的多个服务用分隔为数组,遍历部署即可
# !/bin/sh
#杀死重新,启动
function startService () {
host=$1
serviceName=$2
installPath=$3
deployPath=$4
pid=$5if [ "$pid" == "" ]
then
echo "----$serviceName 处于关闭----"
else
echo "$serviceName 进程号 :$pid"
ssh root@$host "kill -9 $pid"
echo "$serviceName $pid is killed"
sleep 2
fiecho "copying $serviceName to $host:$deployPath"
scp $installPath$serviceName root@$host:$deployPath #远程复制到部署机器的指定目录下
ssh root@$host "cd $deployPath;nohup java -jar -Duser.timezone=GMT+08 $serviceName >/dev/null 2>&1 &"
echo "$serviceName is starting......,please Wait a moment!"
}
str=$1 #$1接收输入的第一个参数
#//与/之间与分割的字符 ,另外/后有一个空格不可省略
arr=${str//,/ };
#遍历数组
for s in ${arr[*]}
do
echo "=====$serviceName====="
if [ $s == "uws-data" ]
then
host="node03" #部署的主机名或ip
serviceName="$s-1.0.0.jar" #服务名
installPath="/root/.jenkins/workspace/uws-data/uws-bussiness/target/" #项目包路径
deployPath="/opt/project/" #部署路径
pid=`ssh root@$host "ps -ef | grep $serviceName | grep -v "grep" | awk '{print $2}'"| awk '{print $2}'` #服务正在运行的进程号
#调用上方函数部署
startService $host $serviceName $installPath $deployPath $pid
fi
done
回到首页,进行构建 操作
输入要拉取的分支名,部署的服务,“Build”一键部署便可完成
查看控制台输出Console Output
参考:https://www.cnblogs.com/zz0412/p/jenkins_jj_01.html
参考:https://jenkins.io/zh/doc/
参考:https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plugin