草庐IT

如何用同一套账号接入整个研发过程?

云效DevOps 2023-03-28 原文

前言

“君子和而不同,小人同而不和。”-- 孔子

我们认为,对于任何一个有研发诉求的企业,账号体系都是需要尽早考虑、慎重对待,且不应该随意变更的。

问题类型

研发团队在设计账号体系和管理账号的时候经常会遇到各种问题,比如:

问题1:

业务在变化,组织也要随时调整,导致与之相应的账号权限也要频繁调整:

在企业业务高速发展的大背景下,为了适应业务变化,企业的组织架构经常会进行调整,研发人员也会在不同的业务中来回切换,甚至在不同的业务中会承担不同的角色。因此,设计账号体系的时候,需要考虑账号权限能灵活调整、即时生效,避免因为权限缺失阻碍研发活动,或是因为权限泛滥引起安全风险。

问题2:

研发活动中存在多种角色,一个账号也包含多个角色,账号与角色的对应关系不好维护:

现代研发体系下,一次需求交付涉及多个角色,比如产品经理、后端开发、前端开发、UED、测试、应用运维等,不同的角色有不同的关注视图和权限,而同一个账号又会承担多个角色,比如同时承担后端开发与应用运维的工作。因此,账号与角色的对应关系是多对多,且会随着业务变化的,如何有效维护,也是一个需要考虑的问题。

问题3:

不同的工具有各自的账号系统,需要分别对接,且经常需要维护以适应组织调整和员工变化:

为了保证业务的高效演进,企业需要购买和自研大量的工具和系统,为了让这些系统协同工作,需要进行账号体系的对接,并且保证组织的调整和人员的变化,能及时同步到这些系统上,避免数据不一致带来的协作问题。因此,企业的账号体系需要做到唯一来源,标准化接入。

我们推荐的企业账号体系应该满足如下几点要求:

  1. 企业的所有角色都有唯一的账号管理来源

  2. 企业的各个系统(包括研发系统与一般业务系统)的账号统一且互通

  3. 企业可以管理和维护自己的组织架构,并能根据组织架构在各个系统中管理权限

  4. 企业可以定义和管理研发活动中的各种角色,为每种角色定义权限

  5. 企业可以通过为账号配置角色来控制账号权限

  6. 企业的各类研发资产都能纳入权限管理,并能被角色管理

我们基于阿里云的产品,来具体看一下如何建立符合上述要求的企业账号体系。

以钉钉为中心的账号体系

对于没有过多历史包袱,或者已经在使用钉钉的企业,我们推荐以钉钉为中心的账号体系。

在这一账号体系下,企业所有成员(包括研发团队与业务团队)都在钉钉上建立和管理组织架构。研发成员通过钉钉认证登录系统,获取成员在系统中的角色信息,根据所属角色的权限进行研发活动。

因此,从实施的角度,企业基于钉钉建立研发账号体系包含4个步骤:

1.企业基于钉钉管理组织结构

第一步是注册钉钉并创建或关联已有企业,接下来在钉钉中管理企业的组织结构,包括人员和团队信息等,请参考钉钉企业通讯录管理,这里不作赘述。钉钉账号将成为企业成员的唯一认证来源,企业的各个系统都可以和钉钉打通,请参考钉钉应用接入指南完成企业各个系统的接入。

至此,对于研发团队来说,主要的两个诉求还都无法满足:

  1. 授权和管理云上的资源(如ECS、ACK等)

  2. 打通整个研发工具链

为了解决这两个问题,我们需要将钉钉与云效集成起来,通过集成,可以实现:

  1. 同步组织架构和成员到云效中

  2. 通过钉钉消息进行研发协作

  3. 集成钉钉文档到云效中

  4. 使用钉钉中的云效小程序 

2.云效绑定企业钉钉

集成的第一步是云效企业的管理员需要将云效绑定企业钉钉,完成组织架构和成员同步。详细操作步骤可以查看企业绑定-完成组织架构和成员同步。这里把主要步骤说明一下。

  1. 企业钉钉管理员在钉钉中安装云效应用,选择正确的组织和使用范围(是全员还是某个团队)。

2.云效企业管理员在钉钉的云效应用中绑定钉钉企业和云效企业,管理员如果未绑定阿里云账号的话,需要先完成

3. 员工钉钉账号管理阿里云账号

操作再返回继续。管理员在钉钉云效应用中完成云效企业绑定,如下图。

3.员工钉钉账号关联阿里云账号(主账号、RAM账号)

