【51CTO.com快译】如果您和您的团队正在使用Git或Subversion之类的源代码控制管理系统(source control management,SCM),您可能会需要一个管理层,以恰当的方式去管理用户的访问和存储库。目前,GitHub、GitBlit、以及GitLab等都是该领域流行、且强大的管理方案。当然,如果您计划使用Jenkins之类的自动化服务器,去创建自己的构建和部署管道的话,则还需要托管自己的存储库管理器。
当然,客观而言,GitLab等方案不但管理起来非常复杂,往往需要一定的实践经验;而且为了保持良好的运行性能,往往对硬件资源的要求并不低。因此,为了克服这些困难,我们可以考虑引入的工具--SCM-Manager[1]。它不但简单、可扩展,而且运行起来快速且高效。
SCM-Manager是一款德国制造的工具。由于在MIT的许可下是开源的,因此它允许被用于商业用途,而且其代码可以在GitHub上获取到。该项目最初只是被用于研究目的,而在其2.0版本之后,被Cloudogu公司接手管理和开发了其各种代码库,以便为各个公司提供专业的企业级支持。
从安装开始
下面,让我们来领略一下其简单的安装步骤。为了快速获取结果,您可以使用其官方的Docker容器[2],并输入如下简单命令。
- docker run --name scm –restart=always \
- -p 8080 -p 2222 \
- -v /home/<user>/scmManager:/var/lib/scm \
- scmmanager/scm-manager:2.22.0
首先,让我们基于SCM-Manager的2.22.0镜像,来创建一个名为scm的容器。然后,我们需要让容器能够跟随着主机操作系统的重新启动而自动重启。同时,为了让它能够被访问到,我们需要打开端口2222和8080。最后,我们需要在容器内挂载一个存储了所有配置数据和存储库的目录。
当然,您也可以参照如下安装清单,通过使用apt,让SCM-Manager能够在Ubuntu之类的Linux服务器上运行起来。
- echo 'deb [arch=all] https://packages.scm-manager.org/repository/apt-v2-releases/ stable main' | sudo tee /etc/apt/sources.list.d/scm-manager.list
- sudo apt-key adv --recv-keys --keyserver hkps://keys.openpgp.org 0x975922F193B07D6E
- sudo apt-get update
- sudo apt-get install scm-server
此外,SCM-Manager也可以被安装在Windows或Apple等系统上。您可以在对应的下载页面[3]上,找到与各种系统相对应的安装信息。如下图所示,在执行安装时,您会在控制台中,看到各种带有启动令牌的日志条目。
图 1:命令行中的启动令牌
接着,就可以打开浏览器,并输入localhost:8080。您可以在其中通过创建并初始一个管理帐户,以完成安装。如图2所示,您需要从命令行处粘贴启动令牌,并在提交了初始化表单之后,重定向到登录页面上。这些前期准备估计将在5分钟之内完成。
图 2:初始化页面
如果您想尝试完整的、非值守式安装脚本,可以使用系统属性scm.initalPassword,绕过初始化表单。它将使用给定的密码,去创建一个名为scmadmin的用户。
在旧版本的SCM-Manager中,其默认的管理员登录帐户是scmadmin,密码为scmadmin。从安全角度来说,如果该帐户不在安装后手动禁用掉,则会给系统引入较高的风险隐患。不过,值得庆幸的是其2.21及其以后的版本,都改进了该安全漏洞。
插件
SCM-Manager可以通过插件的扩展,来实现最小化安装,并添加更多的实用功能。值得注意的是,随着已安装插件的增多,SCM-Manager需要获取的资源也会增加。因此,您的开发团队需要根据实际需求,排定插件的优先级和必要性。
图 3:已安装的插件
您可以通过管理(Administration)选项卡,按需进行插件的安装。如果您看不到该选项的话,则可能是因为您没有获取管理权限。在界面的右侧菜单中,您可以找到相应的插件入口。该插件菜单分为:已安装和可用,两个部分。为了更好地方便浏览,各种插件已按照管理(Administration)、授权(Authorization)和工作流(Workflow)等进行了组织与分类。而且,每个插件都配有简短且精准的描述。其中会包含一些预安装的插件。例如,在源代码管理类别中,支持存储库类型的Git、Subversion和Mercurial,都是无法被卸载的。
而在授权部分中,路径写保护(Path Write Protection)、分支写保护(Branch Write Protection)、以及标签保护(Tag Protection),都是对于构建和配置管理器非常实用和易于安装的插件。
特殊权限
让我们假设有一个Java/Maven项目。其规则是,只允许特定的人员去更改pom.xml的内容,并构建相应的逻辑。对此,我们可以通过路径写保护插件来实现。具体而言,在完成安装之后,请导航到代码存储库,并在界面的右侧菜单中选择设置(Settings),然后单击选项路径权限(Path Permissions),以启用该复选框。
图 4:配置路径权限
如上图所示,我创建了一条规则:只有用户Elmar Dott才能修改pom.xml。而且,该权限涵盖了所有的现有分支。由于其反向权限是排他的,因此如果文件或路径表达式不存在的话,该规则将无法被创建。为了便于管理,我们会将现有的用户进行分组。
据此,当您的团队使用大量分支或git-flow分支模型时,您可以通过该选项,保护各个分支免受不必要的更改。同时,那些拥有开发者分支的个人开发者,将仅有写入权限;而配置管理团队成员,则拥有运行CI/CD管道的发布分支权限。
拉取请求
让我们来讨论另一个实用的功能—审查插件(review plugin)。该插件能够为您的存储库启用拉取请求。完成了审查插件的安装之后,在您的存储库菜单中,会出现一个名为Pull Requests[4]的新的项目符号。
最初,拉取请求是为了让开源项目保证代码质量而设计的。这种范式的另一个名称叫做独断工作流(dictatorship workflow)[5]。每个开发人员都可以将各自的更改提交到存储库处,而存储库的所有者将会决定把哪个修订版整合到代码库中。
让我们假设一个场景:如果你在GitHub上托管了自己的项目源,其他人想参与到您的项目中。那么,他们必须先将存储库分叉到他们自己的GitHub空间里。而在他们对该分叉存储库提交了某些修订后,就需要创建针对原始存储库的拉取请求。同时,作为存储库的所有者,您需要判定是否接受此类拉取请求。可见,拉取请求的方式可以被用作代码审查工具,进而真正地提高项目中的代码质量。
存储库管理
SCM-Manager结合了三种不同的源代码控制管理存储库--Git、Subversion(SVN)和Mercurial。虽然Subversion已显得有些过时,但是许多公司仍然必须使用SVN,去管理各种遗留的项目。毕竟将这些项目迁移到其他技术栈,所导致的风险或成本可能是高昂的。因此,我们需要拥有一个可以管理多个存储库类型的解决方案。
如果您正在使用SVN,那么请留意Subversion在其目录中是如何组织分支和标签的。通常,SVN存储库会使用如下文件夹进行初始化:
- 主干——类似Git中的主(master)分支。
- 分支——指向主干中已被分叉(forked)的修订,那些更改的代码可以被提交。
- 标签——类似没有新代码修订的分支。
而在Git中,您并不需要此类文件夹结构,毕竟分支的组织方式是完全不同的。与Subversion相比,Git(和Mercurial)是一个分布式的源代码控制管理系统,其分支失去了耦合。因此,它们一旦“过时”,则会被直接删除掉。
Readme
如果readme.md文件位于项目的根文件夹中,readme插件就会被激活。您在导航到存储库后,readme.md文件将以HTML的格式呈现出来。
图 5:存储库的readme.md呈现
如果您希望存储库的各项活动既可读、又可视化的话,则需要用到活动插件。它会在标题菜单中创建一个名为活动(Activity)的导航入口。在此,您既能够看到所有提交的日志条目,又可以进入已选修订的详细视图。
图 6:活动视图
类似TortoiseGit的客户端,此类视图也会包含一个比较和历史浏览器。而存储库管理器(Repository Manager)还会包含更多日常运作的细节。其中会有一个代码编辑器,能够允许您直接在SCM-Manger的用户界面中,对各种文件进行修改。
用户和组的管理
在SCM-Manager中,创建新用户其实非常简单。您只需切换到“用户(Users)”选项卡,然后按下“创建用户(create user)”按钮即可。一旦您填写了表单,并完成保存之后,将可以看到用户的相关概览。
图 7:创建一个新用户
至此,您已经可以看到新创建的用户了。接着,您需要管理用户的权限。目前新用户并无任何权限。若要更改,您只需单击新创建的用户名称,在用户的详细信息页面上右击,在菜单项上依次选择设置(Settings)->权限(Permissions)即可。您可以在此为用户选择恰当的权限,并在完成后保存更改。接着,您可以试着注销,并以该用户的身份重新登录,以确认其权限。
如果您需要管理大量的用户,则最好将其分组。我们可以通过标题导航中的组(Group)菜单项,来管理组的权限。您可以创建一个新的组,并从其右侧的菜单中,选择相应的权限。其具体配置形式,与用户管理的配置十分相似。如果您希望将现有的用户添加到特定组中,请切换到通用(General)标签,在其成员(Members)的字段中,搜索到该用户,进而使用添加成员(Add Member)按钮进行添加。最后,请记得提交表单,并保存所有的权限更改。
为了体现灵活性,SCM-Manager也允许同一个用户被添加到多个组(或角色)中。注意,请不要轻易将用户归并到过多的组中,以免用户继承了不该授予的权限。目前,SCM-Manager尚无法通过简要的概述,列举并查看哪些用户在哪些组中,继承了何种权限。希望其将来的版本会有所改进。
此外,除了SCM-Manager提供的内部用户管理,您还可通过插件,将应用程序与LDAP相连接。
小结
除了上面提到的SCM-Manager的基本功能,我们既能够使用其API去创建各种可执行的脚本,又可以让Jira、Timescale、以及Prometheus等基础设施工具与SCM-Manager相集成。此外,SCM-Manager还提供了Jenkins自动化服务器的插件。总之,如果您有兴趣的话,不妨试用一下这款全新的资源控制管理器。
文中参考
[1] https://www.scm-manager.org
[2] https://hub.docker.com/r/scmmanager/scm-manager
[3] https://www.scm-manager.org/download/
[4] https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests
[5] https://git-scm.com/book/en/v2/Distributed-Git-Distributed-Workflows
原文标题:Tooltime: SCM-Manager,作者:Elmar Dott
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】