jjzjj

3分钟,480条流水线,云效DevOps全家桶再为差旅壹号节省6台服务器!

云效DevOps 2023-03-28 原文

 编者按:元叹,12年加入差旅壹号,拥有多年技术管理及架构经验,差旅壹号技术委员会成员,曾负责过多个核心产品架构,致力于研发质量与效能提升。

背景

差旅壹号作为一站式企业消费管理平台品牌,涵盖了一站式企业商旅管理、一站式企业出行管理、一站式企业用餐管理、一站式企业福利管理平台。服务着30余家央企全集团,100余家国企全集集团,超过1000家上市公司和大型集团型公司。但随着业务规模和服务企业数量的持续增长,客户的需求逐渐变得多样化、复杂化,差旅壹号为了快速迭代,响应客户的诉求,开始寻寻找更高效的解决方案。

问题及痛点

 差旅壹号采用微服务架构,共200多个服务,双机房容灾部署,灰度发布。使用SVN管理代码分支、jekins管理编译构建任务、kubernates管理容器。随着公司规模不断壮大,发布效率方面出现挑战。具体问题如下:
  • 为了适用互联网快速迭代,需要经常发布,存在工作量大,投产耗时长等问题;
  • jekins集成代码检测安全检测无线上结果,修复检查效率低;

解决效果

 
• 480条流水线,平均发布耗时3分钟/次,平均每月构建6000分钟,稳定运行1年;
 
• 发布效率方面:发布效率提升70%;
 
• 成本方面:节约jenkins等日常维护成本,及相关服务器6台;
 

那是怎么做到的呢?

 
1、结合公司情况及云效功能支持设计合适的流水线
 
流水线大致可分为4步:拉取分支代码、代码扫描、代码编译、镜像构建并上传仓库、部署。结合企业实际情况可增加:集成sonarqube、集成自动化接口测试。
 
差旅壹号环境分研发集成环境、预发布环境、灰度发布环境、全量发布环境。研发集成环境,快速集成,快速测试,不设人工干预卡点;预发布环境,必须经过研发集成环境的充分测试,测试无问题方可发布;灰度发布环境,预发布环境验证通过,部署灰度发布环境,切换少量用户运营验证;全量发布环境,灰度发布环境验证通过,部署全量发布环境,切换所有用户到最新版本。
 
结合实际情况,差旅壹号流水线设计如下:将研发集成环境独立成一条流水线(内网流水线),预发布环境、灰度发布环境、全量发布环境设置为1条流水线(外网流水线)。内网流水线,效率优先。代码提交后自动触发流水线,经过代码规范扫描、安全扫描后,直接编译构建和部署。代码扫描只扫描出结果,不设红线,在发布外网前解决即可。
 
 
 
外网流水线,质量稳定优先。内网测试通过后,人工触发流水线,首先通过代码规范检测和代码安全检测红线。其次增加人工卡点,对发布做审核,确保内网已经测试通过满足发布条件。审核通过后发布预发布环境,发布后经过测试、产品验证后即可发布灰度环境,灰度环境运行稳定后即可发布全量环境。
 
在上线之初代码规范和代码安全可优先解决严重和高危级别问题,中危、一般问题可后续一次或按增量解决。
 
 
2、建立模板,统一规则,降低维护成本
 
测试流水线建立测试成功后,建立流水线模板,规范流水线的创建,并节约创建成本。(流水线模板可直接从已有流水线另存为流水线模板也可新建)
 
 
3建立流水线,控制权限,保障流水线按指定流程执行
 
通过模板建立服务流水线(或复制已有流水线),给相应人员开通流水线对应权限:所有权限、运行权限、查看权限。
 
 
4、设置流水线分组、标签快速查询筛选
 
公司可能拥有多条产品线或多个研发团队,每个团队负责内容不同。为避免相互影响,可通过流水线的分组和标签进行区分。差旅壹号产品线分机票、酒店、大交通、用餐等,分组按产品线区分,产品线内不同模块以标签区分。
 
 
5、流水线改进
 
流水线运行一段时间后,差旅壹号做了部分改进,如将线上配置文件修改纳入流水线管控,通过流水线发布;集成python自动化接口测试,部署后,自动触发python自动化测试脚本并产生测试报告;集成SonarQube,加强代码安全扫描。

结语

云效是一款非常不错的产品,它与阿里云产品深度融合、功能丰富、配置简单,并一直在不断地优化和完善。企业能够基于流水线提供的能力快速且低成本地搭建一套适合自己的流水线。差旅壹号也借助云效,实现了企业产品快速创新迭代和研发效能升级。感谢云效产品的赋能以及实施过程中云效同事的支持。以上内容只是差旅壹号在实施后的一些拙见,希望能给各位同行带来一点帮助。
 
 
 阿里云 云效 点我立即体验云效DevOps全家桶!
 
 
 

有关3分钟,480条流水线,云效DevOps全家桶再为差旅壹号节省6台服务器!的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  3. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  4. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  5. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  6. ruby - Rails 开发服务器、PDFKit 和多线程 - 2

    我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:

  7. ruby TFTP 服务器 - 2

    我将以下代码放在一起用于一个简单的RubyTFTP服务器。它工作正常,因为它监听端口69并且我的TFTP客户端连接到它,我能够将数据包写入test.txt,但我不只是写入数据包,我希望能够从我的客户端通过TFTP传输文件到/temp目录。预先感谢您的帮助!require'socket.so'classTFTPServerdefinitialize(port)@port=portenddefstart@socket=UDPSocket.new@socket.bind('',@port)whiletruepacket=@socket.recvfrom(1024)putspacketFile

  8. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

    在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

  9. Ruby 服务器在本地主机(teambox)之外非常慢 - 2

    我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby

  10. ruby - 如何停止 jekyll 本地服务器 - 2

    我刚刚在本地设置了我的第一个Jekyll项目。我已经让服务器运行,但我忘了使用自动标志。所以现在我想停止服务器并使用标志重新启动。但是,在我启动服务器后的命令行中,我没有得到新的提示,所以我无法输入任何新命令。我不太习惯命令行,所以我真的很感激知道我应该做什么!我正在使用MacOSX和terminal.app,如果有区别的话! 最佳答案 psaux|grepjekyll|awk'{print$2}'|xargskill-9 关于ruby-如何停止jekyll本地服务器,我们在StackO

随机推荐