阿里云有自己的账号体系,而这些账号又跟云上资源的操作权限相关,为了保证权限的有效隔离,云效要求员工使用钉钉账号认证前先绑定阿里云账号。

阿里云账号分为主账号和RAM账号,关于RAM可以查看什么是访问控制。如果不确定,对于企业员工,我们建议选择RAM账号。

完成绑定后,员工就可以通过钉钉扫码登录云效了。

4. 配置云效企业角色和角色权限

我们推荐按角色管理权限,将人与角色分开,为不同的角色定义不同的权限。

4.1,定义企业全局角色,默认企业角色分为:拥有者、管理员、成员和外部成员,可以按照自身特点添加和调整角色权限。

4.2,定义应用交付平台 AppStack的企业角色权限。所看到的企业角色都来自于企业全局角色,但是可以为其定义应用交付平台特有的全局权限,见下图。注意,这里的权限是针对于所有应用的。

4.3,定义应用交付平台 AppStack的应用角色权限,这些权限只针对某个具体应用。AppStack定义了5种应用角色:应用拥有者、应用负责人、开发、测试和运维,可以根据需要调整每种角色的权限。

4.4,为每个应用成员配置对应的角色。

总结

在现代组织中,业务相关的研发人员都有两个维度的角色:一是组织职能角色,一是业务角色。其中组织职能角色是相对稳定的,而业务角色是在不断变化的。我们推荐以钉钉为核心管理组织账号和组织架构,将云效与钉钉绑定,做到统一登录、统一管理。同时,定义不同的角色,并按照应用维度为不同的人员配置对应的角色,做到按应用维护角色、按角色管理权限

延伸内容

以现有内部账号系统为中心的账号体系:

很多企业,虽然独立的软件开发团队创建不久,但企业内部IT系统已经运作很长时间了,有自己的账号管理体系(如LDAP),或者因为网络安全等原因,权限认证必须在自有网络中完成。这种情况下,直接切换到钉钉这样的系统的成本比较高,而企业又希望与云上研发的工具和资源打通。对此,我们建议配合阿里云iDaaS一起使用,具体方案详见iDaaS的说明,本文不再赘述。

参考

关于我们

了解更多关于云效DevOps的最新动态,可微信搜索关注【云效】公众号;

福利:公众号后台回复【指南】,可获得《阿里巴巴DevOps实践指南》&《10倍研发效能提升案例集》;

看完觉得对您有所帮助别忘记点赞、收藏和关注呦;

有关如何用同一套账号接入整个研发过程?的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  3. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  4. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  5. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

    如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

  6. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  7. ruby 变量作为同一对象(指针?) - 2

    >>a=5=>5>>b=a=>5>>b=4=>4>>a=>5如何将“b”设置为实际的“a”,以便在示例中,变量a也将变为4。谢谢。 最佳答案 classRefdefinitializeval@val=valendattr_accessor:valdefto_s@val.to_sendenda=Ref.new(4)b=aputsa#=>4putsb#=>4a.val=5putsa#=>5putsb#=>5当您执行b=a时,b指向与a相同的对象(它们具有相同的object_id).当你执行a=some_other_thing时,a将指向

  8. ruby - ruby 中的同一个程序如何接受来自用户的输入以及命令行参数 - 2

    我的ruby​​脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes

  9. ruby - 如何用 Nokogiri 解析连续的标签? - 2

    我有这样的HTML代码:Label1Value1Label2Value2...我的代码不起作用。doc.css("first").eachdo|item|label=item.css("dt")value=item.css("dd")end显示所有首先标记,然后标记标签,我需要“标签:值” 最佳答案 首先,您的HTML应该有和中的元素:Label1Value1Label2Value2...但这不会改变您解析它的方式。你想找到s并遍历它们,然后在每个你可以使用next_element得到;像这样:doc=Nokogiri::HTML(

  10. ruby - 在 factory_girl 中有没有办法获取 attributes_for 并为同一个实例元素创建? - 2

    如果我想使用“create”构建策略创建和实例,然后想使用“attributes_for”构建策略进行验证,是否可以这样做?如果我在工厂中使用序列?在Machinistgem中有可能吗? 最佳答案 不太确定我是否完全理解。而且我不是机械师的用户。但听起来您只是想做这样的事情。@attributes=FactoryGirl.attributes_for(:my_object)my_object=MyObject.create(@attributes)my_object.some_property.should==@attributes

随机推荐