devops

DevOps简介

DevOps 是Development和Operations的组合,也就是开发和运维的简写。
DevOps 是针对企业中的研发人员、运维人员和测试人员的工作理念,是他们在应用开发、代码部署和质量测试等整条生命周期中协作和沟通的最佳实践,DevOps 强调整个组织的合作以及交付和基础设施变更的自动化、从而实现持续集成、持续部署和持续交付。
DevOps 四大平台:代码托管(gitlab/svn)、项目管理(jira)、运维平台(腾讯蓝鲸/开源平台)、持续交付(Jenkins/gitlab)

持续集成(CI-Continuous integration):持续集成是指多名开发者在开发不同功能代码的过程当中,可以频繁的将代码行合并到一起并切相互不影响工作。

持续部署(CD-continuous deployment):是基于某种工具或平台实现代码自动化的构建、测试和部署到线上环境以实现交付高质量的产品,持续部署在某种程度上代表了一个开发团队的更新迭代速率。

持续交付(Continuous Delivery):持续交付是在持续部署的基础之上,将产品交付到线上环境,因此持续交付是产品价值的一种交付,是产品价值的一种盈利的实现。

Gitlab部署与使用

github:开源代码托管网站。
gitlab:应用软件。
git:命令行客户端。

如果是最小化安装的系统,需要做如下初始化配置:

1
2
3
4
5
6
7
~]# yum install vim gcc gcc-c++ wget net-tools lrzsz iotop lsof iotop bash-completion -y
~]# yum install curl policycoreutils openssh-server openssh-clients postfix -y
~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
~]# systemctl disable firewalld
~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/sysconfig/selinux
~]# hostnamectl set-hostname gitlab.example.com
~]# reboot

安装包下载:https://packages.gitlab.com/gitlab/gitlab-ce
rpm包国内下载地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/

安装gitlab

1
~]# yum -y install gitlab-ce-11.6.5-ce.0.el7.x86_64.rpm

配置gitlab

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@gitlab tools]# grep "^[a-Z]" /etc/gitlab/gitlab.rb 
#暴露url
external_url 'http://192.168.34.101'
#开启邮件通知功能
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "miaoshengqin_tec@163.com"
gitlab_rails['smtp_password'] = "msq137226"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = :login
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['gitlab_email_from'] = "miaoshengqin_tec@163.com"
user["git_user_email"] = "miaoshengqin_tec@163.com"

初始化gitlab

1
2
3
4
~]# gitlab-ctl  reconfigure #修改完配置文件要执行此操作
~]# gitlab-ctl start
~]# gitlab-ctl stop
~]# gitlab-ctl restar

gitlab重设密码的机制:服务器向客户端发送临时token,session里面会包含token。

关闭注册功能:admin area –> settings –> general –> Sign-up restrictions

git常用命令及web环境准备

git常用命令
下载项目:git clone URL
将项目放入本地仓库: git add name
将项目推送到远程仓库:git commit -m “TAG”

git config --global user.name “name“ #设置全局用户名 
git config --global user.email xxx@xx.com #设置全局邮箱
git config --global –list #列出用户全局设置
git add index.html / . #添加指定文件、目录或当前目录下所有数据到暂存区
git commit -m “11“ #提交文件到工作区
git status #查看工作区的状态
git push #提交代码到服务器
git pull #获取代码到本地,更新。
git log #查看操作日志
vim .gitignore #定义忽略文件
git reset --hard HEAD^^ #git版本回滚, HEAD为当前版本,加一个^为上一个,^^为上上一个版本
git reflog # #获取每次提交的ID,可以使用--hard根据提交的ID进行版本回退
git reset --hard 5ae4b06 #回退到指定id的版本
# git branch #查看当前所处的分支
#git checkout  -b develop #创建并切换到一个新分支
#git checkout   develop #切换分支

准备web环境

Jenkins安装使用

