Pull to refresh

Enterprise COBOL: реализация библиотеки

Reading time6 min
Views2.1K
Original author: Oleg Kunitsyn

image


Не желаете ли немного 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-х годов.


  • У вас установлен NPM  —  менеджер пакетов для JavaScript.
  • У вас установлен Git  —  клиент с открытым исходным кодом для управления версиями.
  • У вас есть аккаунт GitHub.
  • Вы можете использовать любой тестовый редактор, но я рекомендую Visual Studio Code с расширением IBM Z Open Editor.

Еще вам понадобится аккаунт на мэйнфрейме, поскольку IBM не распространяет среду исполнения, в отличие, скажем, от GnuCOBOL. К счастью, учебный аккаунт можно получить бесплатно. Зарегистрируйтесь в IBM и следуйте инструкциям. Вы получите емейл, где будет указан ваш USER ID, IP и PORT. Затем зайдите в Open Mainframe Project Slack и добавьте себе приложение zih через App меню. Отправьте в нем сообщение, например Hi, и бот спросит ваш емейл и USER ID, которые вы получили ранее. Отправьте их один за другим, и бот сгенерирует пароль.


Вероятно, самый простой способ взаимодействия с мэйнфреймом это Zowe. Zowe —  это фреймворк с открытым исходным кодом, который позволяет командам управлять, контролировать, выполнять сценарии (скрипты) и разрабатывать на мэйнфреймах. Установите инструмент командной строки Zowe и создайте профиль, используя полученные ранее учетные данные:


$ npm i -g @zowe/cli --ignore-scripts
$ zowe profiles create zosmf ztrial --host <IP> --port <PORT> --user <USER ID> --pass <PASSWORD> --reject-unauthorized false
Profile created successfully!

Убедитесь, что ваш профиль может взаимодействовать с z/OSMF:


$ zowe zosmf check status

Если все сделано правильно, то вы увидите список компонентов 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 в противном случае. Алгоритм следующий:


  1. Вычислить фактическую длину IBAN в аргументе.
  2. Проверить структуру IBAN.
  3. Переместить первые 4 символа в конец.
  4. Заменить каждый символ двумя цифрами, где A = 10, B = 11,…, Z = 35.
  5. Вычислить остаток MOD97. Если он равен 1, то контрольная сумма верна.

Структура


Создайте новый репозиторий demo-banking в GitHub и скопируйте шаблон пакета в его локальную копию. Структура файлов выглядит так:


├── .github
│   └── workflows
│       └── nodejs.yml
├── .gitignore
├── modules.json
├── modules-lock.json
├── README.md
├── src
│   └── banking.cbl
└── tests
    ├── tests.cbl
    └── tests.jcl

Файл bank.cbl  — это собственно библиотека, в которой находится программа. Файл tests.cbl — это тестовая программа. Файл tests.jcl — это сценарий JCL, который будет выполнять тесты на мэйнфрейме. Файл modules.json — это манифест пакета, который описывает библиотеку и ее зависимости:


{
  "name": "demo-banking-FIXME",
  "description": "Demo banking package",
  "modules": [
    "src/banking.cbl"
  ],
  "dialect": "entcobol",
  "licenses": [
    "MIT"
  ],
  "authors": [
    "FIXME"
  ],
  "dependencies": {},
  "dependencies-debug": {
    "ecblunit": "*"
  }
}

Названия атрибутов говорят сами за себя и похожи на атрибуты других менеджеров пакетов. Наш пакет не использует никаких зависимостей, но требует пакет ECBLUnit любой версии (по умолчанию, последней доступной) для тестирования. Свойство modules перечисляет файлы COBOL для компиляции в библиотеку. Полную схему манифеста можно найти на https://cobolget.com/schema.json. Теперь давайте установим инструмент командной строки COBOLget и проверим манифест:


$ npm install -g cobolget
$ cobolget validate
An error occurred: Error: "demo-banking-FIXME" does not match to ^[a-z0-9\-]+$

Упс! Пожалуйста, замените ключевое слово FIXME на свое GitHub имя в файлах README.md и в modules.json, сделав пакет валидным и уникальным. Не забудьте также заменить FIXME в команде ниже:


$ cobolget validate
Manifest modules.json is valid.
$ cobolget list demo-banking-FIXME
No matching results.

Структурирование пакета закончено. На следующем этапе мы будем тестировать библиотеку.


Тестирование


Тесты ECBLUnit — это обычные программы COBOL, которые допускают дальнейшее выполнение (без оператора STOP RUN). В файле tests.cbl имеется 8 вызовов ECBLUeq (утверждения равенства), ожидающих, что программа ibanok вернет 1. Утверждение (assertion) также представляет собой программу COBOL, которая побайтово сравнивает два значения — ожидаемое и фактическое. Более подробную информацию можно найти на странице ECBLUnit. Теперь запустим тест локально, заменив <USER ID> на свой:


$ cobolget run build
...
Modules modules.cpy and modules.cbl updated.
$ zowe zos-files upload file-to-data-set modules/modules.cbl <USER ID>.CBL
...
Data set uploaded successfully.
$ zowe zos-files upload file-to-data-set tests/tests.cbl <USER ID>.CBL
...
Data set uploaded successfully.
$ zowe jobs submit local-file tests/tests.jcl --view-all-spool-content
...
Time: 00:00:00
There was 004 failure(s):
#005 EQ  F140404040404040 1
         F040404040404040 0
         ^^
#006 EQ  F140404040404040 1
         F040404040404040 0
         ^^
#007 EQ  F140404040404040 1
         F040404040404040 0
         ^^
#008 EQ  F140404040404040 1
         F040404040404040 0
         ^^
FAILURES!
 Tests: 001, Skipped: 000
 Assertions: 008, Failures: 004, Exceptions: 000

Да, тест не прошел — утверждения #5… #8 возвращают 0 вместо 1. Определенно, это ложноотрицательный результат, поскольку данные IBAN были тщательно скопированы из Википедии. :) Вы можете открыть tests.cbl в редакторе, удалить все внутренние пробелы в IBAN и снова запустить тест. Но вместо этого я предлагаю вам улучшить ibanok. Обычно, пробелы в номерах IBAN допустимы, поэтому они тоже должны успешно пройти тесты. Лучшая реализация валидатора будет опубликована в реестре COBOLget под вашим именем. Тем не менее, вы можете сделать коммит и пуш в GitHub как есть без изменений и перейти к следующему шагу.


Публикация


Наш пакет будет следовать практике Непрерывной Интеграции, когда любая модификация исходного кода в репозитории тестируется. Каждый Push или Pull Request в GitHub запускает конвейер nodejs.yml, который автоматизирует шаги, описанные выше:


  1. Установить Zowe.
  2. Создать профиль Zowe.
  3. Установить COBOLget.
  4. Собрать пакет COBOLget, установив зависимости.
  5. Загрузить модуль COBOLget в мэйнфрейм.
  6. Загрузить тест ECBLUnit в мэйнфрейм.
  7. Выполнить тест и вернуть код исполнения.

Теперь сделайте коммит и пуш в GitHub и «выпустите» ваш пакет, добавив к коммиту тег версии, например 1.2.3. На странице GitHub на вкладке Actions вы увидите работу конвейера. Любой ненулевой код возврата пометит и шаг, и весь процесс как сбойный.
Теперь вы можете импортировать свой пакет в реестр COBOLget, командой index в консоли:


$ cobolget index -h
Usage: index [options] <name|url>
Import or update the package in the registry
Options:
  -t, --token <token>                Repository token for private package
  -o, --organization <organization>  Organization name for private package
  -h, --help                         output usage information

Новорожденные пакеты мы будем индексировать по URL репозитория. Новые релизы уже имеющегося в реестре пакета можно индексировать имени. Не забудьте исправить FIXME:


$ cobolget index https://github.com/FIXME/demo-banking
Package 'demo-banking-FIXME' has been indexed in the registry.

Готово! Ваш первый пакет опубликован на cobolget.com и готов к интеграции в приложения и сервисы.


Заключение


Вы успешно создали и опубликовали библиотеку для IBM Enterprise COBOL в формате COBOLget, используя z/OS, Git и Zowe, применив методы модульного тестирования и непрерывной интеграции. 60-летний COBOL все еще вписывается в современную разработку программного обеспечения!

Tags:
Hubs:
+6
Comments0

Articles