Я не дублирую файлы, но когда я это делаю, я дублирую стильно

Теоретически при разработке программного обеспечения мы хотим максимально уменьшить дублирование информации и ограничить все до единого источника правды, чтобы улучшить удобство сопровождения.

Однако на практике полностью исключить дублирование практически невозможно, так как системы/фреймворки всегда в чем-то несовместимы.

Возможные ситуации для дублирования

Пример 1

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

Пример 2

Другим примером могут быть файлы README. Репозиторий GitHub обычно имеет файл README верхнего уровня в корне проекта, который отображается на домашней странице репозитория, другой файл находится в папке docs, которая используется для страниц GitHub, и, возможно, третий внутри папки src для сгенерированной документации по API. . Обычно мы хотим, чтобы все 3 были одинаковыми, но из-за ограничений инструментов мы не можем указать все 3 в одном файле, поэтому нам приходится их дублировать.

Можем ли мы упростить обслуживание дубликатов?

Если дублирование — необходимое зло, можем ли мы хотя бы сделать его управляемым?

Во-первых, нам нужно понять, почему дублирование — это плохо.

Наличие нескольких файлов с одинаковым содержимым — это не обязательно кошмар, но проблема возникает, когда разработчикам нужно их обновить.

Хотя копирование файла в несколько мест после изменения не идеально, это не так уж плохо.

Однако катастрофа начинается, когда кто-то забывает продублировать обновления, и они перестают синхронизироваться (что впоследствии часто приводит к неопределенному поведению).

Чтобы решить эту проблему, нам нужен способ всегда синхронизировать дубликаты, и в зависимости от того, как часто они обновляются, лучше использовать автоматизированную систему.

Автоматизация GitHub в помощь

К счастью, с помощью GitHub Action мы можем легко создать автоматизированную систему для синхронизации дубликатов (например, сделать так, чтобы дубликаты были одинаковыми для каждого запроса push или pull).

План состоит в том, чтобы:

  1. Определите файл конфигурации для описания дублирования.
  2. Создайте действие GitHub для проверки дубликатов из 1.
  3. Запускайте действие GitHub при каждом запросе push или pull, чтобы проверить, синхронизированы ли дубликаты.

Разработав высокоуровневую концепцию, давайте переведем ее в код.

Шаг 1: определите файл конфигурации для описания дублирования

Чтобы определить дублирование, нам нужны оригинал и дубликат. Мы можем просто определить пример конфигурации следующим образом:

Приведенная выше конфигурация указывает, что содержимое README.md и docs/README.md всегда должно быть синхронизировано.

Чтобы добавить больше файлов в контрольный список, мы можем создать список, содержащий несколько записей конфигурации, как показано выше.

Шаг 2: создайте докер GitHub Action

GitHub Action может принимать одну из двух форм: либо пакет JavaScript, либо контейнер Docker. Звучит как две совершенно разные технологии, но для целей GitHub Action обе определяют рабочие процессы автоматизации.

Для простоты я выбрал Docker, так как я могу определить всю автоматизацию только с помощью следующего bash-скрипта:

Приведенный выше сценарий считывает содержимое двух файлов, оригинала и дубликата, и сравнивает их на предмет совпадения.

Как вы могли заметить, скрипт использовал GITHUB_WORKSPACE. Это специальная переменная среды GitHub Action, подготовленная для нас, которая представляет собой расположение клона репозитория. Полный список доступных переменных окружения смотрите в документации.

Нам также нужен файл докера-оболочки для запуска скрипта выше:

Шаг 3: идентифицируйте наш код как действие GitHub

После реализации кода для автоматической проверки дублирования нам нужно сообщить GitHub, что это действие GitHub, чтобы мы могли повторно использовать его в проектах/репозиториях.

Мы можем добиться этого, добавив конфигурацию действия action.yml в корень репозитория:

Приведенная выше конфигурация сообщает GitHub, что этот репозиторий содержит действие GitHub с именем «Проверка синхронизации дублирования», которое принимает 2 входных аргумента: оригинал — имя файла источника и зеркало — имя файла дублирования. Кроме того, он указывает, что действие должно быть выполнено путем запуска контейнера, определенного Dockerfile .

Шаг 4: используйте действие GitHub, которое мы создали в рабочем процессе

После создания действия GitHub мы можем использовать его в репозиториях.

Чтобы предложить проекту/репозиторию использовать действие GitHub, нам нужно добавить конфигурацию рабочего процесса:

где tianhaoz95/mirror-action — это репозиторий, в котором размещено действие GitHub, которое мы написали.

После настройки рабочего процесса, как только мы зарегистрируем код, будет запущена проверка синхронизации дублирования, которая выглядит следующим образом:

Спасибо за чтение! Этот пост посвящен тому, как бороться с дублированием с помощью GitHub Actions, но с помощью аналогичных шагов вы можете создать больше автоматизации, которая соответствует вашим потребностям.

Кроме того, если синхронизация дубликатов файлов — это именно то, что вам нужно, это действие доступно по адресу:



И исходный код доступен по адресу:



Присоединяйтесь к FAUN!

Подпишитесь на Темы FAUN и получайте еженедельную порцию обязательных к прочтению технических статей, новостей и руководств🗞️

Подпишитесь на нас в Twitter🐦и Facebook👥и Instagram📷 и присоединяйтесь к нашим Facebook и Linkedin Группы💬

Если этот пост был полезен, пожалуйста, нажмите кнопку аплодисментов 👏 несколько раз, чтобы выразить свою поддержку автору! ⬇