第1章 DevOps平台介绍
1.1 基于Kubernetes的DevOps平台实践介绍
1.2 DevOps及CICD发展介绍
持续集成,持续交付
很早以前的开发流程。产品迭代周期长,灵活性差
开发测试协同工作
devops把开发测试运维三个角色协作起来了
第2章 Jenkins初体验
2.1 Kubernetes中部署Jenkins
jenkins文件先跑起来,部署到K8S里
jenkins固定到slave1节点
jenkins需要执行任务的时候调用K8Spod的所以需要有权限,serviceaccount,给了一个cluster-admin最大权限
这里做了一个定点
jenkins使用的目录是/var/jenkins_home
初始化容器对容器权限进行了修复,jenkins在容器内部默认使用1000用户启动进程,所以在初始化容器的时候给这个目录赋值上1000用户
使用ingress来给外部访问
jenkins支持master和slave,50000就是master提供给slave通信的端口
设置一个别名
创建的一个初始化密码
加一个解析
看到这个就完全启动了
在slave1的挂载目录也可以看到
默认链接的插件地址比较慢,这里可以直接跳过
修改默认源
替换一下源
官方建议使用的docker镜像版本
修改管理员的密码
2.2 Jenkins汉化
2.3 Jenkins基础功能实践(上)
官方的仓库的版本占的资源比较多,什么都有,推荐用sameersbn版本的,只需要基础的仓库功能就行
直接docker安装也可以,postgresql,redis,gitlab
用secret去管理账号密码
secret类型是generic,secret名字是gitlab-secret。因为当作环境变量用所以from-env-file
加了base64
这里起一个service,这里希望通过服务发现,servicename的方式去访问
整个postgres是用deployment部署
环境变量从secret里去引用
要给节点打一个标签才能调度过去
给slave2打一个标签
进入到pod创建一个数据库
redis也同样也起一个service
需要被外部访问,可以用ingress去暴露服务
默认nginx的client_max_body_size 客户端通过nginx代理最大能上传1M,git push走http协议的化也会受这个限制
直接把地址指向它
这里引用了secret
数据挂载
需要给服务器打一个label
已经启动了
可以查看日志。这里只有7个服务
正常会有十几个服务,这个资源消耗比官方小很多
加一个gitlab
初始化密码
填入刚才设置的管理员密码
这样就创建好了
先把origin改个名字
还需要添加一个origin
创建了一个新的分支master
2.4 Jenkins基础实践(下)
在设置里,但是有个问题,jenkins的dns解析不了这个地址
coredns是通过configmap加进去的
容器里是直接在pod的host文件里改
在jenkins访问gitlab通不通
现在能够访问
jenkins添加凭据
全局凭据里点添加凭据
选择gitlab的apitoken
用户的access token
权限全有
apitoken只有一次机会看到
测试是否ok
什么时候去触发任务,推送之后就会触发任务
gitlab要在webhook里配置
jenkins的webhook地址
jenkins下面生成一个token
现在设置只要推送就会触发webhook
勾选上即可
这里就有了一个webhook
执行完发送给钉钉
直接test
提交测试
这样就收到了
2.5 Master-Slaves模式
这个是jenkins安装的时候的家目录
查看对应的目录。这个目录就是myblog的代码
想让master分发任务
可以打一个标签指定任务跑在对应标签的slave上允许
下载这个jar包
提示端口访问不了
这里只暴露了8080
ingress访问不了,因为只反代了8080,用svc的5000端口是可以的
直接走clusterip试试
clusterip:8080
现在就访问通了
现在已经是ok的了
给项目配置节点,刚才写的标签
已经分发到节点上了
现在就可以了
2.6 定制化Jenkins镜像
安装插件需要连接外部的网络,但是有些环境没有外网,就可以制作镜像
这些是装的插件
这个脚本是获取脚本的
在已经安装好的jenkins上获取。账号密码。访问地址
地址换成podip
有这么多插件
下面就可以构建了
第3章 流水线pipeline实践
3.1 Pipeline流水线介绍
3.2 流水线语法详解
流水线两种语法类型,脚本时流水线,声明式流水线
agent就是用哪个执行器去执行
每个step都会做不同的工作
整个任务执行的阶段,都可以读到这个变量
**stages是整个任务的定义。checktout一般是拉代码,scm是source code manager源代码管理
**
任务之后会根据成功失败执行,不管成功失败都会执行always
这里的10代表保存10条构建记录,option就是设置一些任务选项相关的配置
通常都是不允许任务同时进行,都是一个个来
任务运行的超时时间
任务失败尝试多少次
这个构建颜色黄色可以是单元测试构建的时候,10次,有3次失败可以认为是不稳定
3.3 流水线脚本案例实践
可以给master打一个标签
保存一下
下面是dockerfile
可以选择checkout代码
这里只是生成流水线的脚本
这就是片段生成器的用法
这个镜像就是刚才jenkins构建的
3.4 Blue Ocean的使用
这个界面看起来比较高大上
这里面就显示了运行的几个步骤
可以看到输出
只能针对流水线
第4章 Jenkinsfile实践
4.1 实践1:使用Jenkinsfile管理pipeline
任务可以和研发的代码做版本控制
在项目跟目录下创建jenkinsfile
现在项目里就已经有这个文件了
手动再触发一次构建
从项目里读取jenkinsfile
4.2 实践2:优化及丰富pipeline
这里配置了一次仓库
pipline也指定了,这样属于重复指定
这里就是一个优化点
这里有一个变量
打印的环境变量里有一个gitcommit,这个id就是这一次代码提交的id
这样构建仓库的tag就对应commitid
这里发送的消息就丰富了点
失败也会通知构建失败
这里失败加了尝试2次
可以把之前的pipeline替换一下
配置一下webhook
myblog触发push后,会推送jenkins进行构建
替换一下jenkinsfile
已经执行到构建镜像了
构建成功
4.3 实践3:流水线中调用k8s部署服务
把服务部署到K8S里
在项目里创建一个deploy目录,拷贝一下之前的部署文件
deploy文件不能写死,应该写成模板
这里部署的时候先去做一次替换
在slave2上创建kubectl的配置文件
替换一下jenkinsfile
在项目里用git提交一下
这样就正在执行了
执行成功
这里进行模板替换
4.4 实践4:流水线中敏感信息的处理
如果image版本是最新的,那就说明部署成功
但是token收明文的,可以使用凭据管理敏感信息
可以直接去引用一个credentials的id
默认会创建三个环境变量
可以创建一个凭据叫dingTalk,token放到密码即可,用户名不会去使用
在environment里加上ding talk环境变量
这里取一下环境变量
准备构建
现在token里就做了隐藏
但是企业中一般是多分支的,每个分支都需要构建
第5章 多分支流水线实践
5.1 多分支流水线的使用
develop分支一般发布到开发环境,测试好没问题,合并到master发布到集成测试,测试号没问题,合并到release分支发布到线上
就有了多分支流水线
创建一个job
选择多分支流水线
显示名称类似displayname,可以不写
先写.*,匹配全部试试
还可以发现标签
文件名是Jenkinsfile,放在项目跟目录下
之前是做的webhook,多分支的建议用这个,扫描,意味着执行不是gitlab推送执行的,而是jenkins自己去扫。选择1分支是最快的
保存
多分支流水线是区分分支的,每个分支都必须符合正则,还有跟目录下有jenkinsfile
建立一个分支
推送到远程仓库
这样就匹配到了develop分支,不同的分支写不同的fenkinsfile,部署到不同环境里
试试创建一个tag
这样就获取到了
5.2 实践1:美化消息通知内容
钉钉是支持markdown的
声明式流水线可以直接调用脚本流水线,script里可以直接调用脚本流水线的语法
之前的printenv里的stagename
每个阶段的stagename的值不一样
取最新的一次log记录
上一次提交写的内容
复制修改jenkinsfile
任务执行是在容器里而不是宿主机上
可以回放点id,查看运行的当前用户是什么
id是Jenkins,所以没有权限和docker命令交互
还是启动slave2节点,因为继续使用master需要挂载docker的socket还需要修改运行权限
直接修改到slave2运行
这样运行就没有问题
这里是构建成功了
5.3 实践2:Jenkins通知gitlab构建
构建保留几条数据
不允许并行构建
超时时间
jenkins端调用gitlab的api
gitlab链接池
gitlab插件提供的方法,更新gitlab这次提交的状态
执行完这个阶段,就通知gitlab这个阶段的任务执行成功
修改jenkinsfile去执行
触发构建
执行成功
会提交到develop分支上
点一下这个勾
这是gitlab希望和第三方对接,实现的pipeline api
把jenkins的内容拿了过来
创建一个
创建一个merge的时候,可以看到一个流水线状态,如果是一个×号,就不应该merge到master,可以作为一个判断标准
多分支流水线可以进行管理
第6章 Jenkins深度集成Kubernetes
6.1 Jenkins与Kubernetes深度集成配置
之前都是指定节点运行
可以使用K8S的pod来启动slave
和K8S做集成还是要安装插件
先要重启jenkins,让第一个安装的插件生成最新的版本之后再去安装
删除pod就等于重启
已经装好了
cloud配置已经移动到了独立的页面
点一下kubernetes
K8S调度的pod在哪个名称空间里
内部jnlp通信的端口
超时时间增加多点
链接测试
之前创建jenkins服务的时候已经分配了rbac ,serviceaccount,所以pod本身就可以访问K8S集群
配置pod模板,告诉Jenkins调度哪个pod
加一个label
节点选择器,jenkins的pod可以运行在哪个节点上
配置一个主机的挂载方式
需要修改1000用户,因为在pod内部是用的1000用户
在master节点打一个agent=true的label
6.2 实践:使用动态jnlp slave执行构建任务
回放一下,这里改成jnlp-slave
这里启动一个pod
先在节点上打一个标签
查看一下,默认使用的镜像
6.3 实践:定制化jnlp slave容器镜像
slave容器上肯定需要一些工具,git,mvn。python这样的
创建构建镜像的目录,拷贝二进制工具
更新国内源,安装一些基本工具,创建kube目录
报错了,看看对应的alpine版本进去执行是否报错
一步步执行看看哪里遇到问题
指定版本是可以的
看看现在用的最新的3.12.的alpine。没有python包了,必须指定python版本
可以进入容器验证一下
容器内部是没有socket文件的
可以在外部挂载socket文件
现在可以使用docker了
kubectl也有
push到仓库
6.4 实践:使用动态slave pod实现项目的自动发布
如何在启动的时候调用自己构建的镜像
这里有一个pod模板
把构建的镜像加到容器列表
原来默认是用的这个image,这个镜像的功能就是去链接jenkins-master,作为一个slave
这里填写了镜像列表,原来的肯定不能用,所以要兼容
要把默认镜像的功能拿过来,还需再添加一个容器,名字要和下面的jnlp一致,这是插件去识别的
命令参数需要看原来的cmd
查看cmd
这里的参数是错的,参考上面的
自己做的容器需要跟docker交互,还需要挂载docker的socket文件
我们可以选择一个主机路径挂载
现在slave pod就替换了,对jenkinsfile做了调整
这里就是指定容器列表的哪一个,只有tools容器才有docker命令
替换一下Jenkinsfile内容
把修改好的Jenkinsfile push 上去
现在pod里有2个容器,因为加了一个tool容器
现在容器里执行的命了
目前通过jenkinsfile加上slavepod、就可以把任务完成
回顾一下
默认调度的pod无法执行所需要的命令,所以我们制作镜像
把自己做的镜像集成到pod里,还需要把原来的jnlppod移植过来,否则无法连接上jenkins-master
把需要进容器执行的命令,指定容器包起来
第7章 Jenkins与Sonarqube集成实现代码质量管理
7.1 sonarqube架构介绍及安装
sonarqube是一个检测代码质量的工具
项目代码经过扫描器,扫描出来的结果发送到server端,可以在dashboard上看到结果
yaml文件放到jenkins目录
如果一直起不来,可以选择把监控检查去掉,检测时间可能有点短
添加一下解析
先停一下,创建数据库
现在正在启动
默认初始化admin admin
7.2 使用scanner进行sonarqube扫描
在项目跟目录下准备配置文件
代表源代码比如myblog里的所有都需要扫描
新建一个配置文件
先不push。在项目里创建,试试服务器上测试
现在要把scanner链接哪个sonar服务器地址
配置本地hosts文件
现在可以执行扫描,在python-demo的路径下
-X有debug输出
在下载一些规格文件
下载失败的话,多尝试几次
正在扫描文件了
生成的task文件,可以看到一些检验的信息
多了一个项目
可以看到出问题的地方
在项目里配置project配置扫描文件,然后再scanner篇日志scanner服务端地址
为了解析sonar,可以在coredns加上解析
修改coredns,这样启动的pod就有dns
7.3 sonar-scanner与tools集成
tools拉取代码后, 应该可以直接在tools容器里做扫描
jre其实就是java的运行环境,tools容器里已经有java环境了。所以没必要把jre包拷贝过去,但是需要让scanner指定java环境
这里默认去找自带的jre,所以需要改成false
把sonar的scanner拷贝过去
把自带默认的jre删除
确认配置文件没有问题
改成false,不读取自带的jre
修改Dockerfile
先进容器试试java环境是否有问题
推送到仓库里
把jenkins的容器模板列表换成v2版本
7.4 Jenkins集成sonarqube
sonar的质量门就是去设置一些阀值,metric就是指标。设置了几个指标
新代码覆盖率少于80%
c重复行数
可以自己选择copy一个,加更多的指标
还可以关联哪个项目做检测
想要做流水线的时候知道是否通过sonar扫描,就需要安装插件
一般关注bug数和覆盖率,还有严格一点的code smell
可以直接写服务发现的地址
添加一个token,链接sonar使用。在sonar里生成token
在jenkins里添加凭据,类型为secret text
7.5 实践:Jenkinsfile集成sonarqube
查看官方给的sonar集成jenkinsfile的例子
这里的sonar名字要和jenkins配置的sonar名字一致
不成功就直接把流水线中止了
这里加了一个CI
parallel是一个并行的意思
在CI里这两个任务可以并行去做,单元测试和代码扫描
这两个值要写的一样,否则取不到,如果sonar验证不OK,回去中断整个流水线
jenkinsfile 集成sonarqube 提交
现在就自动在执行了,有一个并行的
这里的图标可以跳转到sonar
地址是在下面配置的
镜像tag是git的commit
第8章 集成RobotFramework实现自动化验收测试
8.1 RobotFramework介绍及验收用例编写
基于python语法来验收测试开发的自动化框架
这里是pod网络地址,再容器里可以访问通
除了api的测试还有url的测试
这里可以用无头浏览器测试url
8.2 实践:robot环境安装及测试用例执行
在master上去启动容器
要先装一下浏览器,一个是驱动,一个是浏览器,版本需要一致,否则会出问题
安装python依赖
现在就有robot命令去执行测试用例
由于是临时起的容器,无法解析,直接修改成能访问的ip就行
在robot里把访问地址改一下
把上面的文件拷贝到本地查看
log是详细记录页面
上面是手动的方式在跑robot用例
8.3 RF与tools工具镜像集成
制作dockerfile
需要更新jenkins里的kubernetes中的container-template
8.4 实践:Jenkinsfile集成RF实现自动化验收测试
现在可以直接调用容器里的robot命令做测试,集成测试的output.xml记录了本次集成测试的结果,jenkins集成robot插件可以分析这次结果,还可以分析这个阀值告诉jenkinsfile执行状态
-i就是指定tags,筛选出哪里有tag这样的用例
这一段都是robotframework的设置
会到这个目录里找这个文件
通过这两个阀值,达到80%就是成功,80-20就是不稳定,20是失败,等于jenkins构建的颜色,蓝色,红色。橘色
告诉jenkins把这次构建测试的收集进来当成一个制品来展示
安装插件
通过jenkinsfile来集成demo项目的验收测试
这边的注释是斜杠
跟之前的变化部分在这里
等podrunning的时候,才去做测试
提交jenkinsfile的修改
jenkins任务里手动申明的就是制品
报错了,文件头可能错误,后面到容器里试了一下其实是sonar的域名解析不了,需要修改coredns
模拟一下项目启动,还是像之前那样docker run,克隆代码
develop分支有sonnar的【配置文件
之前是因为pod访问sonnar地址解析不了,配置一下coredns
试试生效没有
再去试一下
结果是一个失败
robot.txt没提交过去
因为这里打了OK,所以忽略了错误
吧robot.txt提交一下
可以看到制品
可以看到集成测试结果