null

Правим шаблоны интерфейса GitLab вручную

GitLab - отличное решение для организации командной работы при разработке ПО. Он включает в себя git-репозиторий, issue tracker, систему непрерывной интеграции и множество других модулей, позволяющих эффективно сопровождать разработку даже достаточно крупных программных продуктов. При этом гитлаб ещё и является открытым ПО, не накладывая каких-либо ограничений на своё использование в т.ч. и в коммерческих проектах.

Тем не менее, у гитлаба есть и ряд существенных недостатков. Помимо "хипстерской" архитектуры (что субъективно) и недостаточно мощного issue tracker'а (по сравнению с теми же продуктами Atlassian), к ним можно отнести слабую кастомизируемость интерфейса. Понятно, что этот недостаток не является особо критичным - на эффективность управления исходным кодом и организацию командной работы он никак не влияет - однако, в некоторых случаях, особенно, когда заказчик имеет доступ в репозиторий, невозможность "перекрасить" навигационную панель или поменять содержимое футера не может не раздражать. Хорошо, что эту проблему можно достаточно легко решить правкой шаблонов страниц, о чём я и расскажу в этой заметке.

Постановка задачи

Рассмотрим конкретный пример. Допустим, у нас есть GitLab CE, установленный с использованием официального образа для Docker'а, и заказчик требует от нас модифицировать нижнюю навигационную панель страницы авторизации. По умолчанию эта панель выглядит так:

Стандартный футер гитлаба

Заказчик хочет добавить туда ссылку на свой блог, расположенный по адресу https://myblog.com. Что для этого нужно сделать?

Решение

Разметка интерфейса гитлаба формируется с помощью Haml-шаблонов, расположенных в каталоге $GITLAB_BIN_HOME/gitlab-rails/app/views/. Конкретное имя каталога определяется особенностями установки гитлаба - к примеру, внутри официального образа для Docker'а полный путь к шаблонам будет выглядеть как /opt/gitlab/embedded/service/gitlab-rails/app/views/. Наиболее интересные среди них - это шаблоны разметки основных страниц гитлаба, они лежат в подкаталоге layouts.

Если мы хотим изменить навигацию в футере страницы навигации, то нам нужно поправить файл devise.html.haml. По умолчанию его содержимое (для GitLab CE 10.7) выглядит так:

!!! 5
%html.devise-layout-html{ class: system_message_class }
  = render "layouts/head"
  %body.ui_indigo.login-page.application.navless{ data: { page: body_data_page } }
    .page-wrap
      = render "layouts/header/empty"
      .login-page-broadcast
        = render "layouts/broadcast"
      .container.navless-container
        .content
          = render "layouts/flash"
          .row
            .col-sm-5.pull-right.new-session-forms-container
              = yield
            .col-sm-7.brand-holder.pull-left
              %h1
                = brand_title
              = brand_image
              - if current_appearance&.description?
                = brand_text
              - else
                %h3 Open source software to collaborate on code

                %p
                  Manage Git repositories with fine-grained access controls that keep your code secure.
                  Perform code reviews and enhance collaboration with merge requests.
                  Each project can also have an issue tracker and a wiki.

              - if Gitlab::CurrentSettings.sign_in_text.present?
                = markdown_field(Gitlab::CurrentSettings.current_application_settings, :sign_in_text)

      %hr.footer-fixed
      .container.footer-container
        .footer-links
          = link_to "Explore", explore_root_path
          = link_to "Help", help_path
          = link_to "About GitLab", "https://about.gitlab.com/"

Добавим в футер новую ссылку. Т.к. текст ссылки содержит кириллицу, а интернационализацию и локализацию в шаблоны страниц гитлаба пока что не завезли, нам придётся вверстать её соответствующими кодами юникодных символов. Таким образом, в соответствии с синтаксисом Haml, исходный код модифицированного шаблона примет следующий вид (добавилась одна строчка в конце):

!!! 5
%html.devise-layout-html{ class: system_message_class }
  = render "layouts/head"
  %body.ui_indigo.login-page.application.navless{ data: { page: body_data_page } }
    .page-wrap
      = render "layouts/header/empty"
      .login-page-broadcast
        = render "layouts/broadcast"
      .container.navless-container
        .content
          = render "layouts/flash"
          .row
            .col-sm-5.pull-right.new-session-forms-container
              = yield
            .col-sm-7.brand-holder.pull-left
              %h1
                = brand_title
              = brand_image
              - if current_appearance&.description?
                = brand_text
              - else
                %h3 Open source software to collaborate on code

                %p
                  Manage Git repositories with fine-grained access controls that keep your code secure.
                  Perform code reviews and enhance collaboration with merge requests.
                  Each project can also have an issue tracker and a wiki.

              - if Gitlab::CurrentSettings.sign_in_text.present?
                = markdown_field(Gitlab::CurrentSettings.current_application_settings, :sign_in_text)

      %hr.footer-fixed
      .container.footer-container
        .footer-links
          = link_to "Explore", explore_root_path
          = link_to "Help", help_path
          = link_to "About GitLab", "https://about.gitlab.com/"
          = link_to "My Blog", "https://myblog.com/"

Сохраняем изменения в файле, проверяем, как будет выглядеть новая навигация в футере:

Ничего не изменилось!!!11

Ничего не изменилось! Правильно, т.к. для того, чтобы были загружены новые шаблоны, нужно перезапустить гитлаб. Перезапускаем Docker-контейнер:

www@helios:~$ sudo docker restart gitlab

Проверяем страницу в браузере:

Оно появилось!

Ура! Новый пункт добавился в навигационную панель, задача решена. Теперь осталось где-то сохранить модифицированный нами файл devise.html.haml, т.к. при апгрейде на следующую версию гитлаба образ будет загружен заново, вследствие чего все шаблоны сбросятся в "дефолтное" состояние.

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.