基于Jenkins与Gitlab的CI/CD及DevOps实战
DevOps 介绍:
OPS部分职责:
1.通过监控、告警、人工值守等方式保证应用程序的7*24的可用性。
2.系统选型、基础环境初始化、web服务高可用架构设计及落地、网络配置、监控系统部署、日志收集系统部署、链路追踪系统部署、CICD系统部署、运维工具或自动化运维平台开发及维护等。
3.监控及告警配置、故障处理、故障报告整理及汇报、故障文档总结、故障复盘、优化方案及故障跟进等。
4.数据库、ES、kafka、redis、zookeeper等中间件的集群部署、监控配置、故障处理、性能优化及维护。
5.对资源利用率进行统计、提交资源使用汇总清单、提交下财年IT预算等。
DEV部分职责:
1.业务架构设计、开发语言及框架选型、中间件选型、数据库表结构设计及数据库初始化等。
2.业务代码编写,使用java、python、go等语言,编写项目中的各服务。
3.提高代码质量,基于监控工具试下链路性能分析,对响应慢的服务或页面进行优化、提高代码质量。
4.APP客户端兼容性(安卓、IOS等),兼容IE浏览器、手机浏览器、各型号手机等。
5.bug修复及新功能开发,基于监控工具、APP探针、URL监控工具、日志收集工具等收集、统计并分析bug,并进行修复,在618、双十一等节假日开发新的功能。
CI/CD 介绍:
持续集成:
CI-Continuous integration,持续集成是指企业中的多名开发者在开发同一个项目的不同功能代码的过程当中,可以频繁的将代码提交到统一的代码仓库并合并到一起、切相互不影响工作的工作模式。
持续部署:
CD-continuous deployment,持续部署是指基于某种工具或平台等方式能实现代码自动化的构建、打包、测试和部署到测试或生产等环境以实现代码的快速迭代更新,持续部署在某种程度上代表了一个开发团队的更新迭代速率(工作效率)。
持续交付:
CD-Continuous Delivery,持续交付是能够以可持续的方式、安全、快速地将所有类型的变更(如添加新功能、配置更改、bug修复)等投入生产或交到用户手中、即可以被用户使用(交付是产品价值的一种交付,是产品价值的一种盈利的实现。
jenkins简介:
是一个开源的持续部署工具,https://www.jenkins.io/zh/。
基于java语言开发,https://www.jenkins.io/zh/doc/book/installing/。
支持MacOS、linux及windows 等系统。
安装简单支持rpm/deb包、war包等多种安装方式。
图形化的界面,简单易用、方便维护、运行稳定。
支持master/slave工作模式,分布式构建实现性能横向扩容。
支持插件化,可通过插件支持gitlab、svn、webhook等功能、方便功能扩展及二次开发。
支持构建成功或失败的邮件通知。
支持pipline,实现流水线形式的可视化代码部署流程。
可以结合SonarQube等第三方工具实现代码质量检测并生成可视化报告。
丰富的使用案例,大量的使用文档及解决方案。
常见的业务环境:
开发环境(Development、dev环境):
软件研发工程师(Software Development Engineer)专用于代码开发的机器,必须本地办公PC或公司会给程序员分配虚拟机专用于本人做代码开发。
测试环境(Test):
首次将代码合并及构建后进行统一的集中功能与性能等意向的专用测试环境,会存在一些未知的bug(漏洞、功能缺陷)等需要迭代修复,不对用户开放。
UAT环境(User Acceptance Test):
用户接受度测试,即最终的验收合格测试环境,UAT环境主要用于测试或交付人员进行验收测试,也不对客户开放。
灰度环境(preview、pre环境):
灰度环境,是生产环境的一小部分服务器,外部用户可以访问,主要在此环境对新版本进行小规模发布与测试,即便有bug或功能缺陷问题也只影响一小部分用户。
生产环境:
正式对用户开放的业务环境,是经过层层测试的最终相对稳定的代码程序,比如我们访问的www.jd.com主要就是访问的生产环境。
常见的代码部署方式:
开发自己ssh到服务器上传:
最原始的部署方式,效率低而且容易出错
开发给运维手动上传:
运维自己手动部署
运维使用脚本复制:
手动批量部署,需要到时候手动执行并验证
结合web界面一键部署:
自动部署、自动验证、自动上线
常见的代码部署方案:
蓝绿部署:
蓝绿部署是指有两套一样的业务环境,然后有一套在线上运行一套是离线的,在进行代码部署的时候不停止老版本代码(完全不影响上一个版本访问),而是在另外一套离线环境部署新版本然后进行测试,在测试通过后再将用户请求流量切到新版本,其特点为业务无中断,升级风险相对较小。
A/B测试:
A/B测试也是同时运行两个业务环境,但是蓝绿部署完全是两码事,A/B 测试是用来测试应用功能表现的方法,例如业务功能可用性、业务受欢迎程度等等,蓝绿部署的目的是安全稳定地发布新版本应用,并在必要时回滚,即和蓝绿部署的区别是蓝绿部署是一套正式环境环境在线,而A/B测试是两套环境同事在线并进行(内部团队竞争)。
滚动发布:
滚动发布一般是分几批次部署,先取出一个或一部分服务器从负载均衡下线、然后逐个停止服务,然后逐个执行更新,最后更新完成后、再重新添加到负载均衡使用,周而复始,直到集群中所有的实例都更新成新版本。
金丝雀/灰度:
金丝雀发布也叫灰度发布,是指从当前版本升级到新版本,能够实现平滑升级和过渡的一种发布方式,灰度发布是增量发布的一种类型,灰度发布是在原有版本可用的情况下,同时部署一个新版本应用作为“金丝雀”(小白鼠),测试新版本的性能和表现,以保障整体系统稳定的情况下,尽早发现、调整问题。
Gitlab简介、安装、账户与权限管理、项目管理
gitlab下载:
下载地址:
https://docs.gitlab.com/ee/install/requirements.html #安装依赖
https://packages.gitlab.com/gitlab/gitlab-ce #官方下载地址
https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ #清华大学镜像源
gitlab安装:
# dpkg -i gitlab-ce_15.4.3-ce.0_amd64.deb
# vim /etc/gitlab/gitlab.rb
# grep -v "#" /etc/gitlab/gitlab.rb | grep -v "^$" #验证配置文件
external_url 'http://192.168.106.200'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "[email protected]"
gitlab_rails['smtp_password'] = "abcdabcdabcd"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = :login
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = "[email protected]"
user["git_user_email"] = "[email protected]"
# gitlab-ctl reconfigure #重新配置服务
浏览器登录 http://192.168.106.200/
1.个人-偏好设置-语言-简体中文 (可不更改)
2.通知-设置邮箱-改成自己邮箱 (默认是[email protected])
3.更改密码
4.管理员-设置-通用-注册限制-取消注册功能
gitlab项目与账户权限:
账户权限分类:
Guest-访客,可以创建issue、发表评论,不能读写版本库
Reporter-Git项目测试人员,可以克隆代码,不能提交,QA、PM可以赋予这个权限
Developer-Git项目开发人员,可以克隆代码、开发、提交、push,RD(Research and Development engineer,研发工程师)可以赋予此权限
Master-Git项目管理员,可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予此权限
Owner-Git系统管理员即Administrator,可以设置项目访问权限、删除项目、迁移项目、管理组成员,研发组leader可以赋予此权限
项目权限分类:
Private:私有 项目、只有组内成员才能看到
Internal:内部项目、只有登录的用户就能看到
Public:公开项目、所有人都能看到
gitlab基础管理:
安装目录:
/etc/gitlab #配置文件目录
/run/gitlab #运行pid目录
/opt/gitlab #安装目录
/var/opt/gitlab #数据目录
/var/log/gitlab #日志目录
关闭账户注册
创建group
group-对应于公司的项目
user-对应公司的研发人员
project-对应公司项目的中的服务
创建用户
创建project
对用户授权project权限
测试用户clone与push权限
分支:目前main=之前的master
git add . #添加当前目录下所有变化过的内容到暂存区
git commit -m "xxx" #将代码提交到本地仓库
git push #上传到gitlab服务器
(192.168.106.193)
root@web1:/data/app1#
git clone http://192.168.106.200/laimiya/app1.git
vi index.html
git add .
git commit -m "add index.html"
git config --global user.email "[email protected]"
git config --global user.name "root"
git push
git #分布式的版本控制系统
gitlab #基于git的一个有ce版和ee版本的版本控制系统、ce是免费的私有版本控制系统
github #基于git的公有代码仓库,企业版是付费的
gitlab基础管理:
# gitlab-rake #数据备份恢复等数据操作
# gitlab-ctl #客户端命令行操作行
# gitlab-ctl stop #停止gitlab
# gitlab-ctl start #启动gitlab
# gitlab-ctl restar #重启gitlab
# gitlab-ctl status #查看组件运行状态
# gitlab-ctl tail nginx #查看某个组件的日志
gitlab工作流程:
工作区:clone到本地办公PC的代码或者开发自己编写的代码文件所在的目录,通常是编写的代码所在的目录名称。
暂存区:用于存储在工作区中对代码进行修改后的文件所保存的地方,使用git add命令添加。
本地仓库:用于提交存储在工作区和暂存区中改过的文件地方,使用git commit 命令提交。
远程仓库:多个开发共同协作提交代码的仓库,即gitlab服务器。
gitlab常用命令:
git客户端常用基础命令:
git clone #克隆代码到本地
git push #提交代码到服务器
git pull #更新本地代码
git add index.html、abc/、 . #添加指定文件、目录或当前目录下所有数据到暂存区
git commit -m “xx“ #提交文件到工作区
git status #查看工作区的状态
git reset --hard HEAD^^ #git版本回滚, HEAD为当前版本,加一个^为上一个,^^为上上一个版本
git reflog # #获取每次提交的ID,可以使用--hard根据提交的ID进行版本回退
git reset --hard 5ae4b06 #回退到指定id的版本
git config --global user.name “NAME” #设置全局用户名
git config --global user.email [email protected] #设置全局邮箱
git config --global --list #列出用户全局设置
# git branch #查看当前所处的分支
#git checkout -b develop #创建并切换到一个新分支
#git checkout develop #切换分支
git log #查看操作日志
vim .gitignore #定义忽略文件上传至gitlab
gitlab数据备份与恢复:
备份:
root@gitlab:~# gitlab-ctl stop unicorn sidekiq
root@gitlab:~# gitlab-rake gitlab:backup:create #在任意目录即可备份当前gitlab数据
/var/opt/gitlab/nginx/conf #nginx配置文件
/etc/gitlab/gitlab.rb #gitlab配置文件
/etc/gitlab/gitlab-secrets.json #key文件
root@gitlab:~# gitlab-ctl start unicorn sidekiq
删除或误提交数据
恢复:
查看要恢复的文件:
root@gitlab:~# ll /var/opt/gitlab/backups/ # 查看Gitlab数据备份目录
-rw------- 1 git git 399360 Oct 24 10:04 1666577054_2022_10_24_15.4.3_gitlab_backup.tar
root@gitlab:~# gitlab-ctl stop unicorn sidekiq #停止服务
root@gitlab:~# gitlab-rake gitlab:backup:restore BACKUP=1666577054_2022_10_24_15.4.3 #unix时间戳、备份年月日、版本号
root@gitlab:~# gitlab-ctl start unicorn sidekiq #启动服务
gitlab分支合并:(略)
创建用户user1
创建用户user2
使用user1创建develop分支并进行代码提交
使用user1申请分支develop合并至main分支,并指派给user2
使用user2批准代码合并
验证代码合并
Jenkins功能、特性、架构体系及工作机制
jenkins简介:
Jenkins的前身是Hudson,Hudson是基于java语言开发。
Hudson由Sun公司在2004年立项,第一个版本于2005年发布。
2007年开始Hudson逐渐取代早期其他的开源构建工具,成为主流工具。
2009年4月20日,Oracle宣布将以每股9.50美元,总计74亿美金收购sun。
Oracle在2010年12月声明拥有Hudson名称并申请商标的拥有权利。
2011年1月11日,原Hudson主要项目维护者要求投票将项目名称从“Hudson”改为“Jenkins”,并在2011年1月29日,该建议得到社区投票的批准后创建了Jenkins项目。
后Jenkins项目得到了全球开发爱好者的拥护并快速迭代,2013年后就全面超越了Hudson项目。
jenkins功能特点:
安装简单
强大的图形功能
支持构建Email通知
支持分布式构建
插件化便于二次开发及功能扩展
支持piplinie流水线
Jenkins分布式构建:
jenkins master节点负责job的创建、管理与触发。
job在执行时分配给特定的jenkins slave节点执行
job执行成功后由jenkins master发送邮件通知。
基于jenkins分布式架构可以快速横向扩容jenkins的构建并发能力。
Jenkins安装、插件管理、作业类型及各自的特性
Jenkins安装:
安装依赖:
https://www.jenkins.io/zh/doc/book/installing/
CPU、内存、磁盘
安装Java 8、在2.361.1及以上版本开始要求Java 11
root@jenkins:~# apt update && apt install openjdk-11-jdk
java war包:
二进制安装包:
# dpkg -i jenkins_2.361.2_all.deb && systemctl stop jenkins
# vim /etc/default/jenkins
JENKINS_USER=root
JENKINS_GROUP=root
root@jenkins:~# vim /lib/systemd/system/jenkins.service
User=root
Group=root
JAVA_ARGS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true" #关闭跨站请求伪造保护(CSRF)保护
# systemctl daemon-reload && systemctl restart jenkins.service
http://192.168.106.190:8080/
1.安装推荐插件
2.创建管理员账号 jenkinsadmin
3.重启jenkins 登录
Jenkins插件管理:
在线安装插件:
Blue Ocean #强大的pipliine UI管理界面
GitLab #支持gitlab远程触发jenkins任务构建
卸载插件:
离线安装插件:
http://updates.jenkins-ci.org/download/plugins/ #插件下载地址
Jenkins 更换国内插件源
方法一:
Jenkins > Manage Jenkins > Plugin Manager、点击Available并等待页面完全加载完成、这样做是为了把jenkins官方的插件列表下载到本地、接着修改地址文件、替换为国内插件地址
1.替换国内插件下载地址
进入插件文件目录
cd /var/lib/jenkins/updates/
cp default.json default.json.bak
#sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
#sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json
2.替换国内插件更新地址
替换插件更新地址、将国外官方地址替换为国内清华大学jenkins插件地址
Jenkins > Manage Jenkins > Plugin Manager、点击Advanced页面替换Update Site的url、并submit
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
重启jenkins
方法二:
1.在jenkins服务器 配置hosts
updates.jenkins.io Nginx所在机器的ip
2.Nginx机器做rewrite updates.jenkins.io 跳转到mirrors.tuna.tsinghua.edu.cn
jenkins 邮件通知配置
Jenkins—系统管理—系统设置:
Jenkins Location
系统管理员邮件地址
邮件通知(最下面)
jenkins 任务类型:
构建一个自由风格的软件项目:
自定义任务流程
流水线:
支持pipline流水线语法 标签:CI,gitlab,插件,代码,Gitlab,DevOps,git,Jenkins,jenkins From: https://www.cnblogs.com/pang-lu/p/16938744.html