CI/CD-Jenkins文档

Jenkins

一. Jenkins概括

1.Jenkins 是什么?

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

2.为什么要使用Jenkins?

Jenkins能将各种开源的软件集成为一体,从而实现不同功能的调度工作。

在这里插入图片描述

二.Jenkins安装部署

安装Jenkins只需要简单几步即可完成。PS:Jenkins的安装方式有很多。可参考Jenkins官网安装文档

1.Jenkin下载

#安装java环境,Jenkins是由java语言编写
[root@jenkins ~]# yum install java -y
[root@jenkins ~]# yum localinstall jenkins-2.176.1-1.1.noarch.rpm -y
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# netstat -lntp

PS:rpm包可在清华镜像源下载,https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/(Jenkins官网下载源在美国,可能会被墙)

2.配置windows的Host解析

10.0.0.120 jenkins.zhangxianwei.com

3.解锁Jenkins

[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

4.访问Jenkins

http://jenkins.zhangxianwei.com:8080/

5.自定义Jenkins插件

1)如果网络较好,同时你不清楚要安装哪些插件,通常选择 推荐的插件。

2)网络较差,而且对jenkins比较熟悉,建议自定义选择插件。

3)什么都不选, 简单的说就是一个插件都不安装 ,直接点击左上角关闭这一步跳过它。

6.跳过插件后,直接进入了Jenkins系统

  1. 用户:admin

​ 密码:初始密码存放在Jenkins的文件中

cat /var/lib/jenkins/secrets/initialAdminPassword

2)修改初始密码

进入后台后点击右上角admin—>configure–>Password

7.Jenkins文件详解

[root@oldboy62 opt]# rpm -ql jenkins 
/etc/init.d/jenkins  #systemctl管理启动
/etc/logrotate.d/jenkins#日志切割
/etc/sysconfig/jenkins	#jenkins主配置文件
/usr/lib/jenkins/plugins	#放置所有插件的地方
/usr/lib/jenkins/jenkins.war 
/usr/sbin/rcjenkins	
/var/cache/jenkins	
/var/lib/jenkins	
/var/log/jenkins

三.Jenkins的插件管理?

1)在安装插件过程中如何加速?

​ 清华源

2)通过web页面上传.hpi文件经行插件安装

​ https://mirror.tuna.tsinghua.edu.cn/jenkins/plugins/

​ 或者

​ https://plugins.jenkins.io

3)导入之前服务器已安装的插件 (离线安装)。

[root@jenkins ~]# tar xf jenkins_2.176_plugins.tar.gz 
[root@jenkins ~]# cp -rp  plugins/* /var/lib/jenkins/plugins/
[root@jenkins ~]# chown -R jenkins.jenkins /var/lib/jenkins/plugins/
[root@jenkins ~]# systemctl restart jenkins

四.Jenkins自动化使用

1.Jenkins与Gitlab如何集成?

Jenkins新建freestyle项目,然后配置gitlab仓库项目对应地址。将jenkins服务器的公钥分给gitlab的用户,再将jenkins服务器的私钥填写给Jenkins的web界面,添加Jenkins凭证。这样Jenkins就有权限到gitlab拉去代码。

在这里插入图片描述
1571661046290

将jenkins服务器的私钥添加给jenkins的web界面

在这里插入图片描述

2.使用jenkins来实现自动化的代码上线

1)commit方式

1.Jenkins需要拉取gitlab上的仓库代码。

2.Jenkins需要将拉去下来的代码推送至web集群 (手动或者shell)

脚本如下(包括代码tag标签上线代码,代码回滚,代码重发发布功能):

[root@oldboy62 ~]# cat /server/scripts/deploy_html.sh 
#!/usr/bin/bash
# func: deploy auto html

WEB_SERVER="172.16.1.7 172.16.1.9"
WEB_DIR="/code"
DATE=$(date +%F-%H-%M)

