CODE 官方博客

代码逐行评论,在线沟通更顺畅!

  继上次升级增加项目整体评论之后,现在我们又推出了针对提交内代码的逐行评论的功能。这一功能特别适合开发者间针对某一行代码进行讨论、纠错、评注等交流,将使远程协作的沟通更加清晰、顺畅。

  代码评论的操作非常简单:

  在项目首页点击“代码”——“提交历史”进入某次提交的代码文件。当鼠标指向某一行代码时,在该行代码的左侧会浮现一个“对话气泡图标”,点击该图标,在该行代码下方会展开评论的对话框,输入您的评论内容发布即可。

 

代码片评论

 

  一指(鼠标指向代码)、一点(点击评论图标),轻松交流!你和你的小伙伴们可以互相评论代码了~~

CODE平台的系统架构与安全架构

  这篇文章是开源大会上关于CODE平台介绍的完整版,其实早应该放在官方博客上的。里面详细讲述了我们平台选型过程和系统架构,希望能给对CODE结构有兴趣的朋友一些参考。

CODE系统架构

  CODE平台在初期经过一番调研后,我们锁定了几个Git服务的开源项目:Gitorious,Gitlabhq,Gitblit。其中Gitblit是java实现,具备核心功能,性能上有优势,但整体上不太成熟。Gitorious和Gitlabhq都是比较成熟的实现,并且和Github一样,都是基于RoR实现,可以共享很多开源资源。我们仔细比较了Gitorious和Gitlabhq,整体上来说软件架构很像,都使用Grit访问Git仓库,都是用RoR。虽然Gitorious的功能更加完整,但Gitlabhq很好的使用了各种开源Rails插件,如,用Devise实现登录,用SIX实现权限管理,用Grack实现Git over Smart HTTP,Bootstrap作为前端框架等,代码整洁易懂。代码好维护是软件工程中太重要的一个衡量指标了,虽然当时Gitlabhq4.2还使用Gitolite作为Git仓库管理,是个必须改造的累赘,经过权衡,我们还是选择了Gitlabhq作为我们基础来实现。

  系统架构如下:

 

系统架构

 

  作为Git服务,功能上就是要实现Git仓的Web访问和比较常用的三个协议:SSH, Git, Smart HTTP。Web访问就不用说了,就是Git仓的WEB展现。SSH因为其安全性,基本上是使用Git开发者进行pull/push最常用的协议。 Git协议只支持Clone,因为其效率最高,深受喜爱。Smart HTTP则最方便,而且使用最通用的80端口,不会被公司防火墙屏蔽。功能上来讲,实现起来问题不大。仔细考虑一下,就会发现其中最大的难题,在于解决大规模部署,数据安全,动态扩展等平台维护功能上。

  作为Git公众服务,不可避免的Repos会非常的庞大,并且随着用户量的增加需要动态的扩展。对此,常规的有两种方案:

方案

 

  方案1:使用分布式文件系统:

  系统由多个Server和一个分布式文件系统组成, 由负载均衡器负责随机分发用户的各种请求给每个Server。每个server实现所有的Git服务(WEB, SSH Listener, Git Listener, Smart HTTP Listener),所有的server可以共享一个分布式文件系统。通过Posix挂接到Server的特定路径。DFS可以根据需要动态的扩展,也负责数据容灾和高可靠性。

  方案2:使用分布式后端:

  系统由前端(FE)和后端(BE)组成。后端保存所有Git仓库,负载均衡把用户请求平均分配给前端,前端根据请求类型,分别通过远程调用、透明代理访问后端的Git仓库。

  分布式文件系统实现起来比较简单,但考虑到目前分布式文件系统都只适合于大文件的存储,而Git恰恰都是大量的小文件操作,性能以及存储利用率都非常成问题。所以我们选择了分布式后端的方案。分布式后端充分的使用了所有后端机器的计算能力,需要实现Grit库的远程调用以及SSH, Git的代理,后端路由表,而且为了实现高可靠性,每个后端都必须是一对,提供服务的高可靠性以及保证数据安全。

  到此,我们可以逐个功能分析一下工作原理:

  1. Web访问。用户提交请求, 首先会到达负载均衡。负载均衡会把用户请求发送到任意一个前端,前端运行Web服务器,我们的Rails应用会处理用户的请求,根据用户请求的Git仓库, 查询到仓库所在的后端。通过Grit远程调用访问后端数据,然后变为HTML展现给用户。

  2. SSH访问。 Git over SSH通过publickey鉴权,用户执行git命令后,Git客户端会把相应的Git命令,用户的publickey,以及访问的Git仓库名发送给服务器。请求首先会到达负载均衡。负载均衡会把请求发送到任意一个前端,前端有一个经过我们改造的OpenSSH的服务,首先会根据请求中的publickey,仓库名以及git命令到数据库中查询权限,如果允许,前端则通过路由查询到Git仓所在的后端,并且把SSH连接代理到相应的后端,后端SSH listener完成数据读取,通过前端的SSH代理传给用户。

  3. Git 访问。Git协议用来Clone公开的仓库。同样用户执行git命令后,Git客户端会把相应的Git命令,访问的Git仓库发送给服务器。请求首先会到达负载均衡。负载均衡会把请求发送到任意一个前端,前端有一个我们的Git Daemon服务,该服务首先检查所访问的仓库是否是公开仓库,若是,则把把请求代理到相应的后端执行。

  4. Smart HTTP访问。 HTTP协议的代理和负载均衡都比较成熟,同理可以很容易的实现Smart HTTP的处理。

  不难分析出搭建系统的一些要点:

  • 负载均衡需要支持HTTP, SSH, Git等协议。我们在选择了LVS后,惊喜的发现,阿里云的LBS完全能够满足以上协议,使用之。

  • 需要改造OpenSSH,使它能够支持大量的用户使用Git的功能。主要是存储Publickey采用数据库,和Git系统的结合接口。我们通过改造OpenSSH完成。

  • 需要实现Git Daemon,因为Gitlabhq没有支持Git协议,Git自带的Git Daemon性能不适合于大并发,我们自己用GO语言实现了一个Git Daemon。GO语言作为能够处理高并发的高级语言,其开发效率和Ruby可以媲美。我们已经开源了此项目: https://code.csdn.net/CSDN_Code/code_git_daemon ,欢迎大家一起完善。

  • 需要实现SSH 和Git Proxy,完成前端到后端的透明代理。

  • Grit 远程调用,完成前端WEB应用对后端Git仓库的访问。

  • Grit库的优化以及中文支持。在实现过程中,我们发现Grit库对中文支持不够好,中文文件名,中文Branch以及Tag等都存在问题。如果使用Gollum,会发现wiki页面也不支持中文名。我们都对此专门进行了修改。同时Grit在有些方面性能也有很大的瓶颈。我们也在Github上对我们所做的修改推送给了原项目,如果Grit库的维护者接受了我们的修改,大家就能看到一个全面支持中文的系统了

 

CODE安全架构

  作为代码托管服务,系统的安全性是需要特别着重考虑的因素之一。其中最为重要的,莫过于用户数据的健壮性,我们在此方面上了三道保险:

 

  安全架构

图:CODE平台安全架构

 

  在基础平台安全层面,我们从物理安全,网络安全,系统安全三方面给予CODE平台最牢靠保障。首先,CODE采用阿里云的存储,保证数据同时有三份,定期备份同步用户数据到备份服务器,在某些灾难情况下也可以恢复用户的数据。其次,CODE采用具备负载均衡及双机热备功能的设备持续提供网络服务,其强劲的网络防护设置能有效防护各类网络攻击,并实时网络状态监控。再次,CODE拥有持续的端口入侵扫描,挂马扫描,漏洞扫描防护,保证系统最新补丁持续及时更新,实时的系统状态监控,有效防止过载及溢出错误。

  在中间应用安全层面,CODE提供多种安全传输协议,对各应用均进行特定的安全加固,实行实时应用服务状态监控,以最大限度的保障应用安全。每日的数据都有多份备份副本,并实施安全的数据访问控制,各用户数据相互独立,实时用户数据操作记录以保障数据安全。口令安全方面,CODE采用统一的网站登录方式,存储及登录时均使用加密操作,并提供用户对SSH协议key的自行管理。

  在管理安全层面,CODE使用了堡垒机机制,具备完整的安全管理操作策略及手册、完备的应急恢复策略和详尽的日志审计,保证所有的操作人员的操作权限明确,并且都有纪录可查。全站使用了HTTPS协议,保证各协议接口都安全可靠。

  我们正在奋力打造一个具备完美功能的代码托管平台,现在代码片、组织等功能已经上线,代码搜索、客户端还有一些我们认为适合中国开发者的功能,也会逐步和大家见面。

 

  接下来还希望大家多多鼓励,多多帮助,可以给我们开issue,也可以在论坛发表意见。 当然还可以通过派生我们的项目加入我们的开发。让大家一起努力打造中国良好的生态环境!

