文章目录
1. 安装jenkins
# 1. 安装java环境、安装jenkins
[root@jenkins ~]# yum install java -y
[root@jenkins ~]# yum localinstall jenkins-2.176.1-1.1.noarch.rpm -y # 也可以使用rpm -ivh jenkins-2.176.1-1.1.noarch.rpm进行安装
[root@jenkins ~]# rpm -ql jenkins # 查看jenkins的配置文件
/etc/init.d/jenkins #启停脚本
/etc/logrotate.d/jenkins #日志切割
/etc/sysconfig/jenkins #主要配置文件
/usr/lib/jenkins
/usr/lib/jenkins/jenkins.war #jenkins的核心包(后面的升级就是替换该核心包即可)
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins #jenkins的工作目录
/var/log/jenkins #jenkins的日志路径
# 2. 加入开机启动、启动jenkins
[root@jenkins ~]# systemctl enable jenkins
[root@jenkins ~]# systemctl start jenkins
小技巧: 如果想通过域名访问,请配置hosts劫持 Windows | MacOS
10.0.0.120 jenkins.oldxu.com (C:\Windows\system32\drivers\etc\hosts)
# 3. 问题排错
(1)jenkins出现:Please wait while Jenkins is getting ready to work .
将安装目录/var/lib/jenkinss下 hudson.model.UpdateCenter.xml
修改为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
#然后重启jenkins
(2)当第一次初始化jenkins,如果没有正常进入,然后需要登录密码时,默认的用户是 admin 、 密码是:
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
05c55ae33edc4a4c93232bff9964e06b
(3)当进入Jenkins后,第一件事情就是修改密码:oldxu.com
访问后的页面操作
2. Jenkins插件管理与汉化
Jenkins插件管理
1.在jenkins页面进行安装
2.上传.hpi的文件进行安装
3.直接导入插件、重启Jenkins完成安装。直接准备好的插件放到这个目录下
#插件默认存储在 /var/lib/jenkins/plugins
[root@jenkins ~]# cd jenkins/
[root@jenkins jenkins]# tar xf jenkins_plugins_new.tar.gz
[root@jenkins jenkins]# mv plugins/* /var/lib/jenkins/plugins/
[root@jenkins jenkins]# chown -R jenkins.jenkins /var/lib/jenkins/plugins/
[root@jenkins jenkins]# systemctl restart jenkins
jenkins汉化
注意:有的人是导入插件后就全中了,那么不用进行如下操作
1.先将jenkins调整为英文 Mange jenkins --> configure SYstem -->Locale -->zh_US
2.重启jenkins http://IP:8080/restart
3.在将jenkins调整为中文语言,然后刷新即可。 Mange jenkins --> configure SYstem -->Locale --> zh_CN
3. Jenkins与shell-git集成
Jenkins集成shell
集成Shell、创建一个自由软件风格的项目--然后在构建里面调用Shell (输入Shell指令即可。)
Jenkins集成gitlab:
1.jenkins需要安装对应的git插件(提前已经部署好插件了)
2.创建项目,选择源代码,填写gitlab项目的地址 (记住,需要让jenkins能解析该域名)
3.jenkins服务器生成秘钥对
3.1 将公钥放入gitlab服务器对应的用户下(得是对该项目有权限的用户)
3.2 将私钥放入jenkins,因为jenkins并不知道你的私钥在那里。所以需要添加一个凭据(告诉jenkins私钥是啥。)
(把Jenkins的公钥放到gitlab上不能实现解密,因为jenkins并不知道你的私钥放在哪里,系统知道私钥在哪)
具体操作如下如所示:
4. 发布代码的架构图
1.先去搭建集群环境:
2.模拟开发提交代码到gitlab
3.手动拉取代码。并完成代码的更新 (手动)
5. 手动实现代码的发布
5.1 搭建集群环境
lb:10.0.0.5
web01:10.0.0.7
web02:10.0.0.8
gitlab: 10.0.0.200
jenkins: 10.0.0.201
yum-rpm:10.0.0.100 (模拟开发写代码,提交到远程仓库)
负载均衡配置:
# 1. 进行配置文件配置
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_html.oldxu.com.conf
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name html.oldxu.com;
location / {
proxy_pass http://web;
include proxy_params;
}
}
# 2. 检查语法和重载服务
[root@lb01 ~]# nginx -t
[root@lb01 ~]# systemctl reload nginx
web集群配置:
[root@web01 ~]# cat /etc/nginx/conf.d/html.oldxu.com.conf
server {
listen 80;
server_name html.oldxu.com;
root /web;
location / {
index index.html;
}
}
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl reload nginx
配置下windows的hosts劫持:
10.0.0.5 html.oldxu.com
5.2 模拟开发提交代码
(1)登陆gitlab,创建一个仓库
(2)模拟开发提交本地仓库的代码到远程仓库
# 首先配置ssh免密配置:
[root@yum-rpm ~]# ssh-keygen
# 把公钥配置配置到gitlab的页面上,如下图所示
[root@yum-rpm ~]# cat .ssh/id_rsa.pub
# 1. 在码云上下载开源代码
[root@yum-rpm ~]# git clone https://gitee.com/kangjie1209/monitor.git
# 2. 更换origin对应的仓库(换成提交的gitlab)
# 显示当前origin对应的仓库
[root@yum-rpm monitor]# git remote -v
origin https://gitee.com/kangjie1209/monitor.git (fetch)
origin https://gitee.com/kangjie1209/monitor.git (push)
# 删除当前origin对应的仓库
[root@yum-rpm monitor]# git remote remove origin
# 添加新的ssh协议的仓库
[root@yum-rpm monitor]# git remote add origin git@10.0.0.200:ops/web-moniter.git
# 显示当前的origin对应的仓库,确认是否添加成功(添加这个origin的目录提交代码到那个gitlab仓库)
[root@yum-rpm monitor]# git remote -v
origin git@10.0.0.200:ops/web-moniter.git (fetch)
origin git@10.0.0.200:ops/web-moniter.git (push)
# 3. 把项目的文件提交到在暂存区、本地仓库,推送到gitlab远程仓库
[root@yum-rpm monitor]# git add .
[root@yum-rpm monitor]# git commit -m "v1"
[root@yum-rpm monitor]# git push origin master
5.3 Jenkins手动拉取代码
#先配置免密登陆:(因为Jenkins服务器要推送到web集群)
[root@jenkins ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@jenkins ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
#手动发布代码
# git clone git@10.0.0.200:ops/web-moniter.git
# tar czf web-monitor-$(date +%F-%H-%M).tar.gz web-monitor/
# for i in {7..8};do scp -rp web-monitor-2020-08-17-11-07.tar.gz root@172.16.1.$i:/opt;done
5.4 web集群创建目录代码
#登陆到web集群服务器进行如下操作:
[root@web02 ~]# cd /opt/
[root@web02 opt]# tar xf web-monitor-2020-08-17-11-07.tar.gz
[root@web02 opt]# rm -f /web && ln -s /opt/web-monitor /web
[root@web02 opt]# ll /web
lrwxrwxrwx 1 root root 16 8月 17 11:08 /web -> /opt/web-monitor
5.5 浏览器测试网站
浏览器输入html.oldxu.com
6. Jenkins实现半自动发布代码
1.创建jenkins freestyle项目
2.配置好对应gitlab的仓库地址 (源码管理–>web-monitor项目地址)
3.编写对应的Shell脚本,发布到web集群中
[root@jenkins ~]# cat /scripts/html_deploy.sh
#!/usr/bin/bash
# 描述: 用来发布代码至web集群服务器
# 提示1:免密操作已经完成了(Jenkins推公钥到web集群上)
# 提示2:Jenkins会把代码从gitlab拉下来
#定义变量
Date=$(date +%F-%H-%M)
Web_Name=web-monitor-${Date}
Web_Dir=/opt
# 注意:如果Jenkins没有内网网卡,要使用外网网卡10.0.0.7 10.0.0.8
Web_Server="172.16.1.7 172.16.1.8"
#进入对应的项目目录进行打包操作
cd ${WORKSPACE} && \
tar czf ${Web_Dir}/${Web_Name}.tar.gz ./*
#调用scp推送代码压缩包,然后调用ssh进行发布
for host in ${Web_Server}
do
scp -rp ${Web_Dir}/${Web_Name}.tar.gz root@${host}:${Web_Dir}
ssh root@${host} "cd ${Web_Dir} && \
mkdir -p ${Web_Name} && \
tar xf ${Web_Name}.tar.gz -C ${Web_Name} && \
chown -R nginx.nginx ${Web_Name} && \
rm -f ${Web_Name}.tar.gz && \
# 删除软连接
rm -f /web && \
ln -s ${Web_Dir}/${Web_Name} /web"
done
[root@jenkins scripts]# chmod +x /scripts/html_deploy.sh
4.注意:将jenkins的运行身份修改为root,否则无法完成打包操作(JENKINS_USER=“root”)
# 因为Jenkins是由Jenkins用户启动的,所以没有权限,这时需要到/etc/sysconfig/jenkins中修改权限为root
[root@jenkins ~]# vim /etc/sysconfig/jenkins
JENKINS_USER="root"
[root@jenkins ~]# systemctl restart jenkins
5. 修改标题,实现半自动发布代码
这里所谓的半自动发布代码,如果开发者修改代码,开发者提交代码至远程仓库之后,还需要在Jenkins中重新构建代码。如果是开发者提交完代码到远程仓库之后,Jenkins自动构建,这是全自动构建。
开始修改原代码,然后提交代码之后,实现半自动发布代码
7. Jenkins实现全自动发布代码
开发一提交代码,合并到master | push到master 就触发 jenkins构建任务?
gitlab一旦发生push操作则通知jenkins指定的项目完成自动构建:
gitlab通知给哪个jenkins的项目呢?http://10.0.0.201:8080/project/freestyle-web-monitor
gitlab通知给jenkins不需要认证吗?768c448b67c4356dce2b06af160c7547
gitlab怎么配置通知呢?
指定的项目发生push操作才通知jenkins构建,而不是所有的项目发生变化都触发构建?
1.点击对应的项目
2.用户设置中-->webhooks 配置 通知的URL、以及相应验证的Token
# 这个看情况而定,版本不同,有可能不用配下面的内容
3.出现错误:Urlis blocked: Requests to the local network are not allowed
3.1:管理中心-->用户设置--->网络-->外发请求-->勾选(允许Webhook和服务对本地网络的请求)
具体操作如下图所示:
真实测试:
# 进入index.html,到43行修改内容为董坤Aotu管理平台
[root@yum-rpm monitor]# vim index.html
[root@yum-rpm monitor]# git add .
[root@yum-rpm monitor]# git commit -m "Auto"
[root@yum-rpm monitor]# git push origin master
# 进入Jenkins的页面,看项目是否构建成功
具体操作如下图所示:
8. Jenkins基于tags方式发布代码
使用tags的原因是:回退版本比较简单
用户传递参数(tags版本),脚本支持你的传参才可以。
具体操作如下图所示:
真实开始测试:
# 还是修改标题名称
[root@yum-rpm monitor]# vim index.html
[root@yum-rpm monitor]# git add .
[root@yum-rpm monitor]# git commit -m "v1.1"
[root@yum-rpm monitor]# git push origin master [root@yum-rpm monitor]# git tag -a v1.1 -m "这是AI平台1.1版"
# 这里仅仅是一个标签而已
[root@yum-rpm monitor]# git push origin --tags
小总结:
(1)在Jenkins页面开始构建,会出现很多版本,选择版本之后,开始构建, 会把版本传递给设置中的源码管理,然后Jenkins就会拉取项目代码,然后在执行脚本。
(2)在脚本中修改的不多把Web_Name=web-monitor-
D
a
t
e
改
为
W
e
b
N
a
m
e
=
w
e
b
−
m
o
n
i
t
o
r
−
{Date}改为Web_Name=web-monitor-
Date改为WebName=web−monitor−{Date}_${git_version},作用是以识别项目的标签(标签设置的版本号)
#!/bin/bash
# 描述:用来发布代码到web集群服务器
# 提示1:免密操作已经完成了(Jenkins推公钥到web集群上)
# 提示2:Jenkins会把代码从gitlab拉下来
# 定义变量
Date=$(date +%F-%H-%M)
# 多添加了一个变量${git_version},是从Jenkins传进来的,作用标识是哪一个版本,仅此而已
Web_Name=web-monitor-${Date}_${git_version}
Web_Dir=/opt
Web_Server="10.0.0.7 10.0.0.8"
# 进入对应的项目进行打包操作
cd ${WORKSPACE} && tar -zcf ${Web_Dir}/${Web_Name}.tar.gz ./*
# 调用scp推送代码压缩包,然后调用ssh进行发布
for host in ${Web_Server}
do
scp -rp ${Web_Dir}/${Web_Name}.tar.gz root@${host}:${Web_Dir}
ssh root@${host} "cd ${Web_Dir} && \
mkdir -p ${Web_Name} && \
tar xf ${Web_Name}.tar.gz -C ${Web_Name} && \
rm -f ${Web_Name}.tar.gz && \
rm -f /web && \
ln -s ${Web_Dir}/${Web_Name} /web"
done
9. Jenkins基于tags方式回退代码
版本回退,如果让开发在上传一次代码,比较麻烦。 重复发布代码会导致web服务器上的下的项目非常乱,还有就是web服务器上的项目保留最近七天,其他的全部干掉(在Jenkins上用脚本可以解决)。
正确解决方式:
版本回退可以直接在web上进行操作,因为在web中已经存在v1.1和v1.2,如果从v1.2回退到v1.1,可以把/web软连接删掉,给v1.2版本重新建立软连接/web。实现了版本回退。
(1)在Jenkins中写入脚本
#!/usr/bin/bash
# 回退脚本
# 1. 登录目标集群服务
# 2. 删除软连接、重建软连接
# 定义变量
Date=$(date +%F-%H-%M)
Web_Name=web-monitor-${Date}_${git_version}
Web_Dir=/opt
Web_Server="10.0.0.7 10.0.0.8"
for host in ${Web_Server}
do
ssh root@${host} "if [ -d ${Web_Dir}/web-monitor-*_${git_version} ];then
rm -f /web
ln -s ${Web_Dir}/web-monitor-*_${git_version} /web
echo "web-monitor 项目回退至 ${git_version} 版本成功"
else
echo "版本输出错误,退出"
exit 1
fi"
done
(2)在Jenkins页面中进行配置
小提示:
(1)在上面的脚本中exit 1 就是没有找到,则会退出,状态码为1,小球会变红。如果exit的话,状态码为0,虽然没有找到对应的版本,但是小球没有变红,这时不知道回退成功没有,所以exit 1更严谨。
10. Jenkins基于tags方式防止重复构建
如果重复部署v1.1版本是可以成功的,但是在版本回退的时候会产生问题。
如果是部署的话,我们先去检测一下该tag是否部署过,如果部署过则拒绝部署即可。(下面有一小块核心代码 [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ] 判断现在部署的tags和之前发不过去的tag是否相同,如果相同,则不能部署)
tag就是GIT_COMMIT的别名而已。
#!/bin/bash
# 描述:用来发布代码到web集群服务器
# by:dongkun
# 提示1:免密操作已经完成了(Jenkins推公钥到web集群上)
# 提示2:Jenkins会把代码从gitlab拉下来
# 定义变量
Date=$(date +%F-%H-%M)
Web_Name=web-monitor-${Date}_${git_version}
Web_Dir=/opt
Web_Server="10.0.0.7 10.0.0.8"
# 已经成功部署过的tags,无法部署第二次。
if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
echo "你已经发布过 ${git_version}"
echo "它的 CommitID为 ${GIT_COMMIT}"
echo "无需重复发布" && exit 1
fi
# 进入对应的项目进行打包操作
cd ${WORKSPACE} && tar -zcf ${Web_Dir}/${Web_Name}.tar.gz ./*
# 调用scp推送代码压缩包,然后调用ssh进行发布
for host in ${Web_Server}
do
scp -rp ${Web_Dir}/${Web_Name}.tar.gz root@${host}:${Web_Dir}
ssh root@${host} "cd ${Web_Dir} && \
mkdir -p ${Web_Name} && \
tar xf ${Web_Name}.tar.gz -C ${Web_Name} && \
rm -f ${Web_Name}.tar.gz && \
rm -f /web && \
ln -s ${Web_Dir}/${Web_Name} /web"
done
开始进行测试: