DevOps介绍
软件开发最开始是由两个团队组成:
- 开发计划由开发团队从头开始设计和整体系统的构建。需要系统不停的迭代更新。
- 运维团队将开发团队的code进行测试后部署上线。希望系统稳定安全运行。
这看似两个目标不同的团队需要协同完成一个软件的开发。
在开发团队指定好计划并完成coding后,需要提供到运维团队。
运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。
这时开发团队需要经常等待运维团队的反馈。这无疑延长了事件并推迟了整个软件开发的周期。
会有一种方式,在开发团队等待的时候,让开发团队转移到下一个项目中。等待运维团队为之前的代码提供反馈。可是这样就意味着一个完整的项目需要一个更长的周期才可以开发出最终代码。
基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。
那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DexQp5s。
DexOps,字面意思是Development &Operations的缩写,也就是开发&运维。
DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。核心就在于简化Dev和ops团队之间的流程,使整体软件开发过程更快速。
整体的软件开发流程包括:
- PLAN:开发团队根据客户的目标制定开发计划
- CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。
- BUILD:编码完成后,需要将代码构建并且运行。
- TEST:成功构建项目后,需要测试代码是否存在BUG或错误。
- DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
- OPERATE:运维团队将代码部署到生产环境中。
- MONITOR:项目部署上线后,需要持续的监控产品。
- INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DexOps的核心,即持续集成、持续部署。
安装与配置
安装gitlab
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm #下载rpm包yum -y install policycoreutils openssh-server openssh-clients postfix policycoreutils-python #安装依赖rpm -ivh gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm #rpm安装vim /etc/gitlab/gitlab.rb #进入配置文件external_url 'http://192.168.218.100:82'nginx['listen_port'] = 82gitlab-ctl reconfigure #根据配置文件启动gitlab-ctl restart #重启
安装maven和jdk
tar -zxf apache-maven-3.8.5-bin.tar.gz -C /usr/local/mv /usr/local/apache-maven-3.8.5 /usr/local/apache-maventar -zxf jdk-8u301-linux-x64.tar.gz -C /usr/localmv /usr/local/jdk1.8-301 /usr/local/jdk1.8
配置maven
vim /usr/local/apache-maven/conf/settings.xml #修改配置文件<!-- mirrors #额外添加镜像<mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>#配置jdk<profile><id>jdk-1.8</id><activation><activeByDefault>true</activeByDefault><jdk>1.8</jdk></activation><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion></properties></profile></profiles>#开启设置的jdk配置<activeProfiles><activeProfile>jdk-1.8</activeProfile></activeProfiles>
安装Docker与docker-compose
安装docker环境依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 #安装依赖yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #配置repoyum install docker-ce docker-ce-cli containerd.io -y #安装dockersystemctl start docker && systemctl enable docker #启动docker并设置开机自启yum makecache fast #索引缓存#设置内核vim /etc/sysctl.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1systcl -p#安装docker-composehttps://github/docker/compose/releases/tags #选择最新版#下载docker-compose-linux-x86_64chmod +x docker-compose-linux-x86_64 #设置权限mv docker-compose-linux-x86_64 /usr/bin/docker-compose #移动到bin文件夹下
安装jenkins
mkdir -p /usr/local/docker/jenkins #存放存储jenkinsmkdir -p /usr/local/docker/jenkins/data #存储datadocker pull jenkins/jenkins #拉取最新版jenkinshttps://hub.docker.com/r/jenkins/jenkins/tags #查看docker中的jenkinsvim docker-compose.ymlversion: '3.1'services:jenkins:image: jenkins/jenkinscontainer_name: jenkinsports:- '8080:8080'- '50000:50000'volumes:- './data/:/var/jenkins_home/'chmod -R a+w data/ #设置权限,因为普通用户此时没有权限docker-compose up -d #后台启动docker logs -f jenkins #查看jenkins日志页面vim data/hudson.model.UpdateCenter.xml #进入配置界面https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json #清华国内源cat /var/jenkins_home/secrets/initialAdminPassword #查看密码
这里就是登录密码。(跳过安装推荐插件)
Jenkins配置
Git Parameter和 Publish Over SSH 插件

配置Jdk和Maven

cd /usr/local/docker/jenkin_docker/datamv /usr/local/maven ./ #移动maven和jdk1.8的位置 因为前面和docker绑定的数据卷,所以内容会一并进入到docker中mv /usr/local/jdk1.8 ./Add JDK——Name无限制——/var/jenkins_home/jdk1.8写docker中的位置Add Maven——Name无限制——/var/jenkins_home/maven写docker中的位置

Apply——Save
Jenkins连接服务器
配置一个脚本操作服务器
使用密码配置
拉到最下面


使用ssh配置
在jenkins服务器中,创建秘钥
ssh-keygen -t rsa #创建秘钥对cat .ssh/id_rsa #查看私钥 将私钥复制到jenkins中

cat .ssh/id_rsa.pub #查看jenkins服务器中的公钥 复制vi .ssh/authorized_keys #粘贴到脚本服务器的该文件中。

Jenkins构建时消息配置
配置“邮件通知”,对邮件进行配置,这样当项目构建失败时,我们能第一时间收到通知。
首先进入“Manage Jenkins”,然后进入“Configure System”,填写“Jenkins location”, 设置系统管理员邮件地址,这里的邮件地址需要和后续要设置的发邮件地址一致,
错误发送邮件

成功失败都发送邮件
安装插件 Email Extension
设置钉钉机器人





下载安装dingtalk——配置——钉钉



Jenkins破解管理员密码
1.破解管理员密码
[root@jenkins_test3 ~]# cd /var/lib/jenkins/users/[root@jenkins_test3 users]# ls -la总用量8drwxr-xr-x. 4 jenkins jenkins 91 11月 5 07:28 .drwxr-xr-x. 18 jenkins jenkins 4096 11月 5 08:59 ..drwx------. 2 jenkins jenkins 24 11月 4 10:35 admin_1088696786195199031drwx------. 2 jenkins jenkins 24 11月 5 07:28 noreply_2292328003593846535-rw-r--r--. 1 jenkins jenkins 407 11月 5 07:28 users.xml[root@jenkins_test3 users]# cd admin_1088696786195199031[root@jenkins_test3 admin_1088696786195199031]# vim config.xml搜索定位到<passwordHash>那一行,修改为<passwordHash>#jbcrypt:$2a$10$usctvlMlqJ8XswbJ0QCcRuZ6ItKL30r0mEXXi5cXCrnWITuyP2E5W</passwordHash>[root@jenkins_test3 admin_1088696786195199031]# systemctl restart jenkins //重启jenkins新密码为000000
2.手动设置随机字符串
若不想使用上述的密码,我们也可以自己定义一个随机字符串,进入jenkins界面,点击右上角admin,点击设置,下拉找到“密码”,自己定义一个随机字符串,将自己定义的随机字符串保存下来,位置自由,若以后忘记了密码,可在 /var/lib/jenkins/users/admin 文件中,将字符串修改成自己定义的字符串,这样密码就修改成功了。
Jenkins实现基础CI操作
创建项目




连接gitlab
创建gitlab仓库
VSN——创建git仓库——IDEA终端中输入git config --global user.name "Administrator"git config --global user.email "admin@example.com"git clone http://192.168.218.152/root/testqqq.git



jenkins中新建项目
创建项目
设置maven构建

设置构建后命令


创建docker文件

别忘记推送到gitlab
开始构建和构建流程

构建流程:
- jenkins从gitlab中拉取代码
- 代码会被存放到
/var/jenkins_home/workspace中 - jenkins会使用maven进行构建打包
- 将工作空间中target文件夹打包的.jar转移到test服务器设置的位置中,docker文件也是同理
- 最后执行构建完参数。
整个流程,jenkins会通过文件的返回值是否为0 来判断命令是否执行成功。
部署java项目
先在gitlab中创建项目
wget https://codeload.github.com/94fzb/zrlog/zip/master #下载zrlog文件du -sh master #查看包大小unzip master #解压压缩包cd zrlog-master #进入文件夹git init #初始化gitgit remote rm origin #移除原有的的origingit remote add origin http://192.168.218.152:82/root/zrlog.git #添加远程库git push -u origin master #推送到master分支


安装jdk在远程机器上
tar -zxf jdk-8u301-linux-x64.tar.gz -C /usr/local/ #下载jdk-8 并存放至/usr/local下mv /usr/local/jdk1.8.0_301/ /usr/local/jdk8 #修改文件夹名vim /etc/profile #配置环境变量export JAVA_HOME=/usr/local/jdk8export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarjava –version #验证
安装tomcat
tar -zxf apache-tomcat-8.5.70.tar.gz -C /usr/local/tomcatvim /usr/local/tomcat/apache-tomcat-8.5.70/conf/tomcat-users.xml<role rolename="admin"/><role rolename="admin-gui"/><role rolename="admin-script"/><role rolename="manager"/><role rolename="manager-gui"/><role rolename="manager-script"/><role rolename="manager-jmx"/><role rolename="manager-status"/><user name="admin" password="MLYliao118235" roles="admin,manager,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status" /></tomcat-users>vim /usr/local/tomcat/apache-tomcat-8.5.70/webapps/manager/META-INF/context.xml找到 allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />向其中加入我们要使用的网段,修改如下:allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192.168.222.*" />
找到“Managing Tomcat”,点击“manager webapp”
登录账号后
安装maven
前面已经安装过了,安装Maven Integration plugin 和 Deploy to container Plugin 插件systemctl restart jenkins 重启jenkins
创建maven项目



Deploy war/ear to a container 需要添加前面设置的tomcat设置。

立即构建即可
Jenkins实现基础CD操作



SonarQube/代码检测
开源的代码分析平台,免费版支持17种语言分析,代码漏洞,代码规范等。
搭建平台
echo "vm.max_map_count=262144" >> /etc/sysctl.conf #追加虚拟内存参数ssysctl -pdocker pull postgres && docker pull sonarqube:8.9.6-communityversion: '3.1'services:db:image: postgrescontainer_name: dbports:- 5432:5432networks:- sonarnetenvironment:POSTGRES_USER: sonarPOSTGRES_PASSWORD: sonarsonarqube:image: sonarqube:8.9.6-communitycontainer_name: sonarqubedepends_on:- dbports:- 9000:9000networks:- sonarnetenvironment:SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonarSONAR_JDBC_USERNAME: sonarSONAR_JDBC_PASSWORD: sonarnetworks:sonarnet:driver: bridge
默认账号密码adminadmin
使用maven添加代码到Sonar


vim data/maven/conf/settings.xml#配置SonarQube#是在上面配置的基础上<profile><id>sonar</id><activation><activeByDefault>true</activeByDefault></activation><properties><sonar.login>admin</sonar.login><sonar.password>MLYliao118235</sonar.password><sonar.host.url>http://192.168.218.153:9000</sonar.host.url></properties></profile>#使用cmd或者IDE 进入到项目文件夹下 执行以下命令mvn sonar:sonar


使用sonar-scanner添加代码到Sonar
https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/ 官网下载

cd /usr/local/docker/jenkins/data/workspace/mytest1 #进入到jenkins的项目文件目录中/usr/local/docker/jenkins/data/sonar-scanner/bin/sonar-scanner -Dsoanr.sources=./ \-Dsonar.projectname=linux-test -Dsonar.login=bec3b80a1595057191d90ec1f1136fc14ba10165 \-Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/#soanr.sources 代码地址#sonar.projectname 项目名称#sonar.login 登录token#sonar.projectKey 项目钥匙#sonar.java.binaries 项目位置

SonarQube整合jenkins
下载插件
Localization: Chinese (Simplified) 和 SonarQube Scanner for Jenkins
如果下载失败可以从网上下载,插件文件在数据目录下的plugin文件夹中
重启jenkins

添加SonarQube


添加SonarQube全局变量

开始构建
如果出错了,则删除rm -rf data/workspace/mytest1/.scannerwork/
构建成功后
Harbor自建仓库部署
下载harbor
https://github.com/goharbor/harbor/releases
tar -zxf harbor-offline-installer-v2.5.0.tgz -C /usr/local/cd /usr/local/harborcp harbor.yml.tmpl harbor.ymlvim harbor.yml#设置ip 删除https配置./install.sh

harbor基本操作
创建项目

如果想要往harbor推送项目,镜像的格式必须是:
harbor地址/项目名/镜像名:版本
配置私有镜像地址 在json中
vim /etc/docker/daemon.json{"registry-mirrors": ["https://zamu0pih.mirror.aliyuncs.com"],"insecure-registries": ["192.168.218.153:80"]}systemctl restart docker
上传镜像
docker tag f1108e0ecc59 192.168.218.153:80/repolist/mytest1:v1.0.0 #设置镜像docker login -u admin -p Harbor12345 192.168.218.153:80 #设置用户密码docker push 192.168.218.153:80/repolist/mytest1:v1.0.0 #上传#上传成功后就可以拉取镜像docker pull 192.168.218.153/repolist/mytest1 #从harbor拉取镜像

