Jenkins结合gitlab自动化上线

本文详细介绍了如何将Jenkins与Gitlab整合,实现从代码提交到自动上线的全流程自动化。涵盖了Gitlab的安装配置、Jenkins的安装及项目配置,以及自动触发构建、反馈上线结果、避免重复执行、一键升级回滚和微信通知等优化步骤。

1.Gitlab安装配置

1.1 git配置环境准备
1. 查看系统版本
[root@gitlab ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
2. 查看内核版本
[root@gitlab ~]# uname -r
3.10.0-957.el7.x86_64
3. 确认Selinux关闭状态
[root@gitlab ~]# getenforce
Disabled
4. 确认防火墙关闭
[root@gitlab ~]# systemctl stop firewalld
1.2 Git安装部署
1. 安装Git
[root@gitlab ~]# yum install -y git
[root@gitlab ~]# git --version
git version 1.8.3.1
2. 配置git使用用户、邮箱、 语法高亮
git config --global user.name "kongdi"   # 配置git使用用户 
git config --global user.email "kongdi@mail.com"   # 配置git使用邮箱
git config --global color.ui true   # 语法高亮
3. 检查
[root@gitlab ~]# git config --list 
user.name=kongdi
user.email=kongdi@mail.com
color.ui=true
[root@gitlab ~]# cat .gitconfig 
[user]
	name = kongdi
	email = kongdi@mail.com
[color]
	ui = true
4. git初始化工作目录
mkdir git_data
cd git_data/
git init      #初始化
git status    #查看工作区状态
注:对已存在的目录或者对已存在的目录都可进行初始化
1.3 gitlab环境准备
1. CentOS 6或者7
2. 2G内存(实验)生产(至少4G)
3. 安装包:gitlab-ce-10.2.2-ce 
   #上传gitlab安装包 ,可通过国内清华源gitlab-ce社区版本下载
4. 禁用防火墙,关闭selinux
1.4 Gitlab安装部署
1. 安装依赖和软件
yum -y install policycoreutils-python
rpm -ivh gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm
2. 编写gitlab 配置文件
vim /etc/gitlab/gitlab.rb  
更改url地址为本机IP地址 external_url 'http://10.0.0.200'
3. 更改配置文件后需重新配置
gitlab-ctl reconfigure
4. 通过浏览器输入IP地址进行访问gitlab
10.0.0.200---创建密码12345678

2. gitlab的简单配置

1. 配置外观
管理区域-外观
2. 关闭自动注册-可根据实际需求操作(建议:不勾选)
管理区域-设置-关闭自动注册(Sign-up enabled)
3. 创建组-用户-项目

在这里插入图片描述

2.1 创建组、项目、用户

创建组
在这里插入图片描述
在这里插入图片描述
创建新项目
在这里插入图片描述
添加gitlab的key到网页
在这里插入图片描述
创建用户
在这里插入图片描述
设置密码
在这里插入图片描述
打开无痕窗口登录测试
在这里插入图片描述
把用户添加到组里面
在这里插入图片描述
添加ssh-keys到gitlab的dev用户
在这里插入图片描述
在root用户上设置保护主分支
在这里插入图片描述

2. Jenkins安装配置

1.安装JDK运行环境和jenkins服务
上传JDK和jenkins rpm安装包,使用rpm -ivh进行安装,安装完JDK运维java测试是否安装成功
rpm -ivh jdk-8u181-linux-x64.rpm
rpm -ivh jenkins-2.176.1-1.1.noarch.rpm
2.配置jenkins(启动用户修改为root)
[root@jenkins ~]# vim /etc/sysconfig/jenkins 
JENKINS_USER="root"
#启动Jenkins
systemctl restart jenkins
systemctl enable jenkins
3.访问页面进行配置
http://10.0.0.201:8080

在这里插入图片描述

4.上传插件包解压到plugins下执行重启
rz jenkins_plugins.tar.gz到/var/lib/jenkins下
cd /var/lib/jenkins
rm -rf plugins
tar xf jenkins_plugins.tar.gz
systemctl restart jenkins

在这里插入图片描述
在这里插入图片描述
更改密码为123

2.1 创建项目配置

在这里插入图片描述
1)jenkins获取git源码,这里我们有码云导入一个HTML页面的监控平台到gitlab仓库
在这里插入图片描述
2)jenkins端配置从git获取代码,由于我们dev用户是配置在jenkins上,所以无需认证即可下载代码
在这里插入图片描述
3)执行立即构建获取到代码
在这里插入图片描述

