1.简介
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
2.安装Jenkins
准备工作
安装JDK。
下载jdk,上传至linux并解压
tar -zxvf jdk8u181.tar.gz
配置/etc/profile的内容
vi /etc/profile
# 在最底部加入以下内容后保存并退出
# JDK
export JAVA_HOME=/usr/local/java/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
使配置生效
source /etc/profile
测试是否生效
java -version
检测java环境信息
1. 下载jenkins
yum -y install wget (安装wget命令)
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war (l联网下载)
启动jenkins
# 使用nohup命令启动 nohup 当虚拟机黑屏时 也会运行 日志--->输出到jenkins.log & 后台运行
nohup java -jar /data/software/jenkins.war --httpPort=8777 --httpsPort=8778 > /data/software/jenkins.log 2>&1 &
使用tail命令查看启动日志,日志中会输出jenkins密码
通过浏览器访问jenkins
http://ip:8777
2.基础配置
安全设置
修改jenkins的镜像地址
jenkins
的所有插件安装后需要重启才能生效,由于Jenkins国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址(清华大学源)
进入到default.json
所在目录
/root/.jenkins/updates/default.json
-
使用如下命令进行替换
sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
替换后使用http://ip:8777/restart
重启jenkins
jenkins配置jdk路径
集成git
在linux配置git所需环境
# 安装
$ yum install git -y
# 查看版本
$ git --version
jenkins下载git相关插件
jenkins配置git环境
此处无需在jenkins中配置Git环境,采用默认生成的即可
Gitee上任意建一个仓库
测试
路径
当仓库为私有时
点击添加
输入账号密码.(对应gitee的账号密码)产生凭证
maven集成
下载安装
# 找一个目录存放maven
cd /data/software/
# 从阿里云上下载maven安装包
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
# 解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz
# 当前maven的安装目录为:/usr/local/java/apache-maven-3.6.3
配置环境
vi /etc/profile
在最后面JDK配置上作出一些更改
export MAVEN_HOME=/usr/local/java/apache-maven-3.6.3
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
使配置生效并查看安装情况
source /etc/profile
mvn -version
jenkins配置maven
安装maven插件
在/data/software 目录下新建一个repository文件夹,用来作为maven的仓库
cd /data/software
mkdir repository
使用root账户修改maven的settings.xml文件(指定仓库目录和阿里云镜像)
<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">
<!--本地仓库-->
<localRepository>/data/software/repository</localRepository>
<mirrors>
<!--阿里云镜像-->
<mirror>
<id>aliyun-maven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven mirror</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
...
...
</settings>
maven测试项目构建
最好在gitee上创建一个同名的git项目
使用git上传到gitee
jenkins添加maven项目任务
使用maven编译命令
构建并查看控制台日志
保存后,点击立即构建,然后进入日志控制台查看日志
从日志可以看到代码已经在拉取了,而且走的事阿里云仓库,第一次拉取过程会比较长。
通过查看/data/software/repository
可以看到有存放拉取的jar包,通过这2个证据可以证明settings.xml
文件配置成功且有效
构建成功后查看jenkins
的workspace
目录下的jar包
Maven集成完毕
配置Post Steps,选中执行shell
在机器上使用root用户生成秘钥注意此处是root用户
ssh-keygen -t rsa
3次回车
运行后会在当前用户的根目录生成一个.ssh文件夹
ssh文件夹中的文件描述
id_rsa
: 生成的私钥文 id_rsa.pub
: 生成的公钥文件
接下来需要将公钥导入到认证文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
如果希望ssh公钥生效需满足至少下面两个条件:
.ssh
目录的权限必须是700 .ssh/authorized_keys
文件权限必须是600
给对应文件授权
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
将authorized_keys
文件拷贝到应用服务器的admin用户.ssh目录下
# 在应用服务器(192.168.223.129)上用root用户创建/root/.ssh文件夹 mkdir -p /root/.ssh
# 在jenkins服务器(192.168.223.128)上将pub公钥文件拷贝到应用服务器的.ssh目录下
scp -p ~/.ssh/id_rsa.pub root@192.168.223.129:/root/.ssh/authorized_keys
测试
# 在jenkins服务器的/root/目录下创建filetest文件,并拷贝到应用服务器
$ cd ~/
$ touch filetest
$ scp -p filetest root@192.168.223.129:/root/filetest
# 进入到应用服务器(192.168.223.129),检查/root目录下是否出现filetest
# 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示
$ ssh root@192.168.223.129
Last login: Sun Sep 20 21:53:03 2020
$ exit
到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助
编写jenkins
发布脚本
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot"
echo "待部署的应用服务器,可多台"
server_ips="192.168.223.129"
for server_ip in ${server_ips[@]}
do
echo "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar
fi
EOF
echo "拷贝jar包到目标服务器的tmp目录"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jar
echo "ssh远程连接进行发布操作"
ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar
EOF
done
echo "success"
编写应用启动脚本、
在/data/app/my-boot
目录下创建启动脚本start.sh
$ touch start.sh
$ vim start.sh
# 将下面代码粘贴到start.sh中
#!/bin/bash
set -e #任何命令出错就退出
set -o pipefail
APP_ID=my-boot
APP_DIR="/data/app"
nohup java -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
start_ok=false
if [[ $? = 0 ]];then
sleep 3
tail -n 10 release_out.log
sleep 5
tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];then
echo "Application started ok"
exit 0
else
echo "Application started error"
exit 1
fi
在/data/app/my-boot
目录下创建停止脚本stop.sh
$ touch stop.sh
$ vim stop.sh
# 将下面代码粘贴到stop.sh中
#!/bin/bash
APP_ID=my-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
-
并进行启动和停止测试,查看日志输出是否正常
-
将下述启动代码配置
jenkins
中
sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh
访问并测试代码是否生效
-
如果是虚拟机则需要给防火墙添加9010端口
$ su root
# 开启防火墙9010端口
$ firewall-cmd --zone=public --add-port=9010/tcp --permanent
# 使配置生效
$ firewall-cmd --reload