
Всем привет! В процессе обновления инфраструктуры сопровождения наших программных решений мы получили интересный опыт, которым хотим поделиться. Эта статья не просто пошаговая инструкция, а практический разбор того, как мы выстроили процесс подготовки технической документации на основе MkDocs Material, автоматизировали его через GitLab CI/CD и встроили полученный результат в сайт на Битрикс. Наш опыт окажется полезным тем, кто хочет навести порядок в документации и сделать её частью полноценного dev-процесса.
Предисловие
Наша компания сопровождает несколько интернет‑магазинов на платформе Битрикс, каждый из которых включает собственную линейку программных решений. По всем продуктам необходимо составлять и публиковать актуальную документацию. Ситуация усложнилась после того, как мы перевели наши продукты в OpenSource и выложили их в публичные репозитории GitLab. Теперь документация должна быть актуальна и синхронизирована как на сайте магазина, так и в репозиториях.
Перед нами возникла проблема: как автоматизировать работу с документацией?
Мы начали с определения ключевых требований:
Адаптивный веб‑сайт, автоматически генерируемый из текстовых файлов;
Версионный и открытый исходный код в репозитории GitLab;
Возможность публиковать контент разного формата: от статей о продуктах до постов в блоге и справочных руководств;
Развертывание и размещение, желательно бесплатное, с возможностью непрерывного обновления в автоматическом режиме через CI/CD;
Динамический контент во время сборки для оперативного изменения дизайна статического сайта;
Возможность встраивания цифровых ассистентов с использованием технологий искусственного интеллекта;
Перспектива автоматизированного тестирования.
После анализа доступных решений, остановились на MkDocs — генераторе статических сайтов, разработанном специально для документации и использующем разметку Markdown.
Конечно, не обошлось без рассмотрения альтернатив:
Sphinx — это популярный инструмент для создания документации, особенно для проектов на Python. Однако, как и любое другое решение, он имеет свои недостатки. Sphinx использует язык reStructuredText, который является менее интуитивным по сравнению с Markdown. Sphinx не предоставляет встроенных функций для редактирования документации в реальном времени, что затрудняет совместную работу. И он требует больше настроек, что сопровождается большей сложностью в переопределении шаблонов.
Docusaurus — это статический генератор сайтов, предназначенный для упрощения создания, развертывания и ведения документации и веб‑сайтов. Docusaurus показался избыточным для наших задач. Он требует больше усилий для первоначальной настройки, особенно если вы не знакомы с React. Конфигурация может быть более сложной из‑за множества доступных опций.
Еще нам довелось поработать с Gatsby, но на момент его использования этот генератор статических сайтов выдавал слишком упрощенный сайт по сравнению с возможностями MkDocs.

MkDocs показался лучшим вариантом: прост в настройке и использовании, поддерживает адаптивный дизайн и имеет множество тем, интегрируется с GitLab CI/CD для автоматической сборки и публикации документации, а также позволяет расширять функциональность с помощью плагинов. Кроме того, шаблон MkDocs Material предоставляет массу возможностей быстрой организации сайта документации.
Как установить и настроить MkDocs
Следует отметить, что MkDocs написан на Python и в нем используется язык шаблонов Jinja2, который позволяет создавать динамически генерируемые HTML‑страницы с простой и понятной разметкой. В MkDocs шаблоны Jinja2 используются для генерации HTML‑страниц из файлов Markdown. Когда запускается команда mkdocs build
, MkDocs обрабатывает Markdown‑файлы, применяет к ним шаблоны Jinja2 и создает статические HTML‑страницы, которые затем можно развернуть на веб‑сервере.
Для тех, кто знаком с Python и менеджерами пакетов, установка MkDocs не представляет сложностей. Вот основные шаги для запуска сервера и генерации статического сайта:
Шаг 1: Подготовка окружения
Для MkDocs требуется последняя версия Python и менеджер пакетов PIP. Убедимся, что у нас есть все необходимое. Откройте командную строку (терминал) и введите:
python --version
Должна отобразиться версия Python. Если команда не работает, потребуется установить Python. Скачайте его с официального сайта. Во время установки не забудьте установить флажок «Add python.exe to PATH» (обычно по умолчанию он не активен). Если у вас установлен Python, убедитесь, что PIP обновлен до последней версии. Для его обновления воспользуйтесь командой:
pip install --upgrade pip
Шаг 2: Установка MkDocs
Для установки MkDocs выполните команду:
pip install mkdocs
После этого проверьте успешность установки с помощью команды:
mkdocs --version
Шаг 3: Создание нового проекта
Для создания нового проекта MkDocs выполните команду:
mkdocs new my-project
где my-project — это имя директории проекта.
Эта команда создаст следующую структуру файлов:
.
├─ docs/
│ └─ index.md # Домашняя страница по умолчанию
└─ mkdocs.yml # Основные настройки вашего проекта
Перейдите в созданную директорию с помощью команды:
cd my-project
Шаг 4: Запуск локального сервера
MkDocs содержит встроенный сервер разработки. С помощью этого сервера можно просматривать документацию во время работы над ней.
Запустите сервер по команде:
mkdocs serve
Теперь можно открыть http://127.0.0.1:8000 в браузере и увидеть заготовку документации:

Шаг 5: Минимальная конфигурация
Файл mkdocs.yml содержит основные настройки вашего проекта.
Откройте файл в редакторе:
site_name: Документация
Пока что в файле есть только один параметр site_name, который задает название сайта. Задайте свое название и сохраните файл. После сохранения страница в браузере перезагрузится и отобразится новое название.

Пример со структурой нашего конфигурационного файла
site_name: Документация # Отображаемое название сайта (в шапке и title)
site_url: https://trusted.ru/documentation/ # Базовый URL сайта
site_author: digtlab.ru # Имя автора сайта (добавляется в метатег <meta name="author">)
theme:
name: material # Используется тема MkDocs Material
custom_dir: overrides # Кастомные шаблоны/стили в папке `overrides`
features: # Активированные фичи темы:
- announce.dismiss # Закрываемые уведомления
- content.code.annotate # Аннотации к коду
- content.code.copy # Кнопка копирования кода
- navigation.tracking # Отслеживание активного раздела
- navigation.indexes # Индексирование навигации
- navigation.sections # Группировка разделов
- search.highlight # Подсветка результатов поиска
- search.share # Кнопка поделиться поиском
- search.suggest # Подсказки при поиске
- toc.follow # Автопрокрутка оглавления
- toc.integrate # Интеграция с навигацией
font: # Шрифты
text: PT sans # Основной шрифт
code: PT Mono # Моноширинный для кода
logo: assets/crypto.png # Логотип в шапке
favicon: assets/crypto.png # Иконка вкладки браузера
language: ru # Локализация интерфейса
plugins: # Установленные плагины MkDocs
- search: # Встроенный поиск
separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' # Правила разбиения слов
- minify: # Минификация HTML
minify_html: true # Включено
hooks: # Хуки
- overrides/hooks/translations.py
extra: # Дополнительная конфигурация
generator: false
status: # Кастомные статусы для страниц
new: Recently added
deprecated: Deprecated
extra_css:
- stylesheets/extra.css # Дополнительные CSS-стили
watch: # Папки для отслеживания изменений при `mkdocs serve`
- docs
- overrides
- mkdocs.yml
markdown_extensions: # Список расширений для парсера Markdown, которые добавляют новые возможности к стандартному синтаксису Markdown
- abbr # Сокращения (HTML <abbr>)
- admonition # Блоки-уведомления (!!! note)
- attr_list # Атрибуты HTML ({: .class })
- def_list # Списки определений (<dl>)
- footnotes # Сноски ([^1])
- md_in_html # Markdown внутри HTML-блоков
- toc: # Оглавление
toc_depth: "1-1" # Уровни заголовков (только h1)
permalink: true # Якорные ссылки
slugify: !!python/name:pymdownx.slugs.uslugify # Алгоритм генерации якорей для заголовков
- pymdownx.arithmatex: # Поддержка LaTeX
generic: true # Совместимость с MathJax/Katex
- pymdownx.betterem: # Умное выделение (**bold**, _italic_)
smart_enable: all
- pymdownx.caret # Вставка символов (^sup^)
- pymdownx.details # Сворачиваемые блоки (<details>)
- pymdownx.emoji: # Эмодзи
emoji_generator: !!python/name:material.extensions.emoji.to_svg # SVG-генератор
emoji_index: !!python/name:material.extensions.emoji.twemoji # Библиотека Twemoji
- pymdownx.highlight: # Подсветка кода
anchor_linenums: true # Якоря для строк
line_spans: __span # CSS-классы для строк
pygments_lang_class: true # Классы языков
- pymdownx.inlinehilite # Подсветка в строке (`code`)
- pymdownx.keys # Клавиши (++ctrl+alt+del++)
- pymdownx.mark #==Выделение текста==
- pymdownx.smartsymbols # Поддержка (c) → ©, (tm) → ™
- pymdownx.snippets: # Вставка указанных файлов в конец каждой страницы
auto_append:
- includes/mkdocs.md # Путь относительно папки `docs/`
- pymdownx.superfences: # Расширенные блоки кода
custom_fences:
- name: mermaid # Диаграммы Mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
- pymdownx.tabbed: # Вкладки
alternate_style: true # Альтернативный стиль
combine_header_slug: true # Генерация slug для заголовков
slugify: !!python/object/apply:pymdownx.slugs.slugify
kwds:
case: lower
- pymdownx.tasklist: # Чекбоксы
custom_checkbox: true # Кастомные CSS-классы
- pymdownx.tilde # ~~Зачеркивание~~
nav: # Структура сайта
…
Подробнее про конфигурацию файла mkdocs.yml читайте на сайте разработчика.
Шаг 6: Добавление контента
Содержимое документации размещается в директории docs/.
По умолчанию папка docs/ содержит один файл с домашней страницей index.md. Добавьте свои файлы в формате markdown (.md) в эту директорию.
.
├─ docs/
│ └─ index.md
│ └─instructions.md
│ └─setup.md
└─ mkdocs.yml
Откройте браузер и убедитесь, что добавленные файлы отобразились на сайте.

