https://ethercod3.github.io/diploma_latex/
https://ethercod3.github.io/diploma-pdf-archive/
MD5: e91b50e8782b1d6e81901010b81b18e4
SHA-1: 2c47c613e8bfcdfa4a1b1907fd1f30bfd719dbaf
SHA-256: a86f37cb3263428141e81cfb2d0732c0d667845044aee58ae6157389ac7935c7
SHA3-256: c59b29cbf9d83c2c0c7b615cc5ab013e401e739a1867c424f29e5475de08fad9
BLAKE2s: 3d54338f4ed6309fcc804c558e1df1fb29ccec558679b1759fdc299b96d36fc7
SHAKE-128 (256-bit output): 3619d7a31a3f006bec007f2a158f58fe978f2dff89794adc6432a10d3cbef06f
Репозиторий с исходниками дипломной работы: LaTeX-документы, Mermaid-диаграммы, Python-диаграммы, DOCX-шаблоны титульных страниц и Docker-профили для воспроизводимой сборки.
Работа выполнена в рамках выпускной квалификационной работы в федеральном государственном бюджетном образовательном учреждении высшего образования «Амурский государственный университет». Упоминание университета приведено как контекст выполнения работы и не означает передачу исключительных прав на материалы репозитория, если иное не указано отдельным соглашением.
| Путь | Назначение |
|---|---|
*.tex, preamble/ |
LaTeX-документы и настройки преамбулы |
docx/ |
DOCX-исходники титульника и задания |
mermaid/ |
Исходники Mermaid-диаграмм |
python_diagrams/ |
Python-скрипты генерации диаграмм |
figures/ |
Сгенерированные изображения и PDF для вставки в документ |
scripts/ |
Вспомогательные скрипты сборки, конвертации и сравнения PDF |
scripts/ci/ |
Python-скрипты для GitHub Actions и публикации релизов |
docker/ |
Dockerfile для отдельных профилей сборки |
docs/ru/, docs/en/ |
Zensical-документация проекта и ассеты документации |
docs/includes/ |
Общие Markdown-вставки для Zensical-документации |
Taskfile.yml, tasks/ |
Единая точка входа Task и тематические файлы задач; список команд доступен через task --list |
tests/ |
Pytest-тесты чистой логики вспомогательных скриптов |
.github/workflows/ |
GitHub Actions для Pages, check tools и PDF releases |
Установка Task и служебные команды
Если у вас установлен mise, используйте его как самый короткий путь к нужным версиям Python, uv и Task:
mise trust
mise install
mise run setup
mise run checkПосле этого основные команды можно запускать через mise run build, mise run test или напрямую через task.
Проект использует Task как единую точку входа для сборки и вспомогательных команд. Корневой Taskfile.yml подключает тематические файлы из tasks/, но публичные команды остаются плоскими: task build, task docs, task latex:docker.
Windows:
winget install Task.TaskmacOS или Linux с Homebrew:
brew install go-task/tap/go-taskЛюбая платформа с Node.js:
npm install -g @go-task/cliЕсли эти варианты не подходят, используйте официальную инструкцию установки: https://taskfile.dev/docs/installation.
Проверить установку:
task --version
task --listПроверить состояние проекта:
task checktask check проверяет .env, целевой .tex, путь к коду приложения, титульные PDF и актуальность диаграмм. Если Python еще не установлен и нужно только проверить состояние проекта, скачайте diploma-latex-check.exe из GitHub Releases, положите файл в корень проекта и запустите:
.\diploma-latex-check.exeПроверка выполнится без установленного Python для запуска скрипта, но сама сборка LaTeX без Docker все равно потребует команду python в PATH, потому что документ использует PyLuaTeX.
Посмотреть и удалить сгенерированные артефакты сборки:
task clean:dry
task cleanОстановить и очистить Docker-артефакты только текущего Compose-проекта:
task clean:docker:dry
task clean:docker
task clean:docker:imagesПроверить форматирование Python-файлов через Black:
task python:lintЗапустить тесты Python-скриптов:
task python:testСоздать резервную копию Git-истории через rclone:
task backuptask buildМаксимальная воспроизводимость с оригиналом будет, если вы будете собирать Mermaid-диаграммы из-под Windows. Если собирать их Docker-ом, то шрифт для KaTeX (математических) выражений будет отличаться от оригинала. Если это для вас неважно, просто пользуйтесь скриптом выше.
Для запуска скрипта потребуется Docker. Если вы не планируете использовать Docker, рекомендуемый вариант сборки LaTeX-документа - latexmk.
Если task не установлен, используйте исходную команду напрямую: uv run python scripts/build_all.py.
Документация и Zensical
Документация проекта лежит в docs/ и запускается через Zensical. Русская версия находится в docs/ru/, английская - в docs/en/. Для контейнерного запуска используется официальный Docker-образ zensical/zensical:0.0.40.
Собрать и запустить двуязычную локальную документацию:
task docsПосле запуска сайт доступен в браузере:
http://localhost:8000
Команда task docs собирает русскую версию в docs-site/, английскую - в docs-site/en/, а затем раздает статический сайт. Переключатель языка появляется в UI через настройки extra.alternate.
Для локальной статической сборки без запуска сервера используйте task docs:build. Для варианта, который публикуется на GitHub Pages, используется отдельная команда:
task docs:build:pagesОна собирает сайт через zensical.pages.toml и zensical.pages.en.toml, где site_url и ссылки переключателя языка настроены на публичный адрес Pages.
Заранее скачать Docker-образ документации:
task docs:pullБез Docker Zensical можно установить через uv:
uv tool install zensical
zensical serve --config-file zensical.toml
zensical serve --config-file zensical.en.tomlСборка без Docker
Рекомендуемый способ сборки без Docker - latexmk. Он сам запускает lualatex и biber нужное количество раз по правилам из .latexmkrc.
Важно
В этом проекте
latexmkзаметно сокращает время повторной компиляции. Первый запуск черезlatexmkзанимает около 74 секунд, повторный - около 18 секунд. Режим--no-latexmkс ручной цепочкой каждый раз занимает примерно 53-54 секунды.
Первый запуск latexmk может быть дольше ручной сборки, потому что он строит свое служебное состояние, анализирует зависимости, создает .fdb_latexmk и выполняет полный цикл сборки. На следующих запусках latexmk использует эту информацию и пересобирает только то, что действительно изменилось.
latexmk собирает только LaTeX-документ. Перед сборкой без Docker нужно отдельно подготовить все внешние артефакты, которые подключаются в .tex:
титульник.pdfизадание.pdfдолжны лежать в корне проекта. Их можно получить изdocx/*.docxвручную через Microsoft Word или LibreOffice. см О титульнике- Mermaid-диаграммы из
mermaid/*.mmdнужно заранее сгенерировать вfigures/, см. Как работать с диаграммами.- Python-диаграммы нужно заранее сгенерировать командой
task diagramsили вручнуюuv run python scripts/compile_python_diagrams.py.
- Python-диаграммы нужно заранее сгенерировать командой
- Если в приложениях подключается код, он должен лежать по пути, на который указывает проект, см. Если есть код.
Если эти файлы не подготовлены, latexmk может завершиться ошибкой из-за отсутствующих PDF, изображений или листингов.
-
Установить дистрибутив
LaTeX. Под Windows рекомендуется установитьTeX Live. Установка долгая, но все пакеты сразу скачаются вместе с дистрибутивом.latexmkобычно поставляется вместе с установкойTeX Live, поэтому отдельно его ставить не нужно. Компилятор в работе использовалсяLuaLaTeX. -
Установить Python и убедиться, что команда
pythonдоступна вPATH. Python нужен не только вспомогательным скриптам: LaTeX-документ использует PyLuaTeX во время компиляции. -
Клонировать репозиторий
-
Установить Python-зависимости для скриптов:
task deps
Или вручную:
uv sync
-
Создать в корне проекта файл
.envи указать в нем основной.texфайл:TARGET="Куприянов_И221_диплом.tex"
-
Собрать основной документ через
latexmk:task latex:local
Или напрямую через
latexmk:latexmk "Куприянов_И221_диплом.tex".Конфигурация находится в
.latexmkrc: используетсяLuaLaTeXс--shell-escape,biber, вспомогательные файлы складываются в.aux_files, а готовый PDF остается в корне проекта.--shell-escapeнужен PyLuaTeX, чтобы запускать Python во время компиляции.Для другого
.texфайла:task latex:local -- --target "<файл>.tex"Или напрямую через
latexmk:latexmk "<файл>.tex".
Если удобнее читать TARGET из .env, можно использовать скрипт. По умолчанию он тоже собирает документ через latexmk:
task latex:localИли вручную: `uv run python scripts/build_latex_manual.py`.
Если нужно собрать другой файл без изменения .env, передайте его явно:
task latex:local -- --target "<файл>.tex"Или вручную: `uv run python scripts/build_latex_manual.py --target "<файл>.tex"`.
Если нужно отключить latexmk и запустить старую ручную цепочку lualatex, biber, lualatex, lualatex, передайте флаг:
task latex:manual_chainИли вручную: `uv run python scripts/build_latex_manual.py --no-latexmk`.
Этот режим медленнее на повторных сборках: в текущем проекте около 53-54 секунд каждый раз против примерно 18 секунд при повторном запуске через latexmk.
Настройка TeXstudio
Настройка TeXstudio
Проект использует LuaLaTeX и biblatex с backend biber. Рекомендуемый вариант для TeXstudio - запускать latexmk, который читает настройки из .latexmkrc.
-
Откройте
Options$\rightarrow$ Configure TeXstudio$\rightarrow$ Commands. -
В поле
Latexmkукажите:latexmk %.tex -
Откройте
Options$\rightarrow$ Configure TeXstudio$\rightarrow$ Build. -
В
Default CompilerвыберитеLatexmk.
Перед первой сборкой убедитесь, что python, latexmk, lualatex и biber доступны в PATH. При установке TeX Live команды latexmk, lualatex и biber обычно уже доступны вместе с дистрибутивом. Python нужен PyLuaTeX во время компиляции LaTeX. Готовый PDF будет создан в корне проекта, вспомогательные файлы - в .aux_files.
Компиляция в Docker
Компиляция в Docker
-
Создайте в корне проекте файл
.envНаполните его содержимое:
VAULT_PATH="путь монтирования" VAULT_OS_PATH="фактический путь до кода на устройстве" TARGET="файл латеха"Пример:
VAULT_PATH="/vault_code" VAULT_OS_PATH="../vault_diploma" TARGET="Куприянов_И221_диплом.tex"Пояснение:
-
VAULT_PATH: любой абсолютный unix путь. -
VAULT_OS_PATH: где относительно текущей папки лежит код -
TARGET:.texфайл
-
-
Соберите LaTeX-образ:
task build:image -- latex
Или вручную:
docker compose --profile latex build. -
Запустите компиляцию:
task latex:docker
Или вручную:
docker compose --profile latex run --build --rm latex.Профиль
latexзапускает скриптscripts/build_latex_docker.py. Он читаетTARGETиз переменных окружения и собирает документ черезlatexmk. Вспомогательные файлы складываются в.aux_files_docker, а готовый PDF остается в корне проекта.
Первый build будет долгим. Команда task latex:docker и ручной вариант с run --build проверяют актуальность образа перед запуском, поэтому после изменения Dockerfile не нужно отдельно помнить про пересборку.
Сборка Docker-образов
Собрать все Docker-образы проекта:
task build:imagesСобрать образ отдельного профиля:
task build:image -- latex
task build:image -- mermaid
task build:image -- python
task build:image -- docx
task build:image -- cropИли вручную:
docker compose --profile latex build
docker compose --profile mermaid build
docker compose --profile python build
docker compose --profile docx build
docker compose --profile crop buildКоманды профилей используют docker compose run --build, поэтому Docker проверяет актуальность образов перед запуском. Первый запуск все равно будет долгим: Docker скачает базовые образы и соберет окружение.
Профили Docker Compose
В проекте доступны профили:
-
latex- компиляция LaTeX-документа -
mermaid- генерация Mermaid-диаграмм вfigures -
python- генерация Python-диаграмм вfigures -
docx- конвертация файловdocx/*.docxв одноименные PDF в корне проекта -
crop- обрезка полей произвольного PDF черезpdfcrop -
stirling- тестовый веб-интерфейс Stirling PDF для ручного сравнения PDF
Запуск отдельных профилей:
task latex:docker
task mermaid:docker
task diagrams:docker
task docx
task crop:docker -- path/to/file.pdf
task stirlingИли вручную:
docker compose --profile latex run --build --rm latex
docker compose --profile mermaid run --build --rm mermaid_diagrams
docker compose --profile python run --build --rm python_diagrams
docker compose --profile docx run --build --rm docx_pdf
docker compose --profile crop run --build --rm crop_pdf python3 scripts/crop_pdf.py path/to/file.pdf
docker compose --profile stirling up -d stirling_pdfПосле запуска Stirling PDF доступен по адресу http://localhost:8080. Если порт занят, задайте другой порт через переменную окружения, например STIRLING_PORT=8081 task stirling. Остановить сервис можно командой task stirling:down.
Стартовый пароль администратора задается через STIRLING_ADMIN_PASSWORD в .env. Он применяется только при первом запуске, до создания данных в /configs.
Запуск всех профилей одной командой:
task compose:upИли вручную: docker compose --profile docx --profile mermaid --profile python --profile latex up.
При запуске всех профилей Docker Compose стартует сервисы вместе. Если нужно гарантированно собрать документ уже со свежими PDF из DOCX и диаграммами, сначала запустите профили docx, mermaid и python, затем профиль latex.
Последовательный запуск всех профилей уже вынесен в скрипты:
task buildСкрипты запускают профили в порядке docx mermaid python latex и останавливаются на первой ошибке.
Все вспомогательные скрипты проекта написаны на Python и запускаются одинаково в Windows, Linux и macOS:
task build
task mermaid
task diagrams
task crop -- path/to/file.pdf
task pdf:split-color -- path/to/file.pdfИли вручную:
uv run python scripts/build_all.py
uvx --from git+https://github.com/ethercod3/compile_mermaid.git compile-mermaid
uv run python scripts/compile_python_diagrams.py
uv run python scripts/crop_pdf.py path/to/file.pdf
uv run python scripts/split_pdf_color.py path/to/file.pdfСкрипт scripts/convert_docx_to_pdf.py обычно запускается внутри Docker-профиля docx, потому что ему нужны LibreOffice, Ghostscript и qpdf.
Скрипт scripts/split_pdf_color.py делит PDF на два файла рядом с исходником: *_color.pdf с цветными страницами и *_bw.pdf с черно-белыми страницами. Ghostscript используется для анализа inkcov, а qpdf экспортирует страницы без перерисовки, чтобы сохранить поворот и геометрию страниц:
task pdf:split-color -- Куприянов_И221_диплом.pdfЕсли локально нет pdfcrop и Ghostscript, используйте Alpine-профиль:
task crop:docker -- path/to/file.pdfСравнение PDF между коммитами
Сравнение PDF между коммитами
Если нужно посмотреть визуальную разницу между двумя версиями диплома, используйте задачу:
task diff -- <commit_1> <commit_2>Или вручную: uvx diff-pdf-commits --build "<команда сборки>" --pdf "<PDF из TARGET>" --view <commit_1> <commit_2>.
Пакет diff-pdf-commits принимает 2 хэша коммита, собирает PDF через Docker в отдельных worktree, складывает две версии во временную папку и открывает diff-pdf.
По умолчанию задача открывает diff. Результат можно также сохранить в PDF:
task diff -- <commit_1> <commit_2> --view
task diff -- <commit_1> <commit_2> --diff-output path/to/diff.pdf
task diff -- <commit_1> <commit_2> --diff-output path/to/diff.pdf --no-viewДля ручного запуска используйте uvx diff-pdf-commits; полный набор параметров для проекта зашит в task diff.
Скачать diff-pdf можно в репозитории
Задача запускает сборку в порядке mermaid python latex. Если нужно изменить последовательность, правьте переменную DIFF_PDF_BUILD_CMD в tasks/tools.yml.
Перед запуском рабочее дерево Git должно быть чистым. Файлы, которые нужны для сборки, но могут отсутствовать в старых коммитах, задача передает через --copy: .env, титульные PDF и вспомогательные build-скрипты.
Проблемы с компиляцией и титульные страницы
Проблемы с компиляцией
Если вы используете latexmk, вручную повторять компиляцию не нужно: он сам запускает lualatex и biber столько раз, сколько требуется. Повторные ручные запуски нужны только при полностью ручной компиляции из последнего раздела README.
Если не компилируется:
Запустите команду из cmd, не из powershell. Если не сработало:
-
Переименуйте
.texфайл вmain.tex(или любое другое название на латинице) -
Используйте следующую команду для компиляции:
task latex:local -- --target main.tex
Или напрямую через
latexmk:latexmk main.tex.
О титульнике
LaTeX вставит титульник из файла титульник.pdf в начало файла. Поэтому он должен быть в проекте перед компиляцией (как и все рисунки, листинги). В проекте есть docx/титульник.docx и docx/задание.docx; их можно конвертировать через Docker:
task docxИли вручную: docker compose --profile docx up.
Профиль берет все файлы docx/*.docx и складывает одноименные PDF в корень проекта, например docx/титульник.docx титульник.pdf.
При конвертации профиль пропускает пустые страницы. Если нужно сохранить PDF как есть, запустите профиль с переменной SKIP_BLANK_PAGES=0:
task docx:keep-blankИли вручную: docker compose --profile docx run --rm -e SKIP_BLANK_PAGES=0 docx_pdf.
Альтернативный вариант - открыть DOCX в Microsoft Word и экспортировать его в PDF вручную: Файл Экспорт Создать PDF/XPS. Для титульника и задания нужно сохранить PDF в корень проекта с именами титульник.pdf и задание.pdf.
Если нет кода
Если у вас нет файлов кода, и вы хотите скомпилировать проект без них, закомментируйте эти строки в конце .tex файл (в latex комментарии - все строки, содержащие % в начале)
\newpage
\input{appendix_b.tex}
\newpage
\input{include_listings.tex}Если есть код
Положите код на одном уровне с папкой LaTeX кода. При компиляции LaTeX обращается по такому пути:
../vault_diploma/<файл>
Как работать с диаграммами
GitHub не всегда показывает содержимое файлов Mermaid с расширением .mmd как обычный текстовый код. Если вместо исходника отображается предпросмотр или файл не открывается удобным образом, нажмите кнопку View raw на странице файла. Так GitHub откроет исходный .mmd-код диаграммы без обработки.
Чтобы пересобрать диаграмму в pdf:
-
Отредактируйте нужную диаграмму (они содержатся в файлах
.mmd) -
Установите инструмент командой строки
mmdc: https://github.com/mermaid-js/mermaid-cli -
Пересоберите диаграмму:
mmdc -i <file.mmd> -o <file.pdf> -f
флаг
-fнужен для того, чтобы лист pdf обрезался под размер диаграммы
Запустите compile-mermaid через uvx. Инструмент автоматически прогонит все файлы из папки mermaid и положит результат в папку figures.
task mermaidИли вручную: uvx --from git+https://github.com/ethercod3/compile_mermaid.git compile-mermaid.
По умолчанию пересобираются только диаграммы, у которых исходный .mmd новее соответствующего PDF или PDF еще не создан. Чтобы принудительно пересобрать все Mermaid-диаграммы, запустите task mermaid -- --force.
После генерации скрипт обрезает поля через pdfcrop, которому нужен Ghostscript. Если локально доступны только mmdc и нужно собрать PDF без обрезки, запустите task mermaid -- --no-crop.
task mermaid:docker
Или вручную: docker compose --profile mermaid run --build --rm mermaid_diagrams.
-
Установите интерпретатор
python(использовалась версия3.13+) -
Установите в окружение библиотеки:
task depsили вручнуюuv sync -
Теперь вы можете запустить скрипт и получить на выходе файл диаграммы
task diagrams
Или вручную:
uv run python scripts/compile_python_diagrams.py.
task diagrams:dockerИли вручную: docker compose --profile python up.
Полностью ручная компиляция LaTeX
Этот способ нужен только для диагностики или если latexmk недоступен. В обычной сборке без Docker используйте latexmk, потому что он сам определяет нужное количество запусков lualatex и biber. Первый запуск latexmk в этом проекте может занимать около 74 секунд, зато повторные сборки сокращаются примерно до 18 секунд. Ручная цепочка через --no-latexmk каждый раз занимает около 53-54 секунд. В скрипте scripts/build_latex_manual.py этот режим включается флагом --no-latexmk.
Создайте папку для вспомогательных файлов:
mkdir .aux_filesТак как проект использует biblatex с backend biber и PyLuaTeX, одного запуска lualatex недостаточно, а каждый запуск lualatex должен идти с --shell-escape:
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "<файл>.tex"
biber ".aux_files/<файл>.bcf"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "<файл>.tex"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "<файл>.tex"Для основного файла проекта:
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "Куприянов_И221_диплом.tex"
biber ".aux_files/Куприянов_И221_диплом.bcf"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "Куприянов_И221_диплом.tex"
lualatex --shell-escape -synctex=1 -interaction=nonstopmode -output-directory=".aux_files" "Куприянов_И221_диплом.tex"После сборки итоговый PDF окажется в .aux_files. Его нужно перенести в корень проекта:
mv ".aux_files/<файл>.pdf" .В Windows cmd для основного файла:
move ".aux_files\Куприянов_И221_диплом.pdf" .Git hooks
Чтобы перед каждым коммитом автоматически обновлялись контрольные суммы итогового PDF в README, подключите локальные hooks:
task hooksИли вручную: git config core.hooksPath .githooks.
Для работы hook нужны Python-пакеты python-dotenv и cogapp. Они уже указаны в pyproject.toml и uv.lock; если окружение еще не подготовлено, установите зависимости:
task depsИли вручную: uv sync.
Hook считает хэши текущего PDF алгоритмами из стандартного hashlib и обновляет управляемый блок README через cogapp. Если PDF отсутствует, README не меняется и коммит продолжается со старым значением.
Резервное копирование
Проект можно бэкапить как git bundle через rclone. Такой архив хранит Git-историю, ветки и теги, но не сохраняет незакоммиченные изменения рабочей копии. Перед важным бэкапом стоит сделать коммит или stash.
Установите rclone по официальной инструкции: https://rclone.org/install/. После установки проверьте, что команда доступна:
rclone versionНастройте два remote в rclone:
rclone configРекомендуемые имена remote:
gdriveдля Google Drive;ydiskдля Яндекс Диска.
По умолчанию backup загружается в:
BACKUP_RCLONE_DESTINATIONS="gdrive:diploma_latex_backups,ydisk:diploma_latex_backups"
BACKUP_KEEP_WEEKS="30"Проверить создание bundle и rclone-операции без реальной загрузки и удаления:
task backup:dryСоздать и проверить только локальный bundle без загрузки в облако:
task backup:localСоздать бэкап, загрузить его на оба remote и оставить только последние 30 bundle-файлов на каждом remote:
task backupЕсли remote называются иначе, передайте назначения явно:
task backup -- --destinations "google:latex-backups,yadisk:latex-backups" --keep 30Пример еженедельного запуска через Windows Task Scheduler по воскресеньям в 22:00:
schtasks /Create /TN "Diploma LaTeX weekly backup" /SC WEEKLY /D SUN /ST 22:00 /TR "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command \"cd 'C:\Users\Artem\Documents\диплом_latex'; task backup\"" /FПосмотреть задачу:
schtasks /Query /TN "Diploma LaTeX weekly backup" /V /FO LISTЗапустить вручную:
schtasks /Run /TN "Diploma LaTeX weekly backup"Workflow .github/workflows/backup.yml запускается вручную и по расписанию каждое воскресенье в 05:00 по Якутску. Он создает git bundle, загружает его через rclone и оставляет последние 30 backup-файлов на каждом remote.
Для работы CI backup добавьте в GitHub repository secret:
RCLONE_CONFIG_CONTENT
Значение секрета - полный текст локального файла rclone.conf. Его путь можно узнать командой:
rclone config fileRemote names в этом конфиге должны совпадать с destinations. По умолчанию workflow использует:
gdrive:diploma_latex_backups,ydisk:diploma_latex_backupsЕсли нужны другие пути или имена remote, задайте GitHub repository variable:
BACKUP_RCLONE_DESTINATIONS=remote1:path,remote2:path
BACKUP_KEEP_WEEKS=30
CI/CD и релизы
В .github/workflows/ настроены GitHub Actions:
check-tools-exe.ymlсобираетdiploma-latex-check.exeи загружает его в release для теговv*;pdf-build.ymlсобирает PDF через Docker и загружает artifactpdf-release-assets;pdf-release.ymlскачивает готовый artifact и публикует release assets, а также отправляет PDF вethercod3/diploma-pdf-archive;pages.ymlпубликует Zensical-документацию на GitHub Pages;backup.ymlеженедельно создаетgit bundleи загружает его в облачные хранилища черезrclone.
Для тегов v* workflow Build PDF запускается через workflow_run после успешного завершения Release check tools exe, поэтому в artifact попадает актуальная версия checktool-windows-x64.exe. После успешного Build PDF workflow Release PDF публикует уже готовый artifact; его можно перезапустить вручную по build_run_id без пересборки LaTeX.
Ночная сборка запускается по cron в 04:00 по Якутску в Build PDF и после успешной сборки обновляет служебный тег/release nightly.
Для публикации PDF в отдельный архивный репозиторий нужен secret PDF_ARCHIVE_TOKEN с Contents: Read and write для ethercod3/diploma-pdf-archive. Количество хранимых PDF регулируется переменной PDF_ARCHIVE_MAX_BUILDS, по умолчанию 50.
Для CI-сборки приложений workflow подтягивает приватный репозиторий ethercod3/diploma_code в vault_diploma. В настройках GitHub Actions должен быть secret VIEW_DIPLOMA_CODE с read-only доступом к этому репозиторию.
Нетривиальная логика CI/CD вынесена из YAML в скрипты scripts/ci/*: подготовка .env, определение release context, скачивание checktool assets, публикация PDF release и выгрузка PDF в архив. Сам workflow вызывает задачи по шагам: task build, python ... и nu ....
Репозиторий использует смешанную некоммерческую схему лицензирования, описанную в LICENSE.md: код и автоматизация распространяются по PolyForm Noncommercial License 1.0.0, документация и авторские материалы - по Creative Commons Attribution-NonCommercial 4.0 International. Коммерческое использование возможно только по отдельному письменному согласованию с автором.
Шрифты в fonts/latin-modern-mono/ распространяются отдельно по GUST Font License из fonts/latin-modern-mono/GUST-FONT-LICENSE.TXT.
