将你的 Git 内部化

作者: John S. Tonello

如果您对微软收购 GitHub 感到担忧,或者如果您一直在寻找摆脱免费公共仓库的方法,或者如果您想加强您的 DevOps 工作,那么现在是时候考虑自行安装和运行 GitLab 了。它并不像您想象的那么困难,而且免费的开源 GitLab CE 版本提供了很大的灵活性,可以从头开始、迁移或升级到更全面的版本。

在当今的软件业务中,快速交付可靠的代码是必须的,而使之更容易的实践是任何组织 DevOps 工具集的一部分。Git 已跃升为版本控制工具的顶峰,因为它简单、快速且易于协作。

对于开发人员来说,像 Git 这样的工具不仅确保他们的代码得到备份并可供他人使用,而且几乎保证它可以被整合到各种第三方开发工具中——从 Jenkins 到 Visual Studio——使持续集成和持续交付 (CI/CD) 成为可能。编排、自动化和部署工具也很容易与 Git 集成,这意味着在任何地方的任何笔记本电脑或工作站上开发的代码都可以合并、分支并集成到已部署的软件中。这就是为什么版本控制仓库是软件开发和 DevOps 的未来,无论您规模大小,也无论您构建的是单体应用还是容器化应用。

Git 入门

Git 的工作原理是在每次提交时拍摄代码快照,因此始终可以使用每个版本的贡献代码。这意味着可以轻松回滚更改或查看不同贡献者的工作。

如果您在使用 Git 的环境中工作,即使您处于离线状态也可以完成工作。所有内容都保存在您工作站上的项目结构中,就像在远程 Git 仓库中一样,当您下次在线时,您的提交和推送会快速轻松地更新主(或其他)代码分支。

大多数 Git 用户(甚至是新手)都使用 Git 命令行工具来克隆、提交和推送更改,因为它很简单,而且对于近 2800 万开发人员来说,GitHub 已成为他们工作的实际远程 Git 仓库。事实上,GitHub 已经超越了仅仅是一个代码仓库,成为一个多方面的代码社区,拥有 8500 万个项目。这有很多代码。

GitLab 也越来越受欢迎,成为远程代码仓库,但它规模较小,并且自诩更专注于 DevOps,免费包含 CI/CD 工具。这两个仓库都提供免费托管帐户,允许用户创建命名空间,并立即开始贡献和协作。GitHub 和 GitLab 托管服务提供的图形浏览器界面使管理项目和项目代码变得容易,并且还可以添加 SSH 密钥,以便您可以轻松地从 Linux、Windows 或 Mac 上的远程终端连接。

要熟悉 Git 的工作原理,请在您的工作站上安装最新软件包,注册一个免费的 GitHub 或 GitLab 帐户并开始实验


$ sudo apt install git

如果您是 GitHub 专业用户,您可以加快速度,开始考虑您想要导入到 GitLab 的几个项目。当您准备开始构建本地 GitLab 部署时,这将使您获得一点先发优势。

GitHub 与 GitLab 的比较

GitHub 和 GitLab 的核心都是 Git,它们之间的共同点多于不同点,尽管 GitLab 在其免费版本中对私有仓库更为慷慨。UserSnap 的人们最近在一篇文章中出色地总结了这些差异。查看本文末尾的“资源”部分以了解更多信息。

对于本操作指南,您将部署 GitLab CE omnibus,这是一个功能齐全且免费的 GitLab 版本。如果您使用过 GitLab.com 上的免费在线版本,您会感到很熟悉。如果您只使用过 GitHub 并想在本地部署 GitLab CE 之前体验一下,请尝试在线版本的 GitLab,以感受一下差异。

如果您正在考虑完全迁移离开 GitHub,还需要考虑一件事:检查您使用的任何第三方应用程序如何与 GitLab 集成。由于底层都是 Git,因此 GitLab 很可能像 GitHub 一样容易集成,但检查一下也无妨。如果您仍然有疑问,请查看“资源”部分以获取 GitLab 的应用程序集成列表。