По умолчанию MkDocs автоматически формирует структуру сайта из всех файлов каталога docs в алфавитном порядке. Порядок сортировки можно настроить в mkdocs.yml с помощью параметра nav:
site_name: Документация
nav:
- index.md
- setup.md
- instructions.md
Теперь на сайте изменилась очередность страниц:

Стоит отметить, что MkDocs поддерживает переопределение заголовков, а также многоуровневую навигацию.
Например:
site_name: Документация
nav:
- Главная: index.md
- Установка и настройка:
- Установка: setup/setup.md
- Настройка: setup/settings.md
- Инструкции: instructions.md
Как это выглядит на сайте:

Шаг 7: Построение статического сайта
Когда вы будете готовы к публикации, постройте статический сайт, выполнив команду:
mkdocs build
Результат сохранится в папке site. Эти файлы можно разместить на любом веб-сервере.
Шаблон MkDocs Material и его особенности
MkDocs включает несколько встроенных тем mkdocs и readthedocs, помимо которых существуют сторонние темы, разработанные независимыми командами. Вот полный список тем, которые можно установить с помощью pip.
Пожалуй, самым известной и популярной является тема MkDocs Material, именно ее мы и взяли за основу своего портала документации.

Тема включает адаптивный дизайн, множество функций, таких как навигация по страницам, встроенные поисковые функции и возможность добавления пользовательских элементов. Полный список плагинов и расширений темы, которые мы используем, приведен в примере со структурой нашего конфигурационного файла.
Для установки темы MkDocs Material выполните команду:
pip install mkdocs-material
Чтобы применить тему, добавьте в конфигурационный файл mkdocs.yml:
theme: material

Инфраструктура создания и размещения документации (GitLab→MkDocs→Битрикс)
Процесс подготовки и публикации документации выстроен как единая цепочка и охватывает все этапы: от создания текста до его размещения на сайте Битрикс.
Как выглядит схема процесса:

Для каждого продукта мы разрабатываем документацию в формате Markdown, а затем размещаем ее в ветке docs/ репозитория продукта. После прохождения всех проверок и согласований, изменения вливаются в основную ветку, откуда и начинается процесс автоматической сборки.
Примеры документации:
После публикации изменений в GitLab запускается процесс переноса документации в репозиторий с предварительно настроенной платформой MkDocs Material. Под «преднастройкой» понимается то, что платформа уже нацелена на генерацию статического сайта под определенный информационный ресурс, там имеются все необходимые доработки по стартовым страницам и стилям. Остается только разместить документацию в каталог docs/ и обновить структуру навигации в файле mkdocs.yml. На выходе получается единый статический сайт со всей документацией, готовой к публикации.
Собранные HTML-страницы проходят обработку, при которой автоматически оборачиваются в PHP-шаблоны с хедерами и футерами сайта Битрикс. После преобразования готовые файлы публикуются на тестовом (dev) или рабочем (prod) сервере в зависимости от ветки GitLab. Подробнее о механизме преобразования и настройке шаблонов расскажем ниже.
Проблемы и решения
1. Кастомизация шаблона MkDocs Material
Создавая собственный сайт, вы неизбежно столкнетесь с необходимостью кастомизации MkDocs Material. Например, вы захотите разместить собственное меню в шапке или сделать футер более информативным. Такая возможность есть и это не так сложно, как может показаться. Давайте разберемся, как это сделать на примере изменения шаблонов header и main.
На портале с документацией нам требовалось перенести строку поиска из заголовка страницы в левую часть над меню с навигацией. Поскольку в правом верхнем углу уже находился стандартный поиск сайта от Битрикс, который мы решили оставить.