安装Jenkins需要先准备jdk环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
root@jenkins:/usr/local/src# tar xvf jdk-8u181-linux-x64.tar.gz
root@jenkins:/usr/local/src# ln -sv /usr/local/src/jdk1.8.0_181/ /usr/local/jdk

root@jenkins:/usr/local/src# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

root@jenkins:/usr/local/src# source /etc/profile
root@jenkins:/usr/local/src# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

启动Jenkins:
通过jar包直接启动Jenkins

1
2
3
4
5
6
7
 java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="172.20.101.136 " \
-jar jenkins-2.138.4-1.1.noarch.war &

rpm包安装Jenkins

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@s1 ~]# grep -v "#" /etc/sysconfig/jenkins  | grep -v "^$"
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="172.20.101.136" \
"
JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_ARGS=""

安装插件:jenkins–>插件管理–>可选插件,搜索gitlab和Blue Ocean

配置Jenkins权限管理:
基于角色的权限管理,先创建角色和用户,给角色授权,然后把用户关联到角色,需安装Role-based Authorization Strategy。
创建新的用户:jenkins–>系统管理–>管理用户–>新建用户
更改认证方式:jenkins–>系统管理–>全局安全配置;默认创建的用户登陆后可以做任何操作,取决于默认的认证授权方式。

Jenkins邮箱设置

  • 生成邮箱登录授权码
  • 配置Jenkins管理员邮箱

    jenkins–>系统管理–>系统设置

基于ssh key拉取代码

在centos上使用ssh-keygen生成key,将公钥放在gitlab上:点登录用户下拉箭头–>settings–>ssh keys。在本机测试成功后即可。
然后配置Jenkins自动拉取代码:jekins–>凭据–>jenkins–>全局凭据–>添加凭据。将对应于gitlab上公钥的私钥防止在Jenkins上。

pipline

pipline是帮助Jenkins实现CI到CD转变的重要角色,是运行在jenkins 2.X版本的核心插件,简单来说Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本。
pipline的优势

  • 可持续性:jenkins的重启或者中断后不影响已经执行的Pipline Job
  • 支持暂停:pipline可以选择停止并等待人工输入或批准后再继续执行。
  • 可扩展:通过groovy的编程更容易的扩展插件。
  • 并行执行:通过groovy脚本可以实现step,stage间的并行执行,和更复杂的相互依赖关系。

pipline语法:

  • Stage:阶段,一个pipline可以划分为若干个stage,每个stage都是一个操作,比如clone代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个node执行。
  • Node:节点,每个node都是一个jenkins节点,可以是jenkins master也可以是jenkins agent,node是执行step的具体服务器。
  • Step:步骤,step是jenkins pipline最基本的操作单元,从在服务器创建目录到构建容器镜像,由各类
    Jenkins 插件提供实现,例如: sh “make”

pipline使用示例
使用Jenkins的pipline一键更新代码脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
node("slave-node01"){
stage("code clone"){
echo "git clone"
sh "rm -rf /data/jenkins/slave/workspace/pipline-test/*"
git credentialsId: '5f3240fc-dd35-4e89-90e5-d1091577d671', url: 'git@172.20.101.98:group1/project1.git'
sh "cd /data/jenkins/slave/workspace/pipline-test && zip -r code.zip ./*"
}
stage("code build"){
echo "code copy"
sh "cd /data/jenkins/slave/workspace/pipline-test && scp code.zip node01:/apps/tomcat/webapps/ROOT/code.zip && ssh node01 'chown tomcat.tomcat /apps/tomcat/webapps/ROOT/code.zip'"
sh "cd /data/jenkins/slave/workspace/pipline-test && scp code.zip node02:/apps/tomcat/webapps/ROOT/code.zip && ssh node02 'chown tomcat.tomcat /apps/tomcat/webapps/ROOT/code.zip'"
}
stage("stop service"){
echo "stop service"
sh "ssh node01 'pkill java && unzip /apps/tomcat/webapps/ROOT/code.zip -d /apps/tomcat/webapps/ROOT'"
sh "ssh node02 'pkill java && unzip /apps/tomcat/webapps/ROOT/code.zip -d /apps/tomcat/webapps/ROOT'"
}
stage("start service"){
echo "satrt service"
sh "ssh node01 '/apps/tomcat/bin/catalina.sh start'"
sh "ssh node02 '/apps/tomcat/bin/catalina.sh start'"
}
}