安装和部署 GitLab 的方法

本教程是关于在本地部署 GitLab CE,但在当今时代,肯定不止一种方法可以做到这一点。例如,您可以在您选择的全新 Linux VM 上安装 GitLab,这就是我在本操作指南中描述的内容,但您也可以从现成的虚拟机 .ova、Turnkey 模板、官方 Docker 镜像或来自 Kubernetes 的 Helm 仓库部署它。如果“内部”对您来说意味着公有云,GitLab 还为 AWS、Azure、Google Cloud Platform 和 Mesosphere 部署提供选项。

而且,如果这还不够,还有一些方法可以使用 Ansible、Chef、Puppet、Juju、Vagrant 等工具来自动化部署。在本教程中,我描述了在 Ubuntu 16.04 VM 上部署,但大多数说明都可以轻松地适应 Debian、CentOS、OpenSUSE 甚至 Raspbian for RPi。GitLab 为大多数现代 Linux 版本(包括 Raspberry Pi)提供了具体说明。

部署 GitLab CE

在开始 GitLab 部署之前,请考虑一下您将如何使用它。如果您在家用实验室中进行研究,您可以轻松地使用相对较小的 VM 和适度的存储空间。如果您正在考虑更强大的东西,请考虑驱动器容量和 DNS。GitLab 将信息存储在数据库中,并且效率很高,但如果您将拥有数百名开发人员和数百个项目,请考虑底层数据库将如何随着时间推移而增长。

如果您要部署到生产环境中,不用说您需要构建某种灾难恢复和业务连续性能力。毕竟,这是一个独立部署。如果您正在计划一些真正大的东西,请像对待任何需要保护的核心服务一样对待它。

话虽如此,GitLab 运行不需要太多资源,并且可以轻松扩展到单个应用程序服务器上的 32,000 个用户。

CPU

GitLab 根据您的部署规模推荐系统要求,一个核心最多支持 100 个用户,尽管 GitLab 承认您会遇到速度缓慢的情况,我可以证实这一点。最好为初学者提交推荐的最小两个核心。这将支持多达 500 个用户,并为 GUI 和 GitLab 服务增加流畅性。

内存

GitLab 建议处理多达 100 个用户的安装使用 4GB RAM。我测试了 2GB 和 3GB——这些是可能的选项——但性能受到了影响。内存更少可以工作吗?可以,如果您很少使用浏览器界面,而是依靠从命令行远程完成大部分工作,那么它可能就足够好了。如果您的 VM 主机真的内存不足,我建议从 2GB 开始,然后逐渐增加。

数据库

如果您开始安装时使用两个核心和 4GB RAM,您可以提交至少 10GB 的存储空间用于 GitLab 安装和数据库。我将我的 VM 设置为 16GB,效果很好。

默认情况下,GitLab 安装将部署 PostgreSQL 作为底层数据库,强烈建议使用 PostgreSQL 而不是 MySQL 和 MariaDB,因为这些数据库不支持 GitLab 的所有功能。如果您必须这样做,您可以使其工作,但最好使用 PostgreSQL。

最后,我的 GitLab 部署最终消耗的资源很少,当它运行时,VM 资源如图 1 所示。

""

图 1. 在 Ubuntu 16.04 VM 上运行的 GitLab,CPU、内存和存储空间最少

请注意,当 GitLab 处于空闲状态时,几乎不使用任何 CPU。当我运行远程推送时,CPU 使用率几乎没有超过 5%。

最后,我完成了准备工作,在我的 DNS 服务器上为我的 GitLab 主机添加了一个条目,以便我可以在安装期间设置 external_url 配置参数,并在克隆和推送项目时更轻松地访问主机。您可能可以通过编辑 GitLab 主机和工作站上的 /etc/hosts 文件来代替完整的 DNS 设置(如果您不想使用稍后描述的 OAuth 集成)。

安装详情

安装 GitLab CE 只需三个步骤。第一步是确保 Ubuntu 主机上安装了 curlopenssh-serverca-certificates


