简介

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
Jenkins是一个广泛用于持续构建的可视化Web工具,持续构建就是将项目自动化编译、打包、部署。通过规范化来完成,简单,繁琐,浪费时间的重复工作。

工作流程

1、开发人员提交代码到git仓库
2、Jenkins手动/定时构建项目
3、Jenkins拉取git仓库代码-》代码编译-》打包镜像-》推送到镜像仓库
4、Jenkins执行脚本/Dodckerfile在Docker主机上创建容器并发布
5、测试人员浏览项目进行测试

在这里插入图片描述

安装

Jenkins安装包来源

用户手册:
https://jenkins.io/zh/doc/
下载:
https://www.jenkins.io/zh/download/

或者使用本人提供的
https://download.csdn.net/download/weixin_39218464/27377641

在这里插入图片描述

安装命令

# 注意我们需要安装java环境
yum install -y java
yum localinstall -y /root/jenkins/jenkins-2.222.1-1.1.noarch.rpm

启动

systemctl start jenkins

验证

查看jenken服务是否开启与端口

  • 如果没有则关闭防火墙
netstat -lnpt

在这里插入图片描述

配置域名

在C:\Windows\System32\drivers\etc目录下修改hosts文件

192.168.10.101 jenkins.liuyuanshan.top

获取登录密码

cat /var/lib/jenkins/secrets/initialAdminPassword

登录

http://jenkins.liuyuanshan.top:8080/login

在这里插入图片描述

登录白屏问题解决

1、在$JENKINS_HOME/hudson.model.UpdateCenter.xml文件中,默认内容如下/var/lib/jenkins/hudson.model.UpdateCenter.xml

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins-ci.org/update-center.json</url>
  </site>
</sites>

这个地址在外国的服务器,因为墙的原因,下载初始化界面所需插件不了,就一直处于等待状态

把url改为http://mirror.xmission.com/jenkins/updates/update-center.json就解决了

重启服务

systemctl restart jenkins

安装插件的三种方法

导入扩展
扩展来源:
https://download.csdn.net/download/weixin_39218464/27377641
在这里插入图片描述

