1.jenkins
1.1. 什么是jenkins
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象的展示项目构建的趋势和稳定性。
简而言之,jenkins就是持续开发部署的软件。
1.2. 什么是持续集成(CI)
因为开发部门同时维护多个版本,多个版本的发布,测试需要大量人力,所以要有一个专业的持续集成工具来管理持续重复的工作。具体来说是开发人员提交新代码后立即进行构建,测试。根据测试结果我们可以确定新代码和原代码是否能正确的集成到一起.
1.3. 为什么使用jenkins
使用 Jenkins之前 | 使用 Jenkins之后 |
---|---|
一旦所有开发人员都完成了分配的编码任务,他们通常会同时提交所有代码。后来测试并部署了Build,构建了代码提交,并且测试周期非常少,并且几天后就完成了一次构建。 | 一旦开发人员提交代码,便会构建并测试代码。 Jenkin将在一天中多次构建和测试代码,如果构建成功,则Jenkins将源代码部署到测试服务器中并通知部署团队;如果构建失败,则Jenkins将错误通知开发人员团队。 |
由于代码是一次构建的,因此一些开发人员需要等到其他开发人员完成编码才能检查其构建 | 在任何开发人员提交之后,将立即构建代码。 |
隔离,检测和修复多个提交的错误并非易事。 | 由于代码是在单个开发人员的每次提交之后构建的,因此很容易检测出导致构建失败的代码 |
代码构建和测试过程完全是手动的,因此有很多失败的机会。 | 自动化的构建和测试过程可节省时间并减少缺陷。 |
修复并测试所有错误后,将部署代码。 | 每次成功构建和测试后,都将部署代码。 |
开发周期慢 | 开发周期很快。新功能更易于用户使用。增加利润。 |
jenkins本身没有编译打包的功能,集成maven完成编译和打包, jenkins本身不会拉取gitee远程仓库的代码,集成git从远程仓库拉取代码, jenkins本身也不会运行jar,需要集成jdk来运行jar
2. 安装Jenkins
(1) 准备条件
1.安装JDK。
下载jdk,上传至linux并解压配置/etc/profile的内容
############JDK
export JAVA_HOME=/usr/local/jdk1.8.0_161
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
使配置生效
source /etc/profile
检测java环境信息
java
javac
(2)安装Jenkins
1. 下载jenkins 或 把jenkins的war放入虚拟机中
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
2. 启动jenkins
# 使用nohup命令启动 nohup 当虚拟机黑屏时 也会运行 日志--->输出到jenkins.log & 后台运行
nohup java -jar /usr/local/jenkins.war --httpPort=8777 --httpsPort=8778 > /usr/local/jenkins.log 2>&1 &
3. 使用tail命令查看启动日志,日志中会输出jenkins密码
cat jenkins.log
4. 通过浏览器访问jenkins
http://192.168.19.151:8777
输入刚才获取的密码,然后选择安装推荐的插件
成功登录后的页面
2.1. 修改密码
如果忘记密码
进入到jenkins的工作目录,找到
config.xml
,我这里是/root/.jenkins/config.xml
修改该配置文件
useSecurity
的节点值为false
<useSecurity>true</useSecurity>
重启jenkins项目后,再次访问jenkins站点
进入到系统管理
- 找到全局安全配置
- 进入到用户列表,找到admin用户
- 使用新密码登录即可
2.2. jenkins集成jdk
(1)下载Linux版JDK jenkins
链接: https://pan.baidu.com/s/1Xd-zDEQDMc6Q0kwZ6o3PAA
提取码: bq6s
(2)上传至Linux并解压
tar -zxvf jdk8u181.tar.gz
(3)配置/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
(4)使配置文件生效,并检查版本号
source /etc/profile
java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
(5)jenkins
中配置JDK路径
jenkins-》全局工具配置-》JDK-》新增JDK
2.4. jenkins集成git
为了jenkins能够拉取代码,需要安装Git环境和jenkins对应的Git插件
CentOS 7
上安装Git环境
# 安装
yum install git -y
# 查看版本
git --version
2.jenkins
安装Git
插件
3.jenkins
配置Git环境
此处无需在jenkins
中配置Git环境,采用默认生成的即可
4. Gitee上任意建一个仓库
5.测试凭据是否能够使用
jenkins-》新建item-》自由风格项目
进入jenkins
的工作空间查看文件是否拉取下来,所有拉取的文件都会存放在jenkins
工作空间中
到此用户名密码方式的凭证已经打通Git
2.5. jenkins集成maven
在jenkins
上发布Java项目时需要使用Maven
来进行构建打包(Gradle项目则需要安装配置Gradle)
必须在我们jenkins所在的服务器,安装maven.
1.把安装包拉到/usr/local下并解压
tar -zxvf apache-maven-3.8.6-bin.tar.gz
# 当前maven的安装目录为:/usr/local/apache-maven-3.8.6
2.配置maven的环境变量
vi /etc/profile
#在最后面JDK配置上作出一些更改 export MAVEN_HOME=/usr/local/apache-maven-3.8.6 export PATH=$PATH:$MAVEN_HOME/bin
source /etc/profile 使配置生效
mvn --version 查看安装情况
3.修改maven的镜像
cd apache-maven-3.8.6 vi conf/settings.xml
修改本地仓库位置
<!--本地仓库--> <localRepository>/data/software/repository</localRepository> <!--阿里云镜像--> <mirror> <id>aliyun-maven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven mirror</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror>
保存并退出
4.jenkins配置
Maven
5.安装Maven插件
6.测试maven项目
如果gitee上的maven项目内容发生改变,则会拉取并进行编译 打包了
(1)创建一个gitee仓库
(2)idea中创建一个maven工程
(3) 把idea项目上传到git远程仓库
(4)jenkins拉取项目
从日志可以看到代码已经在拉取了,第一次拉取过程会比较长。
通过查看/usr/local/repmaven
可以看到有存放拉取的jar包,通过这2个证据可以证明settings.xml
文件配置成功且有效
到此Maven集成完毕
3. jenkins自动拉取gitee远程仓库的代码
1.jenkins中安装gitee插件
修改任务项目:
点击添加
测试 修改代码 上传gitee
成功
4. 需要把jenkins打包好的项目复制到测试服务器
企业: jenkins所在的服务器和我们项目运行时的服务器应该不是同一台机器。
由于jenkins构建消耗内存极大,一般jenkins是一台单独的工具机器,java项目一般在其他的机器上,这里我需要重新安装一台虚拟机,有条件的可以直接开阿里云的ECS
jenkins编译打包好的软件在jenkins所在的服务器。
151上的jar远程复制到152上。---->
scp 文件名 root@远程ip:/远程的目录
scp maven-jenkins-0.0.1-SNAPSHOT.jar root@192.168.19.152:/usr/local
在复制过程中需要手动输入密码:
远程登录其他服务器时,能否免密登录。
4.1. 设置远程登录免密
如何设置免密:
(1)在jenkins所在的服务器上输入如下命令
ssh-keygen -t rsa 敲三次回车
(2)接下来需要将公钥导入到认证文件中
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
如果希望ssh公钥生效需满足至少下面两个条件:
- ssh目录的权限必须是700 r4 w2 x1
- ssh/authorized_keys文件权限必须是600
(3) 给对应文件授权
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
(4)将authorized_keys文件拷贝到另一台应用服务器的root用户.ssh目录下
把151上的公钥复制到156上
# 在应用服务器(192.168.19.152)上用root用户创建/root/.ssh文件夹
mkdir -p /root/.ssh
# 在jenkins服务器(192.168.19.151)上将pub公钥文件拷贝到应用服务器的.ssh目录下
scp -p ~/.ssh/id_rsa.pub root@192.168.19.152:/root/.ssh/authorized_keys
(5)测试免密连接152服务器
ssh 192.168.19.152
exit 退出
到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助
4.2. 使用脚本在jenkins 完成jar的复制
#!/bin/bash
echo "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot"
echo "待部署的应用服务器,可多台"
server_ips="192.168.19.152"
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"
记得修改要部署的服务器
修改代码并上传到gitee 测试是否能够自动复制到应用服务器中152
此时152已复制项目
在项目所在文件夹创建一个启动脚本start.sh,让项目自动启动
vi 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
创建一个关闭脚本,让项目自动关闭
vi stop.sh
#!/bin/bash
APP_ID=my-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
此时权限不够
chmod 777 start.sh
chmod 777 stop.sh
此时两个脚本的运行还需要手动运行
sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh
再次修改代码测试是否成功,能否自动启动