$ sudo apt-get install -y curl openssh-server ca-certificates

如果安装了 postfix,您的 GitLab 服务器可以发送电子邮件,或者您可以跳过此步骤,稍后配置外部 SMTP 服务器。

下一步是将 GitLab 软件包仓库添加到 Ubuntu apt 源,GitLab 提供了一个 bash 脚本,使这一步变得容易


$ curl -sS
https://packages.gitlab.com/install/repositories/gitlab/
 ↪gitlab-ce/script.deb.sh | sudo bash

对于 Ubuntu 16.04,如果您想手动添加,它会添加以下源


deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/
 ↪xenial main
deb-src https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/
 ↪xenial main

在软件包源就位并更新后,可以使用常规 apt 命令完成安装,该命令包含作为参数添加的 GitLab 主机的 URL


$ sudo EXTERNAL_URL="http://gitlab.example.com" apt-get
 ↪install gitlab-ce

请务必将其设置为您的主机的 URL。如果您想使用 HTTPS,您可以这样做,但您需要在主安装后完成几个步骤。请参阅“资源”部分,了解如何使用自签名证书或证书颁发机构提供的证书来执行此操作。整个安装过程只需几分钟,您就可以获得一个功能齐全的 GitLab 服务器,可以在您指定的 URL 上使用。

""

图 2. 安装后,GitLab 将在您设置的 URL 上可用。您将看到密码重置屏幕,然后进入主登录页面。最初使用用户名“root”登录。

设置用户和 SSH 密钥

以“root”身份登录后,我做的第一件事是进入管理设置(可以从主导航栏中的小扳手图标访问),并创建一个用户帐户。我给它起了与我的 GitHub 帐户相同的名称,以保持一致性,并使以后同步 GitHub 和 GitLab 仓库更容易。创建新用户后,我注销并使用该帐户重新登录。

与 GitHub 一样,您需要设置至少一个 SSH 密钥,以使您能够在工作站和 GitLab 服务器之间建立安全连接。在 GitLab 控制台中,导航到“Settings”和“SSH Keys”;控制台会显示在哪里可以找到您现有的密钥或如何创建一个密钥,并警告您只粘贴 .pub 部分。

""

图 3. GitLab 提供了关于如何创建 SSH 密钥的很好的内联提示。

GitLab 在整个过程中都做得很好,提供了内联说明和提示,即使您是 Git 和 GitLab 的新手,也可以特别容易地进行设置。例如,如果您在没有首先设置至少一个 SSH 密钥的情况下开始尝试创建项目,GitLab 会在控制台中直接警告您。

""

图 4. 如果您尝试在没有首先设置至少一个 SSH 密钥的情况下创建项目,GitLab 将警告您并链接到您需要去的地方。

导入 GitHub 项目

如果您部署 GitLab 的目的是替换 GitHub(或其他公共代码仓库),GitLab 通过在项目创建工具中提供钩子使其变得简单明了。

GitLab 提供了两种设置与 GitHub 集成的方法:您可以设置 OAuth 应用程序或使用个人访问令牌。GitLab 推荐使用 OAuth 方法,因为它将 GitHub 仓库上的所有用户活动与您自托管的 GitLab 仓库上的活动关联起来。这是一个很好的集成,可以实现无缝过渡。使用个人访问令牌方法更简单,但它没有为您提供所有花哨的功能。

GitLab 还建议在两个服务中使用相同的命名空间(用户名)。所以在我的例子中,我创建了一个 GitLab 帐户用户名“jtonello”来匹配我的 GitHub 用户名。

要开始集成,请登录您的 GitHub 帐户,并导航到“Settings”和“Developer Settings”。在菜单中,选择“OAuth Apps”并单击“New OAuth App”按钮。

