如何在 GitLab EE 的基础上开发

前面说到极狐GitLab是基于 GitLab EE 进行开发的,所以所有的功能都是从 GitLab EE 上继承过去的,而极狐GitLab时常会需要开发自己的功能,而我们不希望通过覆盖的方式去新建一个同名文件来使得 jh/ 目录下文件得到加载,而是希望通过加载 ce/ 或者 ee/ 下的文件来加载 jh/ 目录下的文件,以保持与上游 GitLab 的功能同步,并且包含有极狐GitLab独有的功能。

方法

该方法我们简单可以理解为在上游通过特定的方式开辟入口,然后在 jh/ 中使用该入口。

要做到上述的行为,我们需要做的事情就是到上游 GitLab 上游仓库 的仓库中为极狐GitLab提供一个入口,例如在 _page.html.haml 模板文件中,我们通过在该文件中添加入口代码。

添加入口

在这我们会需要在 HAML 模板中用到一个 Ruby 里定义的一个比较重要的全局函数 render_if_exists,详细用法如下:

_page.html.haml

= render_if_exists "shared/footer/global_footer"

上游代码对应位置为 _page.html.haml,对应查看

该代码便会通过上下文查找对应的 views/ 文件夹来加载我们需要的这个 _global_footer.html.haml 模板文件,上面说到:

在极狐GitLab的仓库代码中,jh/ 目录下的文件的优先级顺序为 jh/ > ee/ > ce/。在这三个目录同时拥有某个文件时,所有 jh/ 目录下的文件都会优于其他目录下的文件加载。

  • 当极狐GitLab的应用运行时,通过优先加载 jh/ 目录下的 _global_footer.html.haml 这个模板文件来渲染应用,从而达到功能定制的效果。

  • 当上游应用独立运行时,上游应用并没有 jh/ 这个目录,那么上游应用将会优先加载 ee/ 目录下的 _global_footer.html.haml 文件,假如 ee/ 下找不到该文件,则会去加载 ce/ 下的该同名文件,如果 ce/ 目录下也没有当前文件,则该方法不会有任何副作用。

使用入口

通过在对应的 jh/ 目录下添加 jh/app/views/shared/footer/_global_footer.html.haml 文件,然后添加需要渲染的内容。

该示例代码可以在 _global_footer.html.haml 查看到。

路径别名(alias)

在 JavaScript 和 Vue 代码中,我们同样需要针对 GitLab EE 或者 GitLab CE 的代码进行拓展。因此声明了如下 alias ,在不同版本中解析为不同的文件路径。

例如 any_else_ce

  • 在极狐Gitlab中会匹配到 jh/app/javascript/ 目录。
  • 在Gitlab EE中会匹配到 ee/app/javascript/ 目录。
  • 在Gitlab CE中会匹配到 app/javascript/ 目录。
Alias Path in CE Path in EE Path in JH
jh_else_ce app/javascript/xx/xx app/javascript/xx/xx jh/app/javascript/xx/xx
jh_else_ee not contained ee/app/javascript/xx/xx jh/app/javascript/xx/xx
any_else_ce app/javascript/xx/xx ee/app/javascript/xx/xx jh/app/javascript/xx/xx

注意:

  • jh_else_ee 不应该出现在 GitLab CE 的代码中,即除了 jh/ee/ 目录下的文件都不应该使用该别名。
  • 如果某个文件仅在 GitLab CE 存在,在 jh/ 目录新增同名文件后,需要在 GitLab CE 代码中将 alias 指定为 jh_else_ce
  • 如果某个文件在 GitLab CE 通过 jh_else_ce 引用后,又在 ee/ 目录新增了同名文件进行覆盖,则需要在 GitLab CE 代码中将 alias 改为 any_else_ce

CSS

在极狐GitLab,如果想要对特定某个页面添加样式,其方式与 GitLab EE 完全一致:

新建一个 jh/app/assets/stylesheets/pages/your_pagename.scss,在其中编写你需要的样式,此文件将会在 jh/app/assets/stylesheets/_jh/application_jh.scss 中被引入,最终被引入至 app/assets/stylesheets/application.scss

注意:

  • 根据上游文档,请优先使用 GitLab UI 中的utinity classes 来完成样式需求,而不是单独编写 CSS。
  • 所有在 jh/app/assets/stylesheets/_jh/application_jh.scss 被引入的文件将直接与上游的样式进行拼接,这意味着对于页面中的同一元素,请确保你的样式比上游样式拥有更高的选择器权重。相比 GitLab CE 与 Gitlab EE,极狐GitLab会为所有页面 html 根元素添加一个额外的 jh-page-wrapper 类,您可以使用此类来提高选择器权重。