Миграция кода с использованием автоматизации DevOps
Миграция из одной системы управления кодом в другую - нетривиальная задача. Командам важно поддерживать историю кода, структуру ветвей, разрешения и интеграции. Рассмотрим случай миграции с Bitbucket в GitHub крупной медицинской компании.
Обнаружив, что команды разработчиков использовали несколько систем управления исходным кодом, что приводило к увеличению затрат на поддержание задвоенных операций и стоимости лицензий, компания выбрала GitHub в качестве единой платформы для управления исходным кодом. Корпоративный продукт GitHub предлагает ряд преимуществ, включая интеграцию инструментов, понятный интерфейс для управления проектами и командами и уведомление о событиях, опцию для облачного или локального развертывания платформы управления исходным кодом.
Миграция нескольких тысяч репозиториев - серьезная проблема. От команды DevOps требуется соблюдение сроков продления лицензии. Во избежание дополнительных затрат, командам требуется перенести базу кода и связанные метаданные. В подходе, описанном ниже, используются следующие инструменты CloudBees Jenkins™ , Red Hat Ansible™ playbooks и скрипты Python.
Подход
Рис 1 демонстрирует, что миграция включает создание процесса миграции Jenkins для определения исходного проекта Bitbucket, целевой проект GitHub, информация о принадлежности команды, информация о репозитории, дополнительные требования для интеграции. Эта информация сохраняется в новом файле, добавленном в корень исходного дерева (‘app-info.yml’). Такой подход упрощает будущую автоматизацию интеграции и обеспечивает понятный способ отслеживания метаданных приложения в базе.
Рис 1 Процесс автоматизации миграции в Github
В автоматизации миграции прорабатываются факторы, включая обеспечение целевого проекта GitHub соответствующими разрешениями видимости, использование стандартов наименования проектов, интеграция с существующей или будущей автоматизацией сканирования безопасности, применение правил защиты, определенные организацией и поддержка автоматизации необходимых конвейеров CI/CD.
Трансфер кода
И хотя технически клонирование кода в новый репозиторий - элементарный вариант, но требует значительных ручных изменений в нескольких ключевых файлах автоматизации, находящихся в корне структуры папок проекта. К сожалению, принимая во внимание, что каждая команда разработчиков использует определенную версию библиотеки, этот шаг выполняется вручную, а не автоматическим.
Правила защиты
Организация установила набор правил управления версиями деревьев. Например, политика требует, чтобы запрос был одобрен хотя бы одним проверяющим до того, как код объединится для ветвей ‘master’, ‘release’, и ‘develop’ в репозитории. Эти правила закодированы в скриптах миграции python и извлекаются из Ansible playbook во время создания проекта GitHub.
Автоматизированные изменения конвейера CI/CD
Для поддержки существующих конвейеров CI/CD переносимые базы кода требовали обновления файла конфигурации конвейера. Сюда входили ссылки на конфигурацию для автоматического обновления Jira, автоматическое сканирование безопасности, интеграции с библиотекой package control. Эти изменения были записаны в скриптах python и извлечены из Ansible playbook во время миграции кода в GitHub.
Управление ключами доступа и учетными записями
Автоматизированные процессы CI/CD требуют использования учетных записей и общедоступного секретного ключа для правильного функционирования. В процессе миграции важно сохранить эти ключи доступа для предотвращения неправильного использования журналов, уведомлений или других небезопасных отчетов. Команда миграции использовала функцию Ansible vault и скрипты Groovy для обновления встроенной системы управления учетными записями Jenkins, чтобы гарантировать безопасную передачу ключей проекта/учетных записей во вновь созданные связанные джобы GitHub в процессе миграции.
GitHub Pre-Migration Setup
Интеграция GitHub Jenkins построена как отдельная задача для создания "команды" GitHub. Сюда входят конфигурация команды с собственным именем, административные пользователи и соответствие в папке сборки Jenkins. Для каждого репозитория также установлен Jenkins “web-hook” для гарантии того, что для каждого запуска конвейера CI/CD используется соответствующий мастер Jenkins.
Интеграция автоматизированного тестирования
Как часть контроля качества кода сканирование кода привязано к определенному репозиторию и подразумевается как часть рабочего процесса Jenkins CI/CD. Результаты сканирования отображаются в отдельной вкладке GitHub. Таким образом, созданный проект может напрямую сообщать разработчикам результаты автоматизированного анализа качества кода.
Результаты
Команде поддержки DevOps было необходимо уложиться в 4 мес для завершения полной миграции с Bitbucket to GitHub и избежать расходов на продление лицензии. Принимая во внимание масштаб проблемы, единственное подходящее решение - автоматизация большей части миграции. Использование комбинированного инструмента, состоящего из скриптов Jenkins, Ansible playbooks и сценариев Python, позволило команде DevOps успешно завершить процесс миграции и модификации всех баз кода за несколько недель до дедлайна. Как результат, все команды активны в GitHub, а репозитории Bitbucket заархивированы.