在这里,您将提供一些基本信息,包括应用程序名称和 GitLab 应用程序主页的完整 URL。其中至关重要的是授权回调 URL,它必须是 GitHub 可以访问的地址。这就是在 GitLab 服务器上设置完全限定域名派上用场的地方。如果您在 NAT 网络上的家用实验室中工作,请设置您的路由器将端口 80 或 443 转发到您的 GitLab 服务器。这样,您可以使用路由器的 WAN IP 地址作为您的回调 URL。我使用路由器的 DDNS 功能和 No-IP 来使用 GitHub 可以看到和通信的 ddns.net 域名来做到这一点。

""

图 5. 在 GitHub 中创建新的 OAuth 应用程序时,请确保授权回调 URL 与您的 GitLab 服务器的 URL 匹配,并且可以访问。

当您单击“Register application”按钮时,您将被带到 GitHub 的 OAuth 应用程序页面,该页面显示您刚刚创建的应用程序的新客户端 ID 和客户端密钥。您将使用这些来完成 GitLab 主机上的设置。不要分享它们。它们是您 GitHub 仓库的密钥!

回到您的 GitLab CE omnibus 主机,打开 /etc/gitlab/gitlab.rb,即 GitLab 主配置文件,并添加您刚刚创建的 GitHub 提供程序详细信息


gitlab_rails['omniauth_providers'] = [
  {
    "name" => "github",
    "app_id" => "YOUR_APP_ID",
    "app_secret" => "YOUR_APP_SECRET",
    "args" => { "scope" => "user:email" }
  }
]

您还需要在 /etc/gitlab/gitlab.rb 中为初始 OmniAuth 配置进行一些更改。在 omnibus 版本中,取消注释并编辑以下行,使其看起来像这样


gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml',
 ↪'twitter']
gitlab_rails['omniauth_auto_link_ldap_user'] = true
gitlab_rails['omniauth_block_auto_created_users'] = true

保存文件后,您需要重新配置您的 GitLab 服务器,此步骤会自动重启各种 GitLab 服务


$ sudo gitlab-ctl reconfigure

虽然 reconfigure 命令只需要片刻时间(您会在终端上看到活动滚动),但请耐心等待 GitLab 服务重启。这可能需要一两分钟。

当服务恢复运行时,转到 GitLab 登录页面,您现在将在其中看到 GitHub 登录选项。如果一切顺利,您现在可以创建一个新项目并直接从 GitHub 导入仓库。

通过单击 GitLab 项目页面上的“New project”按钮,然后从“Import project”选项卡上的列表中选择“GitHub”来执行此操作。第一次执行此操作时,系统会提示您授权与 GitHub 的 OAuth 连接,然后您将看到“List your GitHub repositories”按钮。如果您已决定改用个人访问令牌来创建与 GitHub 的链接,您也会在这里看到它。

""

图 6. 成功设置 OAuth 集成后,可以直接从 GitLab 中查看 GitHub 仓库。

如果您看到导入页面,您就会知道授权成功,并且您可能会收到来自 GitHub 的一封强制性电子邮件,告知您已将第三方 OAuth 应用程序添加到您的帐户。

您现在可以选择导入一些或全部 GitHub 仓库。您可以将它们保存到您当前的用户帐户或选择另一个帐户。根据仓库的大小和您的网络速度,这将花费几秒钟到几分钟不等。

""

图 7. GitLab 内的此视图显示了您的 GitHub 项目的完整列表,这些项目可以按原样在当前用户或不同的 GitLab 用户下导入,也可以重命名。

总结

在 GitLab 启动并运行后,继续尝试创建一些新项目或将现有项目克隆到您的工作站。GitLab 甚至会向您显示要运行的命令(图 8)。

""

图 8. 当您在 GitLab 中创建一个新项目时,它会提供关于如何入门的基本 Git 说明。

您现在已准备好提交代码并扩展您的 Git 技能。

资源

John Tonello 是 SUSE 的全球技术营销经理,他专注于软件定义的基础设施。自从 20 多年前从软盘构建他的第一个 Slackware 系统以来,他就一直是 Linux 用户和爱好者。

加载 Disqus 评论