#1.打包代码
tar_code() {
	cd ${WORKSPACE} && \
	tar czf /opt/monitor-${DATE}.tar.gz ./*
} 
#2.推送代码
scp_push_code() {
	for host in $WEB_SERVER
	do
		scp -rp /opt/monitor-${DATE}.tar.gz root@$host:/opt
	done
		rm -f /opt/monitor-${DATE}.tar.gz

        for host in $WEB_SERVER
        do
		ssh root@$host "cd $WEB_DIR && mkdir monitor-${DATE} -p && \
                tar xf /opt/monitor-${DATE}.tar.gz -C $WEB_DIR/monitor-${DATE} && \
                rm -f /opt/monitor-${DATE}.tar.gz && \
                rm -f /code/monitor && \
                ln -s /code/monitor-${DATE} /code/monitor"
        done
}
#3.调用
deploy () {
	tar_code
	scp_push_code
}
	deploy

步骤如下:

继Jenkins与gitlab集成后

在这里插入图片描述
在这里插入图片描述

2)tag标签方式代码自动上线

这里需要脚本支持进行传递参数 jenkins的参数化构建
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下面是重点难点
在这里插入图片描述

将构建的参数传递给shell脚本使用
在这里插入图片描述

在这里插入图片描述

脚本如下:

[root@oldboy62 ~]# cat /server/scripts/deploy_html_tag.sh 
#!/usr/bin/bash
# func: deploy auto html
WEB_SERVER="172.16.1.7"
WEB_DIR="/usr/share/nginx"
DATE=$(date +%F-%H-%M)

#1.打包代码
tar_code() {
	cd ${WORKSPACE} && \
	tar czf /opt/monitor-${DATE}-${git_version}.tar.gz ./*
} 

#2.推送代码
scp_push_code() {
	for host in $WEB_SERVER
	do
		scp -rp /opt/monitor-${DATE}-${git_version}.tar.gz root@$host:/opt

		ssh root@$host "cd $WEB_DIR && mkdir monitor-${DATE}-${git_version} -p && \
                tar xf /opt/monitor-${DATE}-${git_version}.tar.gz -C $WEB_DIR/monitor-${DATE}-${git_version} && \
                rm -f /opt/monitor-${DATE}-${git_version}.tar.gz && \
                rm -f /code/monitor && \
                ln -s $WEB_DIR/monitor-${DATE}-${git_version} $WEB_DIR/monitor"
        done
}
#3.调用
deploy () {
	tar_code
	scp_push_code
}
	deploy

3. Jenkins实现项目tag发布与回退

思路:1.添加一个选项参数构建:deploy_env

​ 2.编写shell脚本:

​ 如果传递的字符串是deploy就调用deploy的函数

​ 如果传递的字符串是rollback就调用back函数执行回退

​ 3.back函数怎么写?

​ 1)获取要退回的版本的站点目录路径

​ 2)删除软链接

​ 3)重新创建软链接,将软链接指向要回退的版本的站点目录

脚本:

[root@oldboy62 ~]# cat /server/scripts/deploy_html_tag_rollback.sh
#!/usr/bin/bash
# func: deploy auto html

WEB_SERVER="172.16.1.7"
WEB_DIR="/usr/share/nginx"
DATE=$(date +%F-%H-%M)


#1.打包代码
tar_code() {

	cd ${WORKSPACE} && \
	tar czf /opt/monitor-${DATE}-${git_version}.tar.gz ./*
} 

#2.推送代码
scp_push_code() {
	for host in $WEB_SERVER
	do
		scp -rp /opt/monitor-${DATE}-${git_version}.tar.gz root@$host:/opt

		ssh root@$host "cd $WEB_DIR && mkdir monitor-${DATE}-${git_version} -p && \
                tar xf /opt/monitor-${DATE}-${git_version}.tar.gz -C $WEB_DIR/monitor-${DATE}-${git_version} && \
                rm -f /opt/monitor-${DATE}-${git_version}.tar.gz && \
                rm -f $WEB_DIR/monitor && \
                ln -s $WEB_DIR/monitor-${DATE}-${git_version} $WEB_DIR/monitor"
        done
}

back () {

	back_file=$(ssh [email protected] "find ${WEB_DIR} -maxdepth 1 -name "monitor-*-${git_version}"")
        for host in $WEB_SERVER
        do
                ssh root@$host "rm -f $WEB_DIR/monitor && \
                ln -s "$back_file" $WEB_DIR/monitor"
        done
}
#3.调用
deploy () {
	tar_code
	scp_push_code
}
if [ $deploy_env == "deploy" ];then
    #避免重复发布
	if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then
		echo "此 $git_version 版本已经部署过,无需重复部署."
		exit 1
	else
		deploy
	fi
elif [ $deploy_env == "rollback" ];then
	back
fi

4.7.Jenkins解决项目能重复发布问题

利用参数jenkins的参数

$GIT_COMMIT :当前tag对应的commit的哈希值

$GIT_PREVIOUS_SUCCESSFUL_COMMIT:已经发布过的版本的commit哈希值

思路:通过条件$GIT_COMMIT = $GIT_PREVIOUS_SUCCESSFUL_COMMIT是否相等来决定是否执行deploy函数。

it_version 版本已经部署过,无需重复部署."
exit 1
else
deploy
fi
elif [ $deploy_env == “rollback” ];then
back
fi


#### 4.7.Jenkins解决项目能重复发布问题

利用参数jenkins的参数

 $GIT_COMMIT :当前tag对应的commit的哈希值

$GIT_PREVIOUS_SUCCESSFUL_COMMIT:已经发布过的版本的commit哈希值

思路:通过条件$GIT_COMMIT =  $GIT_PREVIOUS_SUCCESSFUL_COMMIT是否相等来决定是否执行deploy函数。 

发布了48 篇原创文章 · 获赞 1 · 访问量 1465

猜你喜欢

转载自blog.csdn.net/weixin_43876317/article/details/103511549