# 解压插件扩展
tar -zxvf jenkins_plugins.tar.gz
# 删除原有插件删除
rm -rf /var/lib/jenkins/plugins/* 
# 拷贝解压后的插件并移动
mv plugins/ /var/lib/jenkins/
# 停止服务
systemctl stop jenkins
# 查看所有插件
ls /var/lib/jenkins/plugins/
# 递归设置文件所有者是谁
chown -R jenkins.jenkins /var/lib/jenkins
# 启动服务
systemctl start jenkins
# 查看进程
ps aux | grep jenkins
# 查看日志
tail -f /var/log/jenkins/jenkins.log

在线安装插件
在这里插入图片描述

导入方式上传插件
在这里插入图片描述

隐藏界面上面的警告

系统管理-》全局安全配置-》隐藏的安全警告-》全部取消勾选
在这里插入图片描述
在这里插入图片描述

快速体验Shell操作

新建任务-》testshell-》创建一个自由风格的软件项目-》确定-》构建-》执行 shell-》编写脚本内容-》保存
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
立即构建
在这里插入图片描述
查看shell脚本执行后生成的文件
在这里插入图片描述

在这里插入图片描述

jenkins去集成我们的gitlab或者gitee

jenkins为何要集成gitlab
因为我们需要托管Jenkins将gitlab上项目获取到本地,为后续网站的代码发布工作做准备。

jenkins是如何集成gitlab的
由于Jenkins只是一个调度平台,所有需要安装与gitlab相关的插件既可以完成集成。

jenkins与gitlab的集成步骤
1)开发提交代码到Gitlab上
2)jenkins安装gitlab对应的插件
3)jenkins创建yzm项目,然后配置gitlab仓库项目对应的地址

在这里插入图片描述
配置ssh
在开发机上执行 ssh-keygen,把公钥放入到gitlab中
在这里插入图片描述

jenkins安装gitlab对应的插件

系统管理-》插件管理-》已安装

插件名称插件作用
Credentials允许在Jenkins中存储认证的凭据
Git Client允许Jenkins使用git
Git Plugin允许Jenkins集成git
Gitlab允许Gitlab触发Jenkins构建并在Gitlab中显示
GitLab Hook允许gitlab自动触发jenkins构建项目
Gitlab Authentiactiongitlab身份验证插件

在这里插入图片描述

上文直接导入的扩展包以配置好,这里不再配置

在Jenkins服务器上安装git环境

1) 在Jenkins服务器上安装git环境

# 安装git 
yum -y install git
# 重启Jenkins服务
systemctl restart jenkins	

2)Jenkins服务中完善git的配置信息
系统管理-》全局工具配置-》git-》配置git程序执行目录位置

找到git在Jenkins服务器的安装位置

which git

在这里插入图片描述

在这里插入图片描述

jenkins创建yzm项目

新建任务-》yzm -》创建一个自由风格的软件项目-》确定-》编辑项目git配置
在这里插入图片描述

General
填写描述、丢弃旧的构建-》保持构建的最大个数10个

源码管理
选择-》Git-》填写Repository URL
在这里插入图片描述

配置host文件
如果是内网搭建的gitlab则需要在Jenkins服务器中配置解析的gitlab对应IP与域名解析配置

在Jenkins服务器中执行 ssh-keygen获取配置在Gitlab上的公钥,私钥配置在Jenkins中
1)生成公钥配置在Gitlab上
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2)私钥配置在Jenkins中
在这里插入图片描述

在这里插入图片描述

进行项目初始化构建
1、立即构建yzm项目
2、通过该控制台输出可以查看最近提交的信息
3、通过工作区可以查看代码
在这里插入图片描述

在这里插入图片描述
工作区查看代码
在这里插入图片描述

真实拉取gitlab的项目在

 /var/lib/jenkins/workspace/

在这里插入图片描述

集群部署

在这里插入图片描述

搭建nginx集群

1、搭建3台Nginx服务器
2、映射host文件
使用192.168.10.102 www.liuyuanshan.top做映射域名,负载分发器

在这里插入图片描述
3、为192.168.10.102~104服务器安装nginx服务

# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的CentOS-Base.repo 到/etc/yum.repos.d/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 或者
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 运行 yum makecache
yum makecache
# 运行yum install epel-release -y
yum install epel-release -y
yum install nginx -y
# 查找nginx.conf路径
find / -name 'nginx.conf'
# 重启nginx
systemctl restart nginx

4、编辑负载均衡分发器
vi www.liuyuanshan.top.conf

upstream html {
  server 192.168.10.103:80;
  server 192.168.10.104:80;
}

server {
   listen 80;
   server_name www.liuyuanshan.top;
   location / {
      proxy_pass http://html;
      proxy_set_header Host $http_host;
  }
}

重启nginx服务

# 重启nginx
systemctl restart nginx

访问查看是否否成功将请求分发
http://www.liuyuanshan.top/?name=test
在这里插入图片描述

手动把jenkins的代码拷贝到nginx里面

cd /var/lib/jenkins/workspace/yzm
scp -r ./* root@192.168.10.103:/usr/share/nginx/html

在这里插入图片描述

jenkins自动部署到我们集群上面

为jenkins服务下的服务器生成密码:ssh-keygen
将Jenkins服务下的pub公钥传递到nginx服务下上,进行免密登录,使得拷贝文件时避开密码校验问题

# jenkins的密钥在配置gitee时候就已经生成过,无需再次生成,看上文中的操作
#进入到ssh文件夹拷贝pub公钥
cd /root/.ssh
# 将公钥拷贝至目标服务器下-生成的文件名为authorized_keys
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.103
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.10.104

查看拷贝到目标主机的公钥内容
cat authorized_keys
在这里插入图片描述

写一个shell脚本
1)进入项目目录,将内容进行打包
2)将内容通过scp拷贝分发到web集群组中

在jenkins服务器中进行shell脚本编写

# 进入项目目录
cd /var/lib/jenkins/workspace/yzm
# 创建shell脚本目录存放脚本文件
mkdir scripts
# 创建并编写脚本
vi html_deploy.sh
# 赋予文件读写执行的权限
chmod 777 html_deploy.sh

html_deploy.sh脚本内容

#!/usr/bin/bash
# 初始化时间变量
DATE=$(date +%Y-%m-%d-%H-%M-%S)
# 移动代码的目标服务器IP
web_serer="192.168.10.103"
# WORKSPACE
get_code(){
	# WORKSPACE是在Jenkins中设置动态环境变量-知道有这个就行
	# WORKSPACE动态表示/var/lib/jenkins/workspace/yzm
	cd ${WORKSPACE} && \
	tar czf /opt/web-${DATE}.tar.gz ./../*
}

scp_web_server(){
# 循环遍历拷贝到目标主机
for host in ${web_serer}
do
	# 从opt中将压缩的文件拷贝到目标主机的opt目录下
	scp /opt/web-${DATE}.tar.gz root@${host}:/opt
	ssh root@${host} "mkdir -p /usr/share/nginx/html_back/web-${DATE} && \
	tar -zxf /opt/web-${DATE}.tar.gz -C /usr/share/nginx/html_back/web-${DATE} && \
	rm -rf /usr/share/nginx/html && \
	ln -s /usr/share/nginx/html_back/web-${DATE}/yzm /usr/share/nginx/html"

done
}
//方法
deploy(){
 //执行get_code方法
  get_code
  //执行scp_web_server方法
  scp_web_server
}

//触发方法
deploy

WORKSPACE是在Jenkins中设置动态环境变量-知道有这个就行
WORKSPACE动态表示/var/lib/jenkins/workspace/yzm
在这里插入图片描述

修改jenkins执行权限由jenkins转为root用户
查看当前jenkins服务用户权限

ps aux |grep jenkins

在这里插入图片描述
修改用户权限

vi /etc/sysconfig/jenkins
# 完成修改后记得重启服务
systemctl restart jenkins

在这里插入图片描述

进入jenkins系统yzm项目设置shell执行脚本

sh -x /var/lib/jenkins/workspace/yzm/scripts/html_deploy.sh

在这里插入图片描述

在这里插入图片描述

jenkins支持gitlab的tab

由于之前上线方式直接拉取最新代码,会造成后期回退变得困难,如果采用采用tag的方式,比如第一次上线v1.1,第二次上线v1.2,如果上线v1.2出现问题,那么可以快速回退到v1.1

思路

1.开发如果需要发布新版本,必须将当前的版本打上一个标签tag。
2.jenkis需要让其脚本支持传递,比如用户传递v1.1 拉取v1.1标签

实战jenkins部署tag版本

安装git 参数插件,引入的扩展包有,这里只是说明,没有的自行加入
在这里插入图片描述
在项目中配置-》勾选参数化构建过程
添加参数-》Git Parameter

在这里插入图片描述
在这里插入图片描述
源码管理-》Branches to build

在这里插入图片描述

修改执行脚本

sh -x /var/lib/jenkins/workspace/yzm/scripts/html_deploy_bytag.sh

在这里插入图片描述

这部分仅作演示用,不需要配置

在项目中配置-》勾选参数化构建过程
添加文本参数、选择参数
在这里插入图片描述
添加参数-》文本参数
在这里插入图片描述
在这里插入图片描述

添加参数-》选项参数
在这里插入图片描述

测试上边添加的参数变量
在这里插入图片描述
测试传值
在这里插入图片描述
设置rollback为2.0-》开始构建
在这里插入图片描述

在这里插入图片描述


修改tag的脚本: html_deploy_bytag.sh
增加版本信息

cp /var/lib/jenkins/workspace/yzm/scripts/html_deploy.sh /var/lib/jenkins/workspace/yzm/scripts/html_deploy_bytag.sh
#!/usr/bin/bash
# 初始化时间变量
DATE=$(date +%Y-%m-%d-%H-%M-%S)
# 移动代码的目标服务器IP
web_serer="192.168.10.103 192.168.10.104"
Name=${DATE}-${git_version}
# WORKSPACE
get_code(){
	# WORKSPACE是在Jenkins中设置动态环境变量-知道有这个就行
	# WORKSPACE动态表示/var/lib/jenkins/workspace/yzm
	cd ${WORKSPACE} && \
	tar czf /opt/web-${Name}.tar.gz ./../*
}

scp_web_server(){
# 循环遍历拷贝到目标主机
for host in ${web_serer}
do
	# 从opt中将压缩的文件拷贝到目标主机的opt目录下
	scp /opt/web-${Name}.tar.gz root@${host}:/opt
	ssh root@${host} "mkdir -p /usr/share/nginx/html_back/web-${Name} && \
	tar -zxf /opt/web-${Name}.tar.gz -C /usr/share/nginx/html_back/web-${Name} && \
	rm -rf /usr/share/nginx/html && \
	ln -s /usr/share/nginx/html_back/web-${Name}/yzm /usr/share/nginx/html"

done
}
//方法
deploy(){
 //执行get_code方法
  get_code
  //执行scp_web_server方法
  scp_web_server
}

//触发方法
deploy

tag 演示

1、将本地修改好的代码提交到远程仓库
2、在本地打标签后推送到远程上

# 修改前对当前版本进行版本定义
git tag -a "v1.1" -m 'v1.1版本'
git push origin v1.1
# 将修改后的文件提交到远程仓库
git add .
git commit -m "v1.2"
git push
# 对推送的代码进行打标签,以便于版本回退
git tag -a "v1.2" -m "v1.2版本"
git push origin v1.2

在Build with Parameters可以查看提交的tag版本
在这里插入图片描述
构建指定版本代码
在这里插入图片描述

部署和回滚

修改脚本: html_deploy_rollback.sh

#!/usr/bin/bash

DATE=$(date +%Y-%m-%d-%H-%M-%S)
web_serer="192.168.10.216 192.168.10.217"

Name=${DATE}-${git_version}
get_code(){
	cd ${WORKSPACE} && \
	tar czf /opt/web-${Name}.tar.gz ./../*
}

scp_web_server(){
for host in ${web_serer}
do
	scp /opt/web-${Name}.tar.gz root@${host}:/opt
	ssh root@${host} "mkdir -p /usr/share/nginx/html_back/web-${Name} && \
	tar -zxf /opt/web-${Name}.tar.gz -C /usr/share/nginx/html_back/web-${Name} && \
	rm -rf /usr/share/nginx/html && \
	ln -s /usr/share/nginx/html_back/web-${Name}/yzm /usr/share/nginx/html"

done
}

deploy(){
  get_code
  scp_web_server
}


back(){
back_file=$(ssh root@192.168.10.216 "find /usr/share/nginx/html_back/ -maxdepth 1 -type d -name "web-*-${git_version}"")
for host in $web_serer
do
        ssh root@${host} "rm -rf /usr/share/nginx/html && \
                          ln -s ${back_file}/yzm /usr/share/nginx/html"
done

}


if [ $deploy_env == "deploy" ];then
        deploy
elif [ $deploy_env == "rollback" ];then
        back
fi

修改参数配置

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

演示

在这里插入图片描述

Logo

更多推荐