重大更新:CODE支持“组织”账号啦!

  使用CODE平台进行在线协作,对于很多企业和团队来说,拥有统一的组织账号,对项目和开发团队进行统一管理是很有必要的。在本次版本升级中,CODE平台就加入了“组织”这一重要功能。

  现在起,用户可以在CODE平台上创建自己的组织了。一个组织可以创建多个项目,也可以建立多个团队,其中每个团队都被赋予一定的项目权限,针对不同的项目,不同的团队将会有读写、只读等权限的区分。组织中的成员可以属于不同的团队。

  组织帐号是不能单独登陆的,组织的创建者和管理员登录后可以切换到组织进行管理。

 

什么样的人需要使用组织?

      ▪  大型的开源项目

      ▪​  企业

      ▪​  大型的开发团队

组织中的“团队”

  团队是为了在组织中划分权限而设定的,可以理解为是对某些项目拥有一定的权限的人群的集合。团队分为管理员团队和普通团队。

  其中管理员团队是组织中默认建立的,他可以修改组织的信息、创建及管理其他的团队(添加成员和项目)、创建及管理组织的项目。只有组织的创建者可以添加及删除管理员。

 

普通团队按照权限可分三种:

    ▪  管理和读写权限, 像项目主人一样拥有项目的管理和读写权限,能够设置项目,如修改名称、描述信息、项目公钥等。

    ▪  读写权限,对项目进行pull 和 push操作

    ▪  只读权限,对项目进行pull操作。只读权限对于公开项目是没有意义的,因为默认所有人都对公开项目有读的权限。

创建组织

  在CODE顶栏右侧的快捷方式中您可以发现“创建组织”的选项。

组织

 

  一个用户可以创建多个组织。其中组织的名称是必填项,它必须是唯一的,支持字母、数字和下划线,不能使用中文。这一名称将被用在组织访问的url和项目的命名空间。您还可以为组织添加公开邮箱、微博、QQ、主页、组织介绍、头像等信息,这些是可选项。

 

  组织

删除组织

  只有组织的创建者拥有对组织的删除权限。

  在“组织设置——组织信息“页面最下方,创建者可以见到如下图所示的”组织管理“界面,您可以在此修改组织名称、删除组织等。需要注意的是,这两项操作都有极大风险,请谨慎处理。

 

组织

 

创建团队

  组织创建成功后将进入到组织的控制面板。您也可以从用户的控制面板切换到组织的控制面板(如下图)。

 

组织

 

  在组织控制面板,点击“组织设置”按钮,将进入“组织信息”、“团队管理”、“成员管理”、“安全日志“的设置界面。

  在团队管理中,您可以看到默认已经有一个组织的管理员团队了。你可以点击新建团队,输入团队的名称,选择团队的权限,保存后就可以完成团队的创建。

  接下来,就可以为团队添加成员和项目了:

    ▪  输入您要添加的成员,点击添加,如果该成员已经加入组织则直接添加成功,如果该成员还未加入组织,您将收到提示是否邀请加入,确认后对方将收到邀请通知,对方接受后便加入到组织团队。

    ▪  在项目选择栏中输入组织已有的项目添加到团队中,这样团队的所有成员都将拥有刚才设置的权限来访问项目了。

组织

 

离开组织

  如果您由于某种原因想离开一个组织,在个人的帐号设置中选择组织,这里列出了您加入的所有组织,在组织上点击离开即可离开组织。

 

组织

 

在组织和个人间切换

  有了组织之后,有时就需要用组织和个人两种不同来身份进行操作,如创建项目等操作,你可能需要在组织和个人间切换,以下介绍几种身份切换方式:

    ▪  在控制面板中可以直接切换个人和组织

组织

 

    ▪  创建项目时可以选择是为组织创建还是个人

组织

 

    ▪  派生一个项目时可以选择项目派生给组织还是个人

组织

 

  目前,CODE平台上的组织默认不包含私有项目功能,这部分功能将稍后加入。

有了Web Hook,项目提交更智能!

    Web Hook 是对提交的扩展钩子, 设置了Web Hook, 当项目收到新的提交时,就将提交的信息发送到您设定的URL上, 以触发其他操作。在CODE平台,使用HOOK程序可以让你自由的设置提交信息的触发动作,让项目提交和其他操作的集成变得更简单、更智能!
    当您执行push操作将更新提交到repository时,我们首先将这次push的信息和commits的内容生成一个json格式的body数据对象,然后通过发送POST请求到您的Web URL地址。


body
    我们会使用一个单独的“body”作为POST请求中的参数,参数中的commits数组部分,最早的提交在最上面,最新的提交在最下面。

    下面是body数据例子:

hook

 

设置
    我们推荐使用 RequestBin 测试我们的WebHook, RequestBin 具体用法如下:

    1、访问 http://requestb.in 点击 'Create a RequestBin'

 

 hook

 


    2、拷贝系统提供的URL地址

 

  hook

 


    3、登录CODE系统,进入目标项目的设置页面

 

 hook

 


    4、点击“Hooks” 菜单

 

hook

 

  
    5、点击 “WebHook”子菜单项

 

hook

 


    6、粘贴您拷贝的 RequestBin URL地址并“添加”

 

hook


  
测试
    在您的客户端修改文件并执行 push操作,提交到CODE 系统中,或直接点击WebHook 页面的“测试Hook” 按钮。然后返回您的 RequestBin 页面并刷新,您会看到新的POST参数:


  hook

 


    怎么样,是不是很酷?快去设置一下吧~~

你使用了哪些开源技术,快去标注出来吧!

    开源软件和开源技术为我们的开发工作带来了极大的便利,正是有了它们,开发者们才避免了“重复造轮子”,节省了大量时间。
    收获的同时也要积极回报,这就是开源精神。除了参与开源项目,在您使用开源项目的时候给出项目来源也是推广开源、尊重版权的一种方式。
    在本次的版本升级中,CODE平台就为项目加入了“项目引用”的功能。如果您在项目开发中使用了某些开源技术,可以直接项目首页的“项目引用”中将其标注出来,让更多的人了解这些无私的开源技术,同时,也方便同样使用该技术的开发者与您交流!


添加“引用项目”
    在项目首页,点击“项目引用“的标签,您可以添加和查看当前项目引用了哪些开源项目和开源技术。
    点击“添加新项目”的绿色按钮,在弹出框中填入项目名称、项目url地址,和简单的项目描述,提交即可。

 

引用项目


 
    添加完成后的效果如下图所示:

 

引用项目


 
搜索“引用项目”
    我们还同步更新了CODE的搜索技术。如果您在搜索框中输入某个开源项目的名称,如 “Six”, 在搜索结果中,除了列出相关项目外,还会列出所有标注了使用“Six”开源项目的项目。

 

引用项目

CODE支持项目评论了,亲,给个好评吧!

    用户的评价和看法对一个项目来说是很重要的反馈: 项目作者通过评论可以了解项目的受欢迎程度,收集用户意见;旁观者则可通过评论了解一个项目是否有价值、存在哪些优点和缺点。
    之前CODE平台的评论功能是仅针对项目中单个文件的单次提交的(点击代码文件的“提交信息”或“提交编号”时才可以看到最下方的评论框),这种评论方式的好处是方便用户就单次提交出现的问题进行反馈,但对想了解项目整体情况的人来说,则不容易发现这些反馈。
    现在,CODE平台加入了“项目整体评论”的功能,你可以对项目的整体构架、项目价值等方面做出整体评价了!


评论添加方法如下:
    进入项目首页,在“介绍”内容下面,您可以看到一个评论框。
    直接输入内容,点击“增加评论“就可以发表您对项目的总体看法。


 项目评论

 


    任何人均可对公开项目添加评论。项目所有者和有写权限的项目成员可以管理评论内容,如删除一些恶意的评论等。


    现在,快去给你喜欢的项目加个“好评“吧~

CODE代码片功能登陆CSDN博客,代码分享风暴来袭!

    前不久CODE推出了代码片功能,如大家所知,此功能除了能存放和管理代码片之外,还有一个很重要的特点就是可以在网站和博客中引用代码片。

    CSDN博客今天就加入了“引用CODE代码片”这一功能。现在,只需点击一个小小的按钮图标,你就可以很方便的在CSDN博客中插入引用的代码片了。

下面来看看具体的操作步骤:
    您在编辑博客时,如果想插入一段来自CODE代码片的内容,复制其代码片的嵌入脚本(如图示):

博客引用代码片

 
    点击博客编辑框的“引用CODE代码片”图标(如图示),将复制的内容粘贴在此框中,确认即可:

引用代码片


     插入引用地址后,在文章编辑器中会显示形如{CSDN:COED:27}这样的一段代码,如图

 
    文章发布后的实际显示效果如下。点击代码片底部的“C”图标可以链接到该代码片在CODE平台的托管地址。

 
    如上操作,便轻松完成了在博客中插入代码片的操作。快来试试吧。

CODE平台代码片功能上线,快来分享你的代码吧

  收藏或托管一段代码,在外部程序中引用一段代码,这些对于开发者来说都是很常见的操作。为了方便大家进行代码管理, CODE平台今天推出了备受期待的“代码片”的功能。

  使用代码片功能,您可以:

  •     很容易的创建、分享一段代码
  •     在其它网页中引用代码片的内容
  •     使用Git版本库维护代码片段
  •     搜索发现精彩的代码片段
  •     称赞和派生您喜欢的代码片
  •     对代码片进行讨论

  下面,我们就来看看代码片功能如何使用:

  1、创建一个代码片

  在用户面板页的“代码片”中点击“创建代码片”就可以创建您的代码片

代码片

  输入代码片的描述和文件名,编辑器会根据文件后缀名自动选择编程语言,您也可以强制选择某中变成语言。然后您可以在编辑器中输入你的代码,或者直接拷贝现有的代码,语法将高亮显示。

  一个代码片可以包含多个文件,如果想新增加文件只需要点击“添加文件”即可。

代码片

   2、查看代码片

  代码片分为公开和隐藏两种。

  公开的代码片URL为数字,对所有人可见,用户可在CODE平台“搜索”和“发现”中找到公开的代码片。

  隐藏的代码片URL为20位16进制的哈希值,隐藏代码片无法被“搜索”或“发现”,但用户可直接通过其URL访问和查看该代码片。

  3、管理代码片

  一个代码片本身就是一个Git仓库,其支持SSH、Https、Git三种协议的访问,您可以使用 git clone 将代码片的仓库克隆到本地,如

  git clone git@code.csdn.net:snippets/37.git

  进行编辑后再push 到CODE平台。

  您也可以像查看其他Git仓库一样查看代码片的历史版本及操作记录。

  代码片还支持派生、称赞、搜索、发现等操作。

  4、引用代码片

  需要的时候,您可以在外部网站引用CODE平台上的代码片,具体操作如下:

  在代码片页面,可以看到“嵌入脚本”的链接,如

  <script src="https://code.csdn.net/snippets/37.js"></script>

代码片

  拷贝这个链接并加入到其他网页,如个人博客(需要支持在网页内运行js脚本),即可在相应的网页中嵌入该代码片,并保持语法加亮等功能。

代码片

  好啦,以上就是代码片功能的基本操作。现在就去上传你的代码片,分享你的代码吧!

使用项目公钥部署代码到服务器

  SSH协议是一种非常常用的Git仓库访问协议, 使用公钥认证、无需输入密码, 加密传输,操作既便利又保证了安全性。

  为某个用户帐号配置公钥后,用户就可以使用SSH协议访问CODE平台上的Git仓库。

  今天,CODE平台最新推出了项目公钥功能,方便您直接从服务器端向CODE平台推送代码。

  什么是项目公钥?

  项目公钥是为一个项目的部署服务器设置的。

  在没有项目公钥的情况下,如果要使用SSH协议把CODE平台的代码部署到服务器上, 或者在服务器上向CODE平台推送代码,就需要为服务器额外使用一个用户帐号。

  有了项目公钥功能后,您可以直接把服务器的SSH公钥添加到项目设置中,这样服务器就可以直接访问CODE平台的项目代码了。

  如何添加项目公钥?

  进入某个项目的项目设置页面,点击右侧栏的“项目公钥”标签,点击“添加公钥”按钮,将部署服务器的公钥粘贴到输入窗口中然后点击“保存”即可。

项目公钥

  添加完成后,就可以从部署服务器用SSH协议来访问远端的代码仓库了。

  一个项目可以设置多个项目公钥。您也可以随时删除或者新增公钥。

  好了,关于公钥管理,有更好的建议或想法欢迎随时向我们反馈。更多新功能,请持续关注CODE平台博客~

CODE平台支持在线创建文件啦

  上个Sprint我们推出了在线编辑文件的功能,现在您又可以在线创建一个新文件了!

  如何创建:

  进入您的项目代码页面,您会看到在代码文件列表上方的项目名旁边有一个带“+”号的文档标志,点击该标志,将会在线创建一个新文件。

在线文件

  在弹出的新页面里输入文件名称、文件内容、描述信息等,点击提交,新的文件就生成了。

在线创建文件

  查看提交历史,您会看到有一个新的提交,内容就是刚刚创建的新文件。

  怎么样?是不是很简单?

  晚些我们还会推出文件在线删除的功能,敬请期待!