3. Jenkins结合gitlab自动化上线

在这里插入图片描述

3.1 准备脚本文件
[root@jenkins scripts]# cat deploy.sh
#!/bin/sh
code_dir=/var/lib/jenkins/workspace/my-freestyle-job
web_dir=/usr/share/nginx/
time=`date +%F-%H-%M-%S`
ip=10.0.0.7
code_tar(){
    cd $code_dir && tar zcf /opt/$time-web.tar.gz  ./*
}

scp_code(){
    ssh $ip "mkdir $web_dir/$time-web"
    scp /opt/$timeweb.tar.gz $ip:$web_dir/$time-web
}

tar_xf(){
    ssh $ip  "cd $web_dir/$time-web && tar xf $time-web.tar.gz && rm -f $time-web.tar.gz"
}

ln(){
    ssh &ip "cd $web_dir && rm -rf html && ln -s $time-web html"
}

main(){
	code_tar
	scp_code
	tar_xf
	ln
}
main
3.2 web服务器准备
1.在web服务器安装nginx,启动,删除/usr/share/nginx/html/下的所有文件
[root@web ~]# rm -rf /usr/share/nginx/html/*
2.在Jenkins上做免密钥
[root@jenkins ~]# ssh-copy-id -i .ssh/id_rsa.pub 10.0.0.7
#测试 ssh 10.0.0.7
3.执行脚本,刷新10.0.0.7网站
sh /server/scripts/deploy.sh

在这里插入图片描述

3.3 jenkins测试

1)使用jenkins调用部署脚本(此处写脚本全路径脚本名称)测试
在这里插入图片描述
2)点击立即构建,查看输出成功
在这里插入图片描述

3.4 模拟开发上传代码并自动化上线
1)将代码克隆到本地
[root@gitlab ~]# git clone git@10.0.0.200:oldboy/monitor.git
2)修改代码内容,便于观察不同
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">Simulation development test</a>
3)提交代码,推送到master
[root@gitlab monitor]# git commit -am "模拟开发测试"
[root@gitlab monitor]# git push -u origin master 
4)在Jenkins页面点击立即构建(会去gitlab上拉取最新的代码)
5)刷新10.0.0.7网站,查看变化

在这里插入图片描述

3.5 jenkins自动触发构建
3.5.1 构建触发器
token:23b30c25f816f78930d7a9135b4baa27

在这里插入图片描述

3.5.2 gitlab配置钩子密钥码

在这里插入图片描述

3.5.3 测试jenkins自动触发构建
1)修改代码内容,观察不同
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">Auto trigger build</a>
2)提交代码,推送到master
[root@gitlab monitor]# git commit -am "自动触发构建"
[root@gitlab monitor]# git push -u origin master 
3)刷新10.0.0.7网站,查看变化

在这里插入图片描述

4. 优化自动代码上线

4.1 将上线结果反馈到gitlab
4.1.1在gitlab上生成token

在这里插入图片描述
在这里插入图片描述
Access Tokens:yQdRA_WD_y5epKGfFPi7

4.1.2 在Jenkins上配置token

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

4.1.3 my-freestyle-job项目配置api token

在这里插入图片描述

4.1.4 测试结果有没有反馈到gitlab上
1)修改代码内容,观察不同
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">Result feedback to gitlab</a>
2)提交代码,推送到master
[root@gitlab monitor]# git commit -am "结果反馈到gitlab"
[root@gitlab monitor]# git push -u origin master
3)刷新10.0.0.7网站,查看变化
4)在gitlab出现v1.1和对号

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

4.2 避免重复执行
4.2.1 修改脚本
#当前提交的==提交过的
"$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" 
[root@jenkins scripts]# cat deploy.sh
#!/bin/sh
code_dir=/var/lib/jenkins/workspace/my-freestyle-job
web_dir=/usr/share/nginx/
time=`date +%F-%H-%M-%S`
ip=10.0.0.7
code_tar(){
    cd $code_dir && tar zcf /opt/$time-web.tar.gz  ./*
}

scp_code(){
    ssh $ip "mkdir $web_dir/$time-web"
    scp /opt/$timeweb.tar.gz $ip:$web_dir/$time-web
}

tar_xf(){
    ssh $ip  "cd $web_dir/$time-web && tar xf $time-web.tar.gz && rm -f $time-web.tar.gz"
}

ln(){
    ssh &ip "cd $web_dir && rm -rf html && ln -s $time-web html"
}

main(){
	code_tar
	scp_code
	tar_xf
	ln
}
if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then
        echo "当前版本已提交过,不允许重复构建"
        exit
else
        main
fi
4.2.2 在jenkins点击立即构建查看输出结果

在这里插入图片描述

4.2.3 提交新版本测试
1)修改代码内容,观察不同
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">Optimize scripts</a>
2)提交代码,推送到master
[root@gitlab monitor]# git commit -am "优化脚本"
[root@gitlab monitor]# git push -u origin master
3)刷新10.0.0.7网站,查看变化
4)在jenkins查看输出结果

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

5. Jenkins实现一键化升级回滚

5.1 在gitlab服务器上打标签
1.更改代码,提交
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">tag v1.1</a>
[root@gitlab monitor]# git commit -am "优化脚本"
2.打标签
[root@gitlab monitor]# git tag -a v1.1  -m "v1.1稳定版"
3.查看标签
[root@gitlab monitor]# git tag
4.推送到gitlab
[root@gitlab monitor]# git push -u origin v1.1

在这里插入图片描述

5.2 创建项目

在这里插入图片描述

5.3 配置

配置脚本

[root@jenkins ~]# cat /server/scripts/deploy_rollback.sh
#!/bin/sh
CODE_DIR="$WORKSPACE"
WEB_DIR="/usr/share/nginx/"

get_code_tar(){
        cd $CODE_DIR && tar zcf /opt/web-${git_version}.tar.gz ./*
}

scp_code_web(){
        scp /opt/web-${git_version}.tar.gz 10.0.0.7:$WEB_DIR
}

code_tarxf(){
        ssh 10.0.0.7 "cd $WEB_DIR && mkdir web-${git_version} && tar xf web-${git_version}.tar.gz -C web-${git_version} && rm -f web-${git_version}.tar.gz"

}
ln_html(){
         ssh 10.0.0.7 "cd $WEB_DIR && rm -rf html && ln -s web-$git_version html"
}

main(){

        get_code_tar;
        scp_code_web;
        code_tarxf;
        ln_html;
}
if [ "$deploy_env" == "deploy" ];then
	if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then
    		echo "当前版本已提交过,不允许重复构建"
    		exit
	else
    		main
	fi
elif [ "$deploy_env" == "rollback"  ];then
     ln_html
fi

添加选项参数升级和回滚
在这里插入图片描述

5.4 测试、查看结果

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

6. Jenkins页面tag打标签

6.1 创建项目

在这里插入图片描述

6.2 配置

在这里插入图片描述

6.3 测试
1.更改代码
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">tag v1.2</a>
2.提交
[root@gitlab monitor]# git commit -am "v1.2稳定版"
3.推送到gitlab
[root@gitlab monitor]# git push -u origin master

在这里插入图片描述
访问网站10.0.0.7
在这里插入图片描述

7. 测试使用版本号一键升级和回滚

7.1 一键升级
1.更改代码
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">tag v1.3</a>
2.提交
[root@gitlab monitor]# git commit -am "v1.3稳定版"
3.推送到gitlab
[root@gitlab monitor]# git push -u origin master

tag打标签
在这里插入图片描述
一键升级
在这里插入图片描述

7.2 秒级回滚

在这里插入图片描述

8. 微信通知

8.1 需要注册企业微信
8.2 上传脚本到jenkins
1. 上传jenkins_notify.py到jenkins服务器的/server/scripts下
[root@jenkins scripts]# cat /server/scripts/jenkins_notify.py 
#!/usr/bin/python2.7
#_*_coding:utf-8 _*_
 
 
import requests,sys,json
import urllib3
urllib3.disable_warnings()
 
reload(sys)
sys.setdefaultencoding('utf-8')
 
def GetToken(Corpid,Secret):
    Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    Data = {
        "corpid":Corpid,
        "corpsecret":Secret
    }
    r = requests.get(url=Url,params=Data,verify=False)
    Token = r.json()['access_token']
    return Token
 
def SendMessage(Token,Subject,Content, ProName):
    #Url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=%s" % Token
    Url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % Token
    #Data = {
    #    "chatid": "JenkinsAlarm",  # 此处不明白请参考企业微信官网
    #    "msgtype": "text",
    #    "text": {
    #        "content": "[项目名称] : " + ProName + '\n' + "[项目地址] : " + Subject + '\n' + Content + '\n'
    #    },
    #    "safe": "0"
    #}
    data = {
        "touser" : "KongDi",
        "msgtype" : "text",
        "agentid" : 1000002,
        "text" : {
           "content" : "[项目名称] : " + ProName + '\n' + "[项目地址] : " + Subject + '\n' + 
Content + '\n'
        },
        "safe":0
    }
    r = requests.post(url=Url,data=json.dumps(data),verify=False)
    return r.text
 
def action_from_file(filename):
    try:
        str1 = '[变更日志] : '
        with open(filename, 'r') as f:
            for i in f.readlines():
                str1 += i
		print str1
        if len(str1) == 17:
            str1 += " 无变更"
	# print str1
        return str1
    except Exception as e:
        #print('[ERROR] {0}'.format(e))
	str1 += str(e)
 
 
if __name__ == '__main__':
    Corpid = "ww65c0801a4801a330"
    Secret = "eZDNZ0vIYEJtNENdoYNnHQ3-EHu6BkGXwZSzbKziUMs"
 
    Subject = sys.argv[1]
    Content = action_from_file(sys.argv[2])
    ProName = sys.argv[3]
 
    Token = GetToken(Corpid, Secret)
    Status = SendMessage(Token,Subject,Content,ProName)
    print Status
2. 注意点
[root@jenkins scripts]# vim jenkins_notify.py
33	    data = {
34	        "touser" : "KongDi",
35	        "msgtype" : "text",
36	        "agentid" : 1000002,
62	if __name__ == '__main__':
63	    Corpid = "ww65c0801a4801a330"  #企业id
64	    Secret = "eZDNZ0vIYEJtNENdoYNnHQ3-EHu6BkGXwZSzbKziUMs"
8.3 完成后配置jenkins(发送信息的格式)
Entry Format中添加 %3$s(at %4$s via %1$s),参数分别为ChangeLog内容,时间,提交人。
Date Format中添加 yyyy-MM-dd HH:mm:ss 就是时间格式。

在这里插入图片描述

1.如果没有此选择请安装Hudson Post build task插件,SCM_CHANGELOG须安装changelog插件,上传py脚本到
2.jenkins服务器上安装python requests模块
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@jenkins ~]# yum -y install python-pip
[root@jenkins ~]# pip2.7 install requests
8.4 测试
8.4.1 推送代码到
1)修改代码内容,观察不同
[root@gitlab ~]# cd monitor/
[root@gitlab monitor]# vim index.html  #更改43行首页显示的内容
<a class="logo pull-left" href="index.html" style="width: 233px">v1.5 Send wechat to didi</a>
2)提交代码,推送到master
[root@gitlab monitor]# git commit -am "发送微信给didi"
[root@gitlab monitor]# git push -u origin master

在这里插入图片描述

8.4.2 打标签

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值