Для этого в структуре каталогов шаблона MkDocs Material мы создали каталог overrides. В этом каталоге разместили скрипт main.html и подкаталог partials со скриптом header.html.
.
├── docs/ # Основная директория с документацией
├── overrides/ # Кастомные шаблоны и стили
│ ├── partials/ # Переопределенные части шаблонов
│ │ └── header.html # Кастомный header
│ └── main.html # Основной шаблон
...
Как написать код для скриптов?
Все очень просто. Мы скачали cкрипты из репозитория c исходными кодами темы, а затем внесли правки.
Вот изменения в файле header.html
{% set class = "md-header" %}
{% if "navigation.tabs.sticky" in features %}
{% set class = class ~ " md-header--shadow md-header--lifted" %}
{% elif "navigation.tabs" not in features %}
{% set class = class ~ " md-header--shadow" %}
{% endif %}
<header class="{{ class }}" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="{{ lang.t("header") }}">
<a href="{{ config.extra.homepage | d(nav.homepage.url, true) | url }}"
title="{{ config.site_name | e }}"
class="md-header__button md-logo"
aria-label="{{ config.site_name }}"
data-md-component="logo">{% include "partials/logo.html" %}</a>
<label class="md-header__button md-icon" for="__drawer">
{% set icon = config.theme.icon.menu or "material/menu" %}
{% include ".icons/" ~ icon ~ ".svg" %}
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">{{ config.site_name }}</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
{% if page.meta and page.meta.title %}
{{ page.meta.title }}
{% else %}
{{ page.title }}
{% endif %}
</span>
</div>
</div>
</div>
{% if config.theme.palette %}
{% if not config.theme.palette is mapping %}
{% include "partials/palette.html" %}
{% endif %}
{% endif %}
{% if not config.theme.palette is mapping %}
{% include "partials/javascripts/palette.html" %}
{% endif %}
{% if config.extra.alternate %}
{% include "partials/alternate.html" %}
{% endif %}
{% if "material/search" in config.plugins %}
{% include "partials/search.html" %}
<label class="md-header__button md-icon" for="__search">
{% set icon = config.theme.icon.search or "material/magnify" %}
{% include ".icons/" ~ icon ~ ".svg" %}
</label>
{% endif %}
{% if config.repo_url %}
<div class="md-header__source">{% include "partials/source.html" %}</div>
{% endif %}
</nav>
{% if "navigation.tabs.sticky" in features %}
{% if "navigation.tabs" in features %}
{% include "partials/tabs.html" %}
{% endif %}
{% endif %}
</header>
Мы убрали блок, который отвечает за отображение элемента поиска, оставив его для мобильной верстки.
Вот изменения в файле main.html
{% extends "base.html" %}
{% block hero %}
<div class="title_container">
<h1 class="title_main">Документация</h1>
</div>
{% endblock %}
{% block site_nav %}
<!--{% if not (page.meta and page.meta.hide) %}-->
<div>
{% if "material/search" in config.plugins %}
<header class="md-search-nav" data-md-component="header">
<!-- <div class="md-flex__cell md-flex__cell--shrink"> -->
<label class="md-header__button md-icon" for="__search">
{% set icon = config.theme.icon.search or "material/magnify" %}
{% include ".icons/" ~ icon ~ ".svg" %}
</label>
{% include "partials/search.html" %}
<!-- </div> -->
</header>
{% endif %}
{{ super() }}
</div>
<!--{% endif %} -->
{% endblock %}
{% block container %}
{% if page.url == '' %}
{{ super() | replace('<div class="md-content" data-md-component="content">', '<div class="md-content is_home" data-md-component="content">') | safe }}
{% else %}
{{ super() }}
{% endif %}
{% endblock %}
{% block content %}
{{ super() }}
<div class="md-breadcrumbs-buttons" role="navigation" aria-label="navigation">
{%- if page.previous_page and page.next_page %}
<div class="text nav_button">
<a href="{{ page.previous_page.url|url }}" class="float-left" title="{{ page.previous_page.title }}">Предыдущая</a>
</div>
<div class="text nav_button">
<a href="{{ page.next_page.url|url }}" class="float-right" title="{{ page.next_page.title }}">Следующая</a>
</div>
{%- endif %}
{%- if page.previous_page and not page.next_page %}
<div class="text nav_button">
<a href="{{ page.previous_page.url|url }}" class="float-left" title="{{ page.previous_page.title }}">Предыдущая</a>
</div>
<div></div>
{%- endif %}
{%- if not page.previous_page and page.next_page %}
<div></div>
<div class="text nav_button">
<a href="{{ page.next_page.url|url }}" class="float-right" title="{{ page.next_page.title }}">Следующая</a>
</div>
{%- endif %}
</div>
{% endblock %}
{% block footer %}{# Отключаем footer #}{% endblock %}
Также мы внесли изменения в реализацию кнопок перемещения по содержанию сайта и отключили footer.
2. Несовместимые якоря страниц в GitLab и MkDocs
При работе с документаций в формате Markdown заголовкам автоматически назначаются якорные ссылки. Ссылки упрощают навигацию внутри документа и позволяют создавать перекрестные ссылки между разными документами .
Оказалось, что GitLab и MkDocs используют разные алгоритмы генерации якорных ссылок, что приводит к поломке ссылок при переходе между системами.
В чем различия?
GitLab приводит заголовок к нижнему регистру, убирает все не буквенно-цифровые символы, заменяет пробелы на дефисы.
Пример:
## Настройка SSL-сертификата → "настройка-ssl-сертификата"
MkDocs удаляет кириллицу, оставляет только латинские буквы, цифры и дефисы.
Для предыдущего примера MkDocs создаст следующий заголовок:
## Настройка SSL-сертификата → "#ssl-"
Решение: Для приведения якорей к одному виду мы добавили в файл mkdocs.yml расширение toc с правилом slugify:
markdown_extensions:
- toc:
slugify: !!python/name:pymdownx.slugs.uslugify
Интеграция документации в интернет-магазин на Битрикс
Рассмотрим, как интегрировать статический сайт с документацией на MkDocs Material, в интернет-магазин на платформе 1С-Битрикс. В качестве примера используем портал https://trusted.ru/documentation/.
Пример главной страницы статического сайта, созданной по шаблону MkDocs Material:

Мы уже рассмотрели проект документации на базе MkDocs Material. Теперь разберемся с его структурой и настройками CI/CD для автоматической сборки и доставки документации в окружение Битрикс.
В GitLab проект организован следующим образом:
.
├── docs/ # Основная директория с документацией
├── overrides/ # Кастомные шаблоны и стили
├── extra/
│ ├── template.php # Шаблон для интеграции с Битрикс
│ └── html-to-php.sh # Скрипт конвертации
...
В папке docs/ размещаются исходные файлы документации в формате Markdown со стилями MkDocs Material. Именно эти файлы используются для сборки статического сайта.
Папка extra/ содержит скрипт html‑to‑php.sh и шаблон template.php, необходимые для интеграции с Битрикс.
Шаблон template.php обеспечивает обертку вокруг каждой HTML‑страницы, добавляя шапку и подвал сайта.
Пример кода template.php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/header.php');
$APPLICATION->SetPageProperty("description", "Официальный сайт ООО «Цифровые технологии»");
$APPLICATION->SetPageProperty("title", "Сайт ООО «Цифровые технологии»");
$APPLICATION->SetTitle("Главная");
?>
<style>
label.md-nav__link::before, label.md-nav__link::after {
display: none!important;
}
.content {
min-height: initial!important;
}
</style>
<script>
function resizeHeader() {
const r = document.querySelector(':root');
const h1 = $('#header_shop')?.height() || 0;
const h2 = $('.md-overlay')?.height() || 0;
const marginTop = Math.abs(h1 - h2 - 3);
const additionalMarging = 17; //// ????? нужно для sidebar
r.style.setProperty('--cryptoarm-marging-top', `${marginTop}px`);
r.style.setProperty('--cryptoarm-marging-top-sidebar', `${marginTop + additionalMarging}px`);
}
</script>
<div>
<?php include ('REPLACEME'); ?>
</div>
<script>
// resizeHeader();
$(window).on( "resize", resizeHeader);
</script>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
Скрипт html‑to‑php.sh содержит алгоритм обработки страниц документации, после их преобразования в html. Скрипт создает PHP файлы на основе шаблона из template.php, заменяя в нем строку REPLACEME
на имена соответствующих HTML файлов. Каждый новый PHP файл сохраняется в ту же директорию, что и оригинальный HTML файл.
Пример кода html-to-php.sh
#!/bin/bash
template=$(cat template.php)
if [[ -z $template ]]
then
echo 'template is empty' >&2
exit 1
fi
find ./../docs -type f -name "*.html" | while read fname;
do
dir=$(dirname -- "$fname")
filename=$(basename -- "$fname")
filename_noext="${filename%.*}"
echo "${template/REPLACEME/$filename}" > "$dir/$filename_noext.php"
done
В результате этой обработки каждая сгенерированная статическая страница дополняется хедером и футером сайта Битрикс и все файлы хранятся в формате PHP с сохранением структуры статического сайта.
В каталоге overrides в проекте, использующем MkDocs Material, размещаются пользовательские файлы и настройки, которые позволяют изменять и настраивать внешний вид и поведение документации. Этот каталог используется для переопределения стандартных стилей, шаблонов и других ресурсов, предоставляемых темой Material для MkDocs. В файле mkdocs.yml конфигурируются основные настройки проекта MkDocs, включая параметры для темы, навигации, расширений и других аспектов.
Процесс сборки документации организован с помощью двухэтапного Dockerfile. На первом этапе мы собираем сайт из исходников, на втором — упаковываем в образ с минималистичным nginx‑сервером.
Пример кода dockerfie
FROM registry.example.ru/mkdocs/mkdocs-material-data:9 as build
ARG CI_COMMIT_BRANCH
ARG CI_JOB_TOKEN
ARG CI_SERVER_HOST
ARG CI_PROJECT_NAMESPACE
ARG CI_PROJECT_NAME
ENV DOCS_PATH /docs
RUN git clone -b ${CI_COMMIT_BRANCH} --single-branch --depth 1 \ https://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}.git \
${DOCS_PATH}
RUN mkdocs build -f ${DOCS_PATH}/mkdocs.yml -d ${DOCS_PATH}/site
FROM flashspys/nginx-static
COPY --from=build /docs/site /static
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]
Конвейер CI/CD состоит из трёх стадий:
build — собирает и сохраняет сайт;
convert — преобразует HTML в PHP с помощью html-to-php.sh;
deploy— выкладывает результат на dev или prod-сервер в зависимости от ветки.
Пример кода gitlab-ci.yml
stages:
- build
- convert
- deploy
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: never
- when: always
docs_build:
stage: build
tags:
- mkdocs
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- export BUILD_VERSION=${CI_COMMIT_BRANCH}-$(date +%Y-%m-%d-%H%M)
- export LATEST_VERSION=${CI_COMMIT_BRANCH}-latest
- export DOCS_DIR=$CI_PROJECT_DIR/docs
script:
- echo "Building and pushing BUILD_VERSION version for $CI_COMMIT_BRANCH branch"
- if [ -d "$DOCS_DIR" ]; then rm -Rf $DOCS_DIR; fi
- >
docker build
--pull
--no-cache
--tag $CI_REGISTRY_IMAGE:$BUILD_VERSION
--build-arg CI_COMMIT_BRANCH=$CI_COMMIT_BRANCH
--build-arg CI_JOB_TOKEN=$CI_JOB_TOKEN
--build-arg CI_SERVER_HOST=$CI_SERVER_HOST
--build-arg CI_PROJECT_NAMESPACE=$CI_PROJECT_NAMESPACE
--build-arg CI_PROJECT_NAME=$CI_PROJECT_NAME
.
- docker create --name $BUILD_VERSION $CI_REGISTRY_IMAGE:$BUILD_VERSION
- docker cp $BUILD_VERSION:/static $DOCS_DIR
- docker rm -f $BUILD_VERSION
- docker tag $CI_REGISTRY_IMAGE:$BUILD_VERSION $CI_REGISTRY_IMAGE:$LATEST_VERSION
- docker push $CI_REGISTRY_IMAGE:$BUILD_VERSION;
- docker push $CI_REGISTRY_IMAGE:$LATEST_VERSION;
- docker rmi $CI_REGISTRY_IMAGE:$BUILD_VERSION
- docker rmi $CI_REGISTRY_IMAGE:$LATEST_VERSION
artifacts:
name: docs
paths:
- ./docs
expire_in: never
convert_html_to_php:
stage: convert
tags:
- mkdocs
needs: ["docs_build"]
script:
- cd ./extra && bash html-to-php.sh
artifacts:
name: docs-php
paths:
- ./docs
expire_in: never
docs_deploy_dev:
stage: deploy
variables:
GIT_STRATEGY: none
tags:
- mkdocs
needs: ["convert_html_to_php"]
rules:
- if: $CI_COMMIT_BRANCH == 'dev'
script:
- echo "Deploying dev version"
- rm -rf /var/www/dev_trusted/documentation/*
- cp -r ./docs/* /var/www/dev_trusted/documentation
docs_deploy_prod:
stage: deploy
variables:
GIT_STRATEGY: none
tags:
- mkdocs
needs: ["convert_html_to_php"]
rules:
- if: $CI_COMMIT_BRANCH == 'main'
script:
- echo "Deploying prod version"
Послесловие
Мы интегрировали MkDocs Material и автоматизировали публикацию в Битрикс, создав единую систему документации. Это принесло положительные результаты:
Оперативность обновлений: правки доходят до пользователей за считанные минуты.
Снижение нагрузки: нет необходимости дублировать контент для GitLab и Битрикс — всё синхронизируется автоматически.
Гибкость: Markdown дает свободу форматирования, а тема Material обеспечивает современный адаптивный дизайн.
Эта система — не финальное решение, а гибкая основа, которая будет развиваться вместе с нашими продуктами. Сейчас мы активно работаем над улучшениями. Вводим версионность документации и добавляем выбор продукта. Если у вас есть опыт подобных внедрений, мы будем рады обсудить в комментариях!
Спасибо, что прочитали до конца.
Источник: https://habr.com/ru/articles/925476/