Не желаете ли немного COBOL? Вы можете попробовать самостоятельно создать библиотеку на диалекте IBM Enterprise COBOL. Научиться структурировать пакет, управлять его зависимостями, реализовать автоматические тесты на z/OS, разместить в GitHub под контролем Continuous Integration. И, наконец, опубликовать в реестре пакетов. Предполагается, что вы немного знакомы с основными принципами, подходами и стандартами COBOL. В этот раз мы будем использовать IBM Enterprise COBOL for z/OS — проприетарный компилятор COBOL, который реализует значительную часть стандартов COBOL 85, COBOL 2002 и COBOL 2014. Код COBOL будем выполнять на z/OS — проприетарной 64-разрядной операционной системе для мэйнфреймов IBM, представленной в октябре 2000 года, и полностью совместимой с функциональными возможностями, появившимися еще с 1960-х годов. Еще вам понадобится аккаунт на мэйнфрейме, поскольку IBM не распространяет среду исполнения, в отличие, скажем, от GnuCOBOL. К счастью, учебный аккаунт можно получить бесплатно. Зарегистрируйтесь в IBM и следуйте инструкциям. Вы получите емейл, где будет указан ваш USER ID, IP и PORT. Затем зайдите в Open Mainframe Project Slack и добавьте себе приложение zih через App меню. Отправьте в нем сообщение, например Hi, и бот спросит ваш емейл и USER ID, которые вы получили ранее. Отправьте их один за другим, и бот сгенерирует пароль. Вероятно, самый простой способ взаимодействия с мэйнфреймом это Zowe. Zowe —  это фреймворк с открытым исходным кодом, который позволяет командам управлять, контролировать, выполнять сценарии (скрипты) и разрабатывать на мэйнфреймах. Установите инструмент командной строки Zowe и создайте профиль, используя полученные ранее учетные данные: Убедитесь, что ваш профиль может взаимодействовать с z/OSMF: Если все сделано правильно, то вы увидите список компонентов z/OSMF в состоянии ACTIVE. Готово! Каждый язык программирования имеет стандартный набор функций, предоставляемых по умолчанию. В COBOL они называются Intrinsic functions. Они удовлетворяют базовые потребности программирования, но программисты любят расширять этот набор собственными функциями каждый раз, когда пишут нечто более сложное чем Hello, world. Постепенно пользовательские функции образуют повторно используемые библиотеки для включения по необходимости в другие программы или сервисы. Благодаря системам контроля версий контрибьюторы кода могут эффективно сотрудничать и распространять библиотеки среди программистов. Единственная проблема заключается в интеграции с кодом, который может быть написан на другом диалекте COBOL, в другом стиле кодирования или иметь необычную структуру. Решением проблемы является включение библиотек в Пакеты определенного формата. Подобно другим менеджерам пакетов, например, Yarn для JavaScript, Maven для Java, Packagist для PHP, NuGet для C # и т.д., в 2020 году COBOL, наконец, обрел собственный менеджер пакетов, который стандартизирует то, как контрибьюторы должны обращаться с библиотеками — COBOLget. Данное руководство описывает современный подход создания и публикации вашего первого пакета COBOL. Для финансовых приложений мы создадим пакет demo-banking, который реализует единственную функцию ibanok — валидатор IBAN. Программа принимает буквенно-цифровой аргумент и возвращает буквенно-цифровое значение 1 в случае успеха или 0 в противном случае. Алгоритм следующий: Создайте новый репозиторий demo-banking в GitHub и скопируйте шаблон пакета в его локальную копию. Структура файлов выглядит так: Файл bank.cbl  — это собственно библиотека, в которой находится программа. Файл tests.cbl — это тестовая программа. Файл tests.jcl — это сценарий JCL, который будет выполнять тесты на мэйнфрейме. Файл modules.json — это манифест пакета, который описывает библиотеку и ее зависимости: Названия атрибутов говорят сами за себя и похожи на атрибуты других менеджеров пакетов. Наш пакет не использует никаких зависимостей, но требует пакет ECBLUnit любой версии (по умолчанию, последней доступной) для тестирования. Свойство modules перечисляет файлы COBOL для компиляции в библиотеку. Полную схему манифеста можно найти на https://cobolget.com/schema.json. Теперь давайте установим инструмент командной строки COBOLget и проверим манифест: Упс! Пожалуйста, замените ключевое слово FIXME на свое GitHub имя в файлах README.md и в modules.json, сделав пакет валидным и уникальным. Не забудьте также заменить FIXME в команде ниже: Структурирование пакета закончено. На следующем этапе мы будем тестировать библиотеку. Тесты ECBLUnit — это обычные программы COBOL, которые допускают дальнейшее выполнение (без оператора STOP RUN). В файле tests.cbl имеется 8 вызовов ECBLUeq (утверждения равенства), ожидающих, что программа ibanok вернет 1. Утверждение (assertion) также представляет собой программу COBOL, которая побайтово сравнивает два значения — ожидаемое и фактическое. Более подробную информацию можно найти на странице ECBLUnit. Теперь запустим тест локально, заменив <USER ID> на свой: Да, тест не прошел — утверждения #5… #8 возвращают 0 вместо 1. Определенно, это ложноотрицательный результат, поскольку данные IBAN были тщательно скопированы из Википедии. :) Вы можете открыть tests.cbl в редакторе, удалить все внутренние пробелы в IBAN и снова запустить тест. Но вместо этого я предлагаю вам улучшить ibanok. Обычно, пробелы в номерах IBAN допустимы, поэтому они тоже должны успешно пройти тесты. Лучшая реализация валидатора будет опубликована в реестре COBOLget под вашим именем. Тем не менее, вы можете сделать коммит и пуш в GitHub как есть без изменений и перейти к следующему шагу. Наш пакет будет следовать практике Непрерывной Интеграции, когда любая модификация исходного кода в репозитории тестируется. Каждый Push или Pull Request в GitHub запускает конвейер nodejs.yml, который автоматизирует шаги, описанные выше: Теперь сделайте коммит и пуш в GitHub и «выпустите» ваш пакет, добавив к коммиту тег версии, например 1.2.3. На странице GitHub на вкладке Actions вы увидите работу конвейера. Любой ненулевой код возврата пометит и шаг, и весь процесс как сбойный.
Теперь вы можете импортировать свой пакет в реестр COBOLget, командой index в консоли: Новорожденные пакеты мы будем индексировать по URL репозитория. Новые релизы уже имеющегося в реестре пакета можно индексировать имени. Не забудьте исправить FIXME: Готово! Ваш первый пакет опубликован на cobolget.com и готов к интеграции в приложения и сервисы. Вы успешно создали и опубликовали библиотеку для IBM Enterprise COBOL в формате COBOLget, используя z/OS, Git и Zowe, применив методы модульного тестирования и непрерывной интеграции. 60-летний COBOL все еще вписывается в современную разработку программного обеспечения!