harbor整合到镜像中
要让docker中其他用户也拥有足够的权限去操作docker,所以需要修改docker.sock的文件权限
cd /var/run/chown root:root docker.sockchmod o+rw docker.sock#修改docker-composeversion: '3.1'services:jenkins:image: jenkins/jenkins:2.332.3-ltscontainer_name: jenkinsports:- '8080:8080'- '50000:50000'volumes:- './data/:/var/jenkins_home/'- '/var/run/docker.sock:/var/run/docker.sock'- '/usr/bin/docker:/usr/bin/docker'- '/etc/docker/daemon.json:/etc/docker/daemon.json'docker-compose up -d #重启并载入配置
harbor整合jenkins
dockerfile文件就不再需要了,可以删除了
- 我们要将需要打包的文件移动到指定位置 docker下
- 以docker文件夹下的内容构建镜像
- 登录harbor账号
- 修改镜像样式并且上传到harbor

mv target/*.jar docker/docker build -t mytest01:$liaotest docker/docker login -u admin -p Harbor12345 192.168.218.153:80docker tag mytest01:$liaotest 192.168.218.153:80/repolist/mytest03:$liaotestdocker push 192.168.218.153:80/repolist/mytest03:$liaotest
目标服务器准备脚本文件
- 告知目标服务器拉取哪个镜像
- 判断当前服务器是否正在运行容器,需要删除
- 如果目标服务器已经存在当前镜像,需要删除
- 目标服务器拉取harbor.上的镜像
- 将拉取下来的镜像运行成容器 ```bash ./deploy.sh 192.168.218.153:80 repolist mytest03 v3.0.0 8081
!/bin/bash
harbor_addr=$1 harbor_repo=$2 project=$3 version=$4 port=$5
imageName=$harbor_addr/$harbor_repo/$project:$version
echo $imageName
containerID=docker ps -a | grep ${project} | awk '{print $1}'
echo $containerID
if [ “$containerID” != “” ]; then
docker stop $containerID
docker rm $containerID
fi
tag=docker images | grep ${project} | awk '{print $2}'
echo $tag
if [[ “$tag” =~ “$version” ]]; then docker rmi -f $imageName fi
docker login -u admin -p Harbor12345 $harbor_addr docker pull $imageName docker run -d -p $port:8080 —name $project $imageName echo “SUCCESS”
<a name="DoZP1"></a>## 基于Harbor的最终部署<br /><a name="yKI1B"></a># Jenkins流水线任务添加插件 **Pipeline:Job**<a name="YShY6"></a>## 创建流水线任务<a name="hrBOq"></a>## 流水线脚本```bash#所有脚本命令放在pipline中pipeline{# 指定任务在哪个集群节点中执行 any 任意一个agent anyenvironment {key = 'value' #声明全局变量 方便后面使用}stages {stage('拉取git代码') {steps {echo '拉取成功'}}stage('maven构建项目') {steps {echo '构建成功'}}stage('代码质量检测') {steps {echo '代码质量检测成功'}}stage('docker 制作自定义镜像') {steps {echo 'docker 制作自定义镜像成功'}}stage('harbor镜像推送') {steps {echo 'harbor镜像推送成功'}}stage('publish 通知目标服务器') {steps {echo 'publish 通知目标服务器成功'}}}}

在流水线语法中,有很多语法可以帮你自动生成脚本

jenkinsfile维护脚本
从gitlab中查看jenkinsfile,进行流水线工作查看,进行构建。


pipline拉取git代码
设置自定义标签,用来指定版本号
生成checkout:Check out from version control流水线语法
设置到jenkinsfile文件中,并且添加上自定义函数

构建即可

pipline maven构建项目

找到docker中maven的位置
pipline SonarQube


pipline 制作docker镜像


pipline 推送harbor

pipline 通知目标服务器部署项目
此处可以调用jenkins 和 jenkinsfile中的变量
注意这里要改成双引号
pipline 设置钉钉通知
直接在jenkinsfile中添加
#无需添加到stages中 而是在stages后post {success {dingtalk(robot: 'liao', #robot必须与配置的id一致type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 成功构建: ${JOB_NAME} \n - 版本: ${tag} \n - 持续时间: %{currentBuild.durationString}"])}failure{dingtalk(robot: 'liao',type: 'MARKDOWN',title: "success: ${JOB_NAME}",text: ["- 构建失败: ${JOB_NAME} \n - 版本: ${tag} \n - 持续时间: %{currentBuild.durationString}"])}}




