自动化运维之DevOps
DevOps(英文Development(开发)和Operations(技术运营)的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作
简单的来说DevOps是一种文化,是让开发、运维、测试
能够之间沟通和交流
自动化运维工具:saltstack、jenkins、等。因为他们的目标一样,为了我们的软件、构建、测试、发布更加的敏捷、频繁、可靠.
如果运维对git不熟,是无法做自动化部署。git常用命令总结
一、持续集成组件简介
Jenkins 介绍
Jenkins只是一个平台,真正运作的都是插件
。这就是jenkins流行的原因,因为jenkins什么插件都有,Hudson是Jenkins的前身,是基于Java开发的一种持续集成工具,用于监控程序重复的工作,Hudson后来被收购,成为商业版。后来创始人又写了一个jenkins,jenkins在功能上远远超过hudson
Jenkins官网:https://jenkins.io/
Gitlab 介绍
GitLab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。
GitLab拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
gitlab官网:https://about.gitlab.com/
gitlab服务器配置: 建议2c4G
上面介绍了持续集成及Devops的基础内容,下面是安装部署
二、jenkins+gitlab 快速部署
三、持续集成之实战
环境介绍
服务器系统 | IP | 主机名 | 配置 |
---|---|---|---|
CentOS7.2 x86_64 | 192.168.56.11 | Jenkins | 2c4G |
CentOS7.2 x86_64 | 192.168.56.13 | Gitlab | 2c4G |
Jenkins所需插件
Gitlab Hook # gitlab钩子,push代码后自动触发拉取操作
Publish Over SSH # scp拷贝插件 (主要是将包拷贝到web服务器上)
Build Authorization # 钩子触发器
操作步骤:
- 配置 jenkins(构建)
- gitlab与jenkins结合,添加认证(公私秘钥)
- 建立git仓库
- 立即构建
1,配置 jenkins(构建)
192.168.56.13 gitlab.example.com
# 添加gitlab hosts解析 方便使用
添加项目
General选项配置
2, gitlab与jenkins结合
1)源码管理
gitlab所以安装git
插件即可
我们将git路径
存在这里还需要权限认证,否则会出现error
2)添加一个认证
选择一下认证方式(我们可以在系统管理-->凭证配置)里面进行设置
#提示:gitlab有一个key,是我们用来做仓库的key。拥有的权限是read-only。
公钥我们需要在服务器上查看。
创建密钥对
#在 jenkins 192.168.56.11 部署的节点上,生成key
[root@jenkins ~]# ssh-keygen -t rsa #一路回车即可
[root@jenkins ~]# cat ./.ssh/id_rsa.pub #将下面公钥复制到gitlab中
[root@localhost yum.repos.d]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwhIZaDONVtREp/HACvJg/c/Iau1Bxkij0/f/PSTUOEjcjDe+MoIT/oPfKbY5es8vN1UTlOjTRRm6fr7ftZSRCPX2nTO8f/F6d1dh5mfP+YTZ9CBFnAeuaxuHjC1HjEdY3Zz/UkcBAymv9NLwMYap6mLT+DUy793yDMZ96snubKjApCKWdoRRBQezSCZAU7FiuSdmjOEWScyx6QY3BKryZ4Wet+3anU1y1c7C2W0vHsPFrT/vtMfU20pAATxv6fb8fCVb9qL83uVPF8JMtnbKaVM26yG2MmXWhg6VP1LhUnx8/ptpYLlcURW9tb84gXu16fBlsHoqOvaMrxDVwI0yX root@localhost.localdomain
我们设置完成后测试git是否可以拉去
yum install git -y
#如果没有git命令就安装一个git客户端
root@localhost home]# git clone git@gitlab.example.com:root/dgstack-demo.git
正克隆到 'dgstack-demo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
接收对象中: 100% (3/3), done.
[root@localhost home]# ll
总用量 0
drwxr-xr-x. 3 root root 35 2月 18 18:08 dgstack-demo
命令行测试成功后,配置jenkins
[root@localhost home]# cat /root/.ssh/id_rsa #查看私钥
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAsISGWgzjVbURKfxwAryYP3PyGrtQcZIo9P3/z0k1DhI3Iw3v
jKCE/6D3ym2OXrPLzdVE5To00UZun6+37WUkQj19p0zvH/xendXYeZnz/mE2fQgR
ZwHrmsbh4wtR4xHWN2c/1JHAQMpr/TS8DGGqepi0/g1Mu/d8gzGferJ7myowKQil
naEUQUHs0gmQFOxYrknZozhFknMsekGNwSq8meFnrft2p1NctXOwtltLx7Dxa0/7
7TH1NtKQAE8b+n2/HwlW/ai/N7lTxfCTLZ2ymlTNushtjJl1oYOlT9S4VJ8fP6ba
WC5XFEVvbW/OIF7tenwZbB6Kjr2jK8Q1cCNMlwIDAQABAoIBAEs7cHeY3pt83J/k
c2j3MHx60kkKZLLC9KnWR9z0+qPQp6dNHTf2gjjhRjsEjpVWVBqaNw7ry+8V8bgl
kGKhpN6GjrNrWs9rJHho2Cabsx5MGIkZkzEv5FbHRScbf/8jbwWV/+J9bE8w9u2o
OC2ewqYVx64vxPCn/m18DNiikYQDtTsqYMHpE8AUxrfubZYmRE9apHmXAAJwI8+C
zRDQwqFG79tRJxgGSCMdWXl9Sh/e6Eox+3E8LweeO/7YKiMrabpg4lsLLy1UWfnZ
C6QXtVFjh/pcWd3kPiwPySzE81unyt7Dt4k4hUnlwV0T+xHKXQ7D2WEhkKFTSKLj
MTdTm8ECgYEA560TXdFGw/zMAaYPQ/PGW6KR1Pen+fYhlqCmxXldMcaYuYdFq+Ex
APeD24D/63IMV0UMrgwq8YYTfXtxD8VFc7zwjem9AYyRlBpHd8GfCPSsga3mGcTh
RR7v+8ayeeBbEe7pN4vnJZDBrfXkO2m0kFscE4j7G0WsP7ZyfPGUuA8CgYEAwwzq
y9i6KlmSfPbF2+gRxBjjuBWXLECz7L0PEGUmtKLgs2jffVYWVQ6ThDMPBB9zCSWx
MoA15pV1m7qu93bT8lGJ/Hn4L2J2PsCQ5cb0kXDukAnD0tyF9s2/3Qndpqye6P+D
njTxdVA8RkxrkTG4tWP+wu+vm7EASWjRz7bJWvkCgYBPOjUBRGw64dyyQ6O8zUTs
WXAdsIPVS4K5DD98EMD6ILxh1gzRdrVXa03AZyEd12a5AXgQnUCiUAOiSfCkQAY8
SkTJg0GLohK23zXJkoFcgq/ruRiTf2y6QpY3OAAZBcyfGWDQChwGELbrUse2ObPy
GfZEB/g3n2AEedQ1PjhpqQKBgFjwvvAM93bwOTf6XuaTv+YnY09BqRlot6Kv4vqa
5TdhPg0ROTex1aUbbHDPx30dyhrVsSNSC0IFzQch7T6yVJseS0lxZJZW04xxyqC8
RDE9ycqsaTrxi7SqxV5JbWTfOecM/Dtb8O6Jk7KKjlI61fsAid7h5LWd1H+k6GdK
9i4hAoGAINeF1+R6l+BwA63hpW5a0nuxWpn/k53mtE5rDeX1MaZ54qOzSdSZTwuT
kzY1HJxw+w20bRJKq3FOrlNr+rmyEKFGJ0AAvb/LiPLtRLtEuy1CkyYa6eUddBM9
5+I9ep2id8yJAGoP9UUAmdxkjwh0HMe82is9A/jWnY9feFSoGY4=
-----END RSA PRIVATE KEY-----
返回刚刚的区域,继续配置,检查报错是否解除
查看gitlab版本
[root@node03 ~]# rpm -qa|grep gitlab
gitlab-ce-11.7.5-ce.0.el7.x86_64
现在保存就可以了!
保存
完毕后,我们选择立即构建
点击Console Output
可以显示控制台的输出
基本构建成功。
四、自动化部署上线【git钩子】
上面简单的Jenkins + gitlab集成后,实现的功能是 开发写好代码提交至gitlab上,接下来我们要实现,开发push到gitlab上之后,jenkins自动
帮我们立即构建
。
这个项目我们需要安装一个gitlab钩子
的脚本,使用Gitlab Hook Plugin
插件来完成.
1、安装 gitlab hook 插件
安装完插件之后我们就开始配置钩子脚本
2、安装 Build Aut插件 【管理使用】
插件搜索:Build Aut
为了令牌的安全性,我们使用openssl生成一个
[root@jenkins ~]# openssl rand -hex 10
9d3003d715b2455bdaca
3、配置构建触发器 【钩子】
然后我们点击保存即可
因为jenkins上也提示我们需要在gitlab上添加钩子脚本
如果看不到
Build when a change is pushed to GitLab
选项,请安装依赖插件
git-plugin
gitlab-hook-plugin
gitlab-plugin
以上三个插件都安装
好了,就能看到Build when a change is pushed to GitLab
选项了
4、gitlab 配置
点击我们创建的项目
选中Webhooks 或 system hooks
Build Authorization Token Root Plugin 插件使用说明
https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin
使用Build插件后,url如下:
http://192.168.56.11:8080/buildByToken/build?job=dgstack-demo&token=9d3003d715b2455bdaca
dgstack-demo=项目名称(构建时的项目名称)
9d3003d715b2455bdaca=jenkins填写的令牌
然后点击Add syshook
下方就会出现我们这个选项,我们点击Test
进行测试
5、自动化部署验证
向git服务器提交代码,验证是否可以自动部署:
[root@jenkins dgstack-demo]# echo "www.dgstack.cn 邱月涛" > index.html
[root@jenkins dgstack-demo]# git add index.html
[root@jenkins dgstack-demo]# git config --global user.email "qiuyt@yilonghc.com"
[root@jenkins dgstack-demo]# git config --global user.name "Qyt"
[root@jenkins dgstack-demo]# git commit -m "test"
[root@jenkins dgstack-demo]# git push origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitlab.example.com:root/dgstack-demo.git
bf73887..6a651df master -> master
jenkins服务器的日志记录:
[root@jenkins dgstack-demo]# tail -f /var/log/jenkins/jenkins.log
jenkins项目构建:
在去jenkins工作目录,查看代码是否更新。(后面在用ssh 将数据拷贝到注定的目录下就完成自动化上线)
五、项目案例 (基于ssh插件)
上面已经完成push自动化上线,但是没有同步到项目下,我们使用ssh插件
来进行项目的自动化部署
系统管理 > 系统设置 > Publish over SSH
我这里使用用户名密码进行操作
测试成功
,点击保存
。
项目演示
web项目主机:192.168.56.13
web项目目录:/home/webs/dgstack-demo
项目目的:当开发在本地push后,自动将代码上线到web项目上。
构建后配置 (ssh)
Name :这里是自定义的ssh远程服务器,如果有多台,点击add post-build step 继续添加
Source files :这里直接写文件名即可,如果全部同步 可以写* (与其它项目同名文件不冲突)
Remove prefix :这里指的是忽略前面的 target/ 远程服务器直接显示就是xx.war
Remote directory :远程服务器要保存的文件目录,优先级低于系统ssh认证里的远程路径
Exec command :这里直接写 bash 脚本名称 xx.sh 这里也是远程服务器的脚本
排除文件(比如.env .md说明文件 )
自动化上线整体流程
gitlab配置Jenkins钩子是需要有人push代码,现在我们push代码进行测试
[root@jenkins dgstack-demo]# echo "逗哥架构师之路" >1.log
[root@jenkins dgstack-demo]# git add 1.log
[root@jenkins dgstack-demo]# git commit -m "init"
[root@jenkins dgstack-demo]# git push origin master
六、项目回滚
我们已java为例,总体想法,就是在maven打包后,把war包进行备份,并按照构建历史的版本号命令(区分多个版本),然后上线,如果需要回滚,可以根据版本号,回滚war包到指定版本即可。
6.1 建立任务,并添加参数化构建
6.2 添加shell命令
## 备份shell(第一段)
case $Status in
Deploy)
echo "Status:$Status"
path="${WORKSPACE}/bak/${BUILD_NUMBER}" #创建每次要备份的目录
if [ -d $path ];
then
echo "The files is already exists "
else
mkdir -p $path
fi
\cp -f ${WORKSPACE}/target/*.war $path #将打包好的war包备份到相应目录,覆盖已存在的目标
echo "Completing!"
;;
RollBack)
echo "Status:$Status"
echo "Version:$Version"
cd ${WORKSPACE}/bak/$Version #进入备份目录
\cp -f *.war ${WORKSPACE}/target/ #将备份拷贝到程序打包目录中,并覆盖之前的war包
;;
*)
exit
;;
esac
由于服务器硬盘有限,所以我会定期清除
清除备份文件
FileDir=${WORKSPACE}/bak/
date=$(date "+%Y%m%d-%H%M%S")
cd $FileDir #进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l) #当前有几个文件夹,即几个备份
if [ $FileNum -gt 5 ];
then
num=`expr $FileNum - 5`
files=`ls -tr | head -n $num`
echo $files |xargs rm -rf
echo "保留5个备份,删除早期备份: " $files
fi
6.2 拟写上线脚本,添加到 ssh-shell里
#!/bin/bash
##############################################################
# File Name: check_log.sh
# Version: V1.0
# Author: yuetao qiu
# Organization:http://www.dgstack.cn
# Created Time : 2019-06-16 12:32:57
##############################################################
export JAVA_HOME=/usr/local/src/jdk1.7.0_45
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export BUILD_ID=dontkillme
LOG= /server/scripts/jenkins_activity.log #精确到秒,避免单日多次上线覆盖最初的包
DATE=`date +%F-%H-%M`
SDIR=FuQin-Activity-Manage-online #jenkins job名
DDIR=fuqin-activity-1.0.1 #包名
cd /workspace/activity-manage/webapps/activity-manage
unzip -o $DDIR.war
\cp /workspace/activity-manage/webapps/activity-manage/WEB-INF/config.xml.bak /workspace/activity-manage/webapps/activity-manage/WEB-INF/config.xml
if [ $? -eq 0 ];then
echo “$DDIR.war更新成功,正在进行构建”
sh /server/scripts/activity-manage.sh restart
if [ $? -eq 0 ];then
echo -e "\033[32m $DDIR.war上线成功 \033[0m"
else
echo -e "\033[31m $DDIR.war上线失败 \033[0m"
fi
else
echo “$DDIR.war解压失败。。。。”
exit
tomcat 启动脚本
#!/bin/bash
# description: Tomcat is a Java Servlet Container
. /etc/profile
TOMCAT_HOME=/workspace/activity-manage #更换成你的项目目录
start () {
TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |egrep -v "grep|vim|tailf" |awk '{print $2}'`
if [ -z $TOMCAT_PID ];then
/bin/bash $TOMCAT_HOME/bin/startup.sh
else
echo "$0 is running"
fi
}
stop () {
TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |egrep -v "grep|vim|tailf" |awk '{print $2}'`
if [ -z $TOMCAT_PID ];then
echo "$0 is not running"
else
echo "shutting down $0"
kill -9 "$TOMCAT_PID" && echo "PID $TOMCAT_PID killed."
fi
}
status () {
TOMCAT_PID=`ps -ef |grep "$TOMCAT_HOME" |egrep -v "grep|vim|tailf" |awk '{print $2}'`
if [ -z $TOMCAT_PID ];then
echo "$0 is not running"
else
echo "$0 is running PID is $TOMCAT_PID"
fi
}
case $1 in
start)
start
#tail -f $TOMCAT_HOME/logs/catalina.out
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
#tail -f $TOMCAT_HOME/logs/catalina.out
;;
*)
echo "Usage:$0 {start|stop|status|restart}."
;;
esac
6.3 验证
到此为止,完成上线。
- QQ精品交流群
-
- 微信公众号
-
2019年2月20日 下午7:22 沙发
真心觉得不错,总结的到位,很细致😜😜😜
2019年2月21日 上午9:37 1层
@朋友圈 非常感谢,欢迎转发,阅读,感兴趣可以加入QQ群共同学习
2019年10月25日 下午6:28 板凳
配置钩子需要提前确认git-plugin/gitlab-hook-plugin/gitlab-plugin三个插件都安装好了,就能看到Build when a change is pushed to GitLab选项了,今天试了多遍
2019年10月28日 上午11:50 1层
@pingping 感谢,评论,我总结的内容确实忽略了此,问题,稍后加上。。。。