自动化部署tomcat脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/bash
# #########################################################
# Tomcat init script for 铁大电信####
###########################################################
# chkconfig: 2345 96 14 ###################################
# description: 2016/11/1. 苗圣钦##########################
# #########################################################

JDK_HOME=/apps/jdk1.7.0_79
CATALINA_HOME=/apps/tomcat
export JDK_HOME CATALINA_HOME
source /etc/profile
#PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
#NUM=`ps -ef | grep -v grep | grep java | awk '{print $2}' | wc -l`

#case $1 in
start() {
echo "正在判断服务状态,请稍等!"
echo "请稍等3秒钟"
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
if netstat -an | grep 8080 | grep LISTEN >/dev/null
then
echo "Tomcat已经正在运行了!"
else
echo "Tomcat没有运行,1秒后启动!"
echo 1;sleep 1
$CATALINA_HOME/bin/catalina.sh start
echo "Tomcat 已经成功启动完成,5秒后判断是否启动成功"
echo "5";sleep 1;echo "4";sleep 1
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
if netstat -an | grep 8080 | grep LISTEN >/dev/null
then
PID=`ps -ef | grep tomcat | grep jdk | awk '{print $2}'`
NUM=`ps -ef | grep tomcat | grep jdk | awk '{print $2}' | wc -l`
echo "Tomcat 已经成功启动${NUM} 个Tomcat进程!,PID为${PID}"
else
echo "Tomcat启动失败,请重新启动!"
echo 1
fi
fi
}
stop() {
PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
NUM=`ps -ef | grep -v "color" | grep tomcat | awk '{print $2}' | wc -l`
echo "正在判断服务状态,请稍等3秒钟!"
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
if netstat -an | grep 8080 | grep LISTEN >/dev/null
then
echo "Tomcat运行中,1秒后关闭!"
echo 1;sleep 1
echo "即将关闭Tomcat服务,请稍等!"
$CATALINA_HOME/bin/catalina.sh stop ;echo "已经执行关闭命令,正在检查关闭了多少Tomcat进程,请稍等30秒钟!"
sleep 27
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
pkill java && pkill tomcat
if netstat -an | grep 8080 | grep LISTEN >/dev/null;then
PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
NUM=`ps -ef | grep -v "color" | grep tomcat | awk '{print $2}' | wc -l`
kill -9 $PID ;echo "已成功关闭${NUM} 个tomcat进程"
else
echo "Tomcat 已经关闭完成!"
echo "3";sleep 1;echo "2";sleep 1;echo "1";sleep 1
fi
else
echo "Tomcat 没有运行"
echo 1
fi
if netstat -an | grep 8080 | grep LISTEN >/dev/null;then
PID=`ps -ef | grep -v grep | grep java | awk '{print $2}'`
#NUM=`ps -ef | grep -v "color" | grep tomcat | awk '{print $2}' | wc -l`
echo "关闭失败,即将强制删除tomcat进程!"
sleep 2
pkill tomcat ;sleep 2
if netstat -an | grep 8080 | grep LISTEN >/dev/null;then
echo "强制关闭失败,即将再次强制删除tomcat进程!"
pkill java; sleep 2
fi
fi
}
restart() {
stop
start
}

case "$1" in
start)
start
;;

stop)
stop
;;

restart)
restart
;;

*)
echo $"Usage: $0 {start|stop|restart|status}"
esac

SonarQube

