1.什么是jenkins
jenkins是一个开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,指在提供一个开放易用的软件平台,时软件项目可以进行持续集成
2.为什么使用jenkins
开发人员---代码提交到git远程仓库后,需要拉取--编译--打包--部署。每次提交到git仓库都需要重复做这样的事情。拉取--编译--打包--部署非常耗时--如果是人工来完成非常麻烦,jenkins就可以完成这些重复的工作
3.如何使用jenkins
3.1安装jenkins
使用java语言编写的一款工具。需要jdk环境,jenkins最新版要求jdk必须为11以上并且不能是20
1.安装jdk17到指定目录
解压之后配置环境变量:vi /etc/profile
export JAVA_HOME=/usr/local/soft/jdk17
export PATH=$PATH:$JAVA_HOME/bin
刷新 /etc/profile
2.将jenkins.war上传到虚拟机指定目录
执行:yum install fontconfig
运行jenkins.war文件 :nohup java -jar /usr/local/soft/jenkins.war --httpPort=8777 > /usr/local/soft/jenkins.log 2>&1 &
其中:
nohup--当服务休眠时jenkins服务依然运行
java -jar : 运行jenkins.war文件
--httpPort: http的端口号
/usr/local/soft/jenkins.log 2>&1: 启动jenkins生成日志放入该文件中
&:表示后台运行
访问浏览器:虚拟机端口号:8777
密码在
登录之后可以通过设置修改密码:
3.2jenkins集成jdk环境
由于jenkins需要从git拉取代码--需要进行编译。所以在jenkins所在的服务器安装jdk并配置jdk的环境。
3.3jenkins集成git
由于jenkins需要从git远程仓库拉取项目代码,所以需要集成git。
# 安装
yum install git -y
# 查看版本
git --version
新建git仓库测试:
在jenkins中创建任务:
3.4jenkins集成maven
因为我们现在的项目都是maven项目,---打包--需要对拉取的项目进行打包。
(1)在jenkins所在的服务器安装maven.
把下载的maven放入linux系统中
(2)解压
tar -zxvf XXX.tar.gz
(3)配置环境变量
vi /etc/profile
##########################MAVEN环境的配置##########################
export MAVEN_HOME=/usr/local/soft/maven3.9.4
export PATH=$PATH:$MAVEN_HOME/bin
(4)配置maven的本地仓库和阿里镜像
<localRepository>/path/to/local/repo</localRepository>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
在jenkins上集成maven
生成一个jar包
如果运行时出现:qy168-jenkins02-0.0.1-SNAPSHOT.jar中没有主清单属性
就在项目pom文件中添加:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.5jenkins自动从gitee拉取代码
当gitee仓库中代码发生改变时,需要我们手动从git拉取代码。并手动完成编译和打包。
默认gitee不允许内网自动拉去代码。-------需要配置内网穿透。
内网穿透软件有很多:而我们使用natapp。NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
复制这个token
打开natapp客户端:输入natapp.exe -authtoken= 这里为复制的token
输入后回车
回到jenkins安装gitee插件
回到gitee设置WebHook以及密码
添加WebHook
测试:在idea中提交到gitee发现jenkins会自动提交打包到配置jenkins上的服务器
3.6jenkins完成自动化部署
我们的项目部署尽量不要和jenkins在同一台服务器上
在真正开发中,项目提交代码时需要测试的,需要部署到测试的服务器上进行测试。jenkins非常耗费资源。因为jenkins所在的服务器中需要安装集成很多软件。如果我们的项目也部署到当前jenkins所在的服务的话,那么肯定会影响项目的性能
而jenkins从gitee自动拉取的代码---进行编译---打包---默认放在jenkins所在的目录。如何将打包好的项目放入到其他服务器下:
远程copy------把一台机器上的软件远程复制到其他服务器下。
scp /本地的文件 远程的账号@远程的ip:/远程的目录
scp /xxx.jar root@192.168.61.225:/usr/local/XXXX.jar
测试192.168.61.223[jenkins所在]往192.168.61.225上发送maven
远程复制时需要输入密码: ----未来我们使用jenkins帮你完成远程复制---那么我们必须配置免密复制。
如何来设置免密操作。
免密登录主要是方便jenkins服务器192.168.61.223的root用户—》应用服务器192.168.61.225的root用户上的jar包拷贝,部署本就是jar包拷贝的过程
在192.168.61.223【jenkins】机器上使用root用户生成秘钥注意此处是root用户
ssh-keygen -t rsa
# 3次回车
运行后会在当前root目录生成一个.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
文件拷贝到另一台应用服务器的root用户.ssh目录下
# 在应用服务器(192.168.61.225)上用root用户创建/root/.ssh文件夹 mkdir -p /root/.ssh
# 在jenkins服务器(192.168.61.223)上将pub公钥文件拷贝到应用服务器的.ssh目录下
scp -p ~/.ssh/id_rsa.pub root@192.168.61.225:/root/.ssh/authorized_keys
输入192.168.61.225的root密码
再进行测试:192.168.61.223[jenkins所在]往192.168.61.225上发送maven
发现无需输入密码:
上面已经配置好免密操作,让jenkins通过一个脚本完成复制功能。
将shell脚本放入
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot"
echo "待部署的应用服务器,可多台"
server_ips="192.168.61.225"
for server_ip in ${server_ips[@]}
do
echo "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${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"
在部署项目的服务器上放置部署的项目中创建一个脚本:
mkdir -p /data/app/my-boot
1.启动jar的脚本
#!/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
2.关闭jar的脚本
#!/bin/bash
APP_ID=my-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
注意修改权限:
修改jenkins 的Post Steps
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot"
echo "待部署的应用服务器,可多台"
server_ips="192.168.61.225"
for server_ip in ${server_ips[@]}
do
echo "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${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
${DIR}/${projectName}/stop.sh
${DIR}/${projectName}/start.sh
EOF
done
echo "success"
完成
测试提交到git,已经在192.168.61.225服务器运行