2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

opensouce COBOLとcircle ciによるCI/CD

Last updated at Posted at 2019-10-28

概要

開発現場では効率、品質を向上させるため、DevOpsとCI/CDパイプラインを活用することが増えてきました。

そこで、CIの大手サービスである、circle ciでopensource COBOLの自動テストをしてみたいと思います。

circle ciについて

circle ciではテストを実行する環境としてDockerコンテナを利用しています。
標準部品として、Javaなど主要な言語のテスト環境やWindows、Macなどが用意されていますが、さすがにCOBOL環境はありません。
このため、docker hubに公開されている、opensource COBOLのイメージを利用してテストを実行します。

テスト対象

テスト対象のプログラムはいつものHELLO.cblを「コンパイル」、「実行」でテストします。
「実行」では、正しく標準出力が行えていることを確認します。

HELLO.cbl
       IDENTIFICATION              DIVISION.
       PROGRAM-ID.                 HELLO.
       DATA                        DIVISION.
       WORKING-STORAGE             SECTION.
       PROCEDURE                   DIVISION.
       MAIN-RTN.
           DISPLAY "HELLO WORLD!".
       MAIN-EXT.
           STOP RUN.

リポジトリ準備

まずはgithubにテスト用のリポジトリを作成します。
なんでもいいので、サクッと作成します。
image.png

そのままCOBOLソースをアップロードします。

最後に、circle ciでテストを実行するための定義ファイルとなる、config.ymlをリポジトリに追加します。
circle ciでは、リポジトリ配下の.circleci/config.ymlを参照し、テストを実行します。
config.ymlの細かな書き方については公式のドキュメントを参照してください。

今回は以下のような設定を作成します。

config.yml
version: 2
jobs:
  compile:
    docker:
      - image: opensourcecobol/opensource-cobol
    steps:
      - checkout
      - run: cobc -m -o HELLO.so HELLO.cbl
  test:
    docker:
      - image: opensourcecobol/opensource-cobol
    steps:
      - checkout
      - run: cobc -m -o HELLO.so HELLO.cbl
      - run: cobcrun HELLO
      - run: test "`cobcrun  HELLO`" = 'HELLO WORLD!'
workflows:
  version: 2
  test:
    jobs:
      - compile
      - test
  • dockerタグ

テストの実行環境となるDockerコンテナのイメージを指定します。
dockerhubで公開されているopensource COBOLのイメージを利用することで、COBOLのコンパイル、実行を行えます。

  • checkout

連携しているgithubのリポジトリからcheckoutを行います。
これにより、カレントにHELLO.cblが配置されます。

  • compileタグ

コンパイルが通るかをチェックするテストを実施します。

  • testタグ

COBOLの実行までをテストします。
ここでは、testコマンドを利用して、標準出力が想定した文字列であるかも確認します。

circle ci連携

続いてcircle ciを動かすため、githubとcircle ciを連携させます。
こちらは普通にcircle ci側からgithubアカウントでログインすることで、連携させることができるので、割愛します。

連携後、テストしたいリポジトリを選択します。
image.png

そのまま初回のテストが実行されます。
※ファイルの記述が間違っていて何回か失敗しました、、、
image.png

それぞれのテストの詳細を確認できます。

  • コンパイル
    image.png

  • 実行
    image.png

本題のCI

それでは本題のCIを実施していきます。
といっても、基本的にgithubのファイルを更新すると、自動でcircle ciでテストが走ってくれますので、特に操作はありません。

コンパイルエラーの例

わざとコンパイルエラーにしてみます。

HELLO.cbl
       IDENTIFICATION              DIVISION.
       PROGRAM-ID.                 HELLO.
       DATE                        DIVISION.
       WORKING-STORAGE             SECTION.
       PROCEDURE                   DIVISION.
       MAIN-RTN.
           DISPLAY "HELLO WORLD!".
       MAIN-EXT.
           STOP RUN.

DATA DIVISIONDATE DIVISIONになっています。
早速このファイルをリポジトリにcommit&pushします。

するとテストが失敗になっており、
image.png

詳細を見ると、コンパイルエラーのメッセージが確認できます。
image.png

実行時エラーの例

次に実行時エラーにしてみます。
opensource COBOL最大のつまりポイント、PROGRAM-IDとsoファイル名が一致しない例です。

HELLO.cbl
       IDENTIFICATION              DIVISION.
       PROGRAM-ID.                 HELL.
       DATA                        DIVISION.
       WORKING-STORAGE             SECTION.
       PROCEDURE                   DIVISION.
       MAIN-RTN.
           DISPLAY "HELLO WORLD!".
       MAIN-EXT.
           STOP RUN.

同様にファイルをcommit&pushします。
compileジョブは成功しましたが、testジョブで失敗してます。
image.png

詳細をみると予定通りのメッセージが見れました。
image.png

出力文字列が違う場合

一応最後に出力文字列が変わってしまった場合も確認しておきます。

HELLO.cbl
       IDENTIFICATION              DIVISION.
       PROGRAM-ID.                 HELLO.
       DATA                        DIVISION.
       WORKING-STORAGE             SECTION.
       PROCEDURE                   DIVISION.
       MAIN-RTN.
           DISPLAY "HELL WORLD!".
       MAIN-EXT.
           STOP RUN.

一文字間違っただけで地獄の世界になるのは怖いですね。

詳細を確認すると、実行は通っていますが、testコマンドがエラーになっています。
このように、exit codeで判別されるので、簡単にテストを作成できます。

image.png

総評

このように、COBOLもCIに乗せることができました、といった感じです。
COBOLではCOPY句などで、複数のソースにまたがった記述も多々あるので、コンパイルだけでもテストすると便利になるかもしれません。

また、今回は単純なコンパイル、実行でしたが、makeやAutoTestなどと組み合わせることでより高機能なCIサイクルができそうです。

注意点として、テストが失敗すると、メール通知をしてくれます。
いろいろ試してたらメールボックスに失敗メールがいっぱいたまってたました。

参考等

今回利用したdockerイメージの配布は以下で行われています。
https://hub.docker.com/r/opensourcecobol/opensource-cobol

需要はないと思いますが、今回作成したリポジトリも公開してあります。
https://github.com/nor51010/cobol-ci

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?