SonarQube 是一个用于代码质量管理的开放平台,通过插件机制,SonarQube 可以集成不同的测试工具,代码分析工具,以及持续集成工具。与持续集成工具(例如Hudson/Jenkins 等)不同,SonarQube并不是简单地把不同的代码检查工具结果(例如FindBugs,PMD等)直接显示在Web页面上,而是通过不同的插件对这些结果进行再 加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时Sonar还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用SonarQube,此外,SonarQube的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持。

安装数据库
数据库要使用5.6版本,不支持5.5的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
~]# yum install vim gcc gcc-c++ wget autoconf  net-tools lrzsz iotop lsof iotop bash-completion curl policycoreutils openssh-server openssh-clients postfix -y
~]# cd mysql-5.6.42-linux-glibc2.12-x86_64
~]# ln -sv /usr/local/src/mysql-5.6.42-linux-glibc2.12-x86_64 /usr/local/mysql
~]# useradd mysql -s /sbin/nologin
~]# chown mysql.mysql /usr/local/mysql/ -R
~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql/
~]# cp /usr/local/src/mysql-5.6.42-linux-glibc2.12-x86_64/support-files/mysql.server /etc/init.d/mysqld
~]# cp my.cnf /etc/my.cnf
~]# chmod a+x /etc/init.d/mysqld
~]# /etc/init.d/mysqld start
~]# ln -sv /usr/local/mysql/bin/* /usr/bin/
~]# mkdir /var/lib/mysql
~]# ln -sv /data/mysql/mysql.sock /var/lib/mysql/

安装sonarqube
下载安装包,安装并修改配置:

1
2
3
4
5
6
[root@host-10-10-10-9 sonarqube]# grep "^[a-Z]" /usr/local/src/sonarqube/conf/sonar.properties 
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar
sonar.web.host=0.0.0.0
sonar.web.port=9000

部署扫描器 sonar-scanner

sonarqube通过调用扫描器sonar-scanner进行代码质量分析,即扫描器的具体工作就是扫描代码:
下载地址:http://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner

1
2
3
4
5
6
# unzip sonar-scanner-2.6.1.zip
# ln -sv /usr/local/src/sonar-scanner-2.6.1 /usr/local/sonar-scanner
# cd /usr/local/sonar-scanner/
# grep "^[a-Z]" conf/sonar-scanner.properties
sonar.host.url=http://localhost:8800
sonar.sourceEncoding=UTF-8

部署好之后,只需在代码所在目录下执行sonar-scanner命令即可进行扫描。

将sonarqube关联到Jenkins

首先安装插件,在Jenkins插件安装界面安装sonar插件SonarQubePlugin,其次配置Sonarqube server,系统管理–>系统设置,里面配置sonarqube servers:

  • name:给sonarqube起个名字
  • Server URL:sonarqube的地址

让Jenkins 关联到sonarqube scanner

添加扫描器:系统管理–>全局工具配置,里面有个sonarqube scanner

  • Name:给scanner起个名字
  • 然后点击自动安装或者协商sonarqube scanner命令的位置即可。

配置扫描

选择自己的项目(demo)–>配置–>execute sonarqube scanner,将配置文件的内容修改成如下格式填写完成后保存:

1
2
3
4
5
sonar.projectKey=YOUR-KEY
sonar.projectName=YOUR-NAME
sonar.projectVersion=YOUR-VERSION
sonar.sources=你的成文件所在的目录名
sonae.sourceEncoding=你程序的编码(UTF-8)

配置完成后点击构建。构建完成后再构建历史查看时,右上角会有个图标,点击即可前往sonarqube server上查看代码质量监测的结果。

构建的时候还可以执行自己设定的脚本,自定义进行扫描:

代码自动部署流程:
clone代码–>代码扫描–>tar/zip–>从负载均衡摘除后端web服务器–>停止web服务–>同步代码–>启动web服务–>访问测试–>从负载均衡上线服务器