介紹一種新的資源控制管理器:SCM-Manager
譯文【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】