記事
· 2023年9月8日 6m read

AWS環境を用いたCI/CDの仕組みの紹介。

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

技術文書ライティングコンテストという事で、私からはAWS環境を用いたCI/CDの仕組みについてご紹介します。

CI/CDとは「Continuous Integration(継続的インテグレーション)/ Continuous Delivery(継続的デリバリー)」の略称で、
詳細はネットをググると色々出てくると思いますが、私としてはリポジトリに格納されたものを自動で品質保証して、
問題なければ自動でデプロイしてくれる一連の仕組み
だと理解しています。

という事で、その第一歩はIRISのソースコードをgitで管理することです。
pythonで作成したテストプログラムを用意しました。

Class packages.CICDSample Extends %RegisteredObject
{
/// グローバルの数
Property count As %Integer;
/// バイト数
Property bytes As %Integer;

/// コンストラクタ
Method %OnNew() As %Status
{
    #; プロパティ変数の初期化。
    Set ..count = 0
    Set ..bytes = 0
    Return $$$OK
}

/// グローバルののデータ量集計
Method SampleMethod() As %String [ Language = python ]
{
    #; IRIS用のライブラリをインポート。
    import iris

    #; SAMPLEのネームスペースから情報を取得するため、ネームスペースを切り替える。
    self.ChangeNmsp('SKSM')

    key1 = ''
    test = iris.gref('^TEST')
    while True:
        key1 = test.order([key1])
        if (key1 == None):
            break
        key2 = ''
        while True:
            key2 = test.order([key1, key2])
            if (key2 == None):
                break
            gbl = test.get([key1, key2])
            self.count += 1
            self.bytes += self.GetBytes(gbl)

    print('データ件数:' + str(self.count))
    print('データ容量(byte):' + str(self.bytes))

    return self.count
}

/// NMSPの切替。
ClassMethod ChangeNmsp(nmsp As %String) [ Private ]
{
    #; ObjectScriptの独自コマンドはpythonでかけないようなので、メソッドで分割。
    ZNspace nmsp
}

/// 文字のバイト数の取得。
Method GetBytes(string As %String) As %Integer [ Private ]
{
    Return $ZWIDTH(string)
}

}

このプログラムがリポジトリにマージすることで、どのようなフローを辿るかご説明します。

登場人物は以下の通りです。

==============================================================

  • AWS CodeCommit (gitリポジトリ)
  • AWS CodeBuild (CI/CDの自動化ツール)
  • AWS CodeDeploy (自動デプロイツール)
  • AWS CodePipeline (各CI/CDのツールをステップ化して定義する)
  • AWS ECS (ビルド実行用コンテナ実行ツール)


==============================================================

 

■処理シーケンス

  1. ユーザがプログラムをCodeCommitにPushすると、CodePipelineが検知しCI/CDの処理が開始します。
  2. CodePipelineはCodeCommitより対象のブランチを取得します。 取得が完了すると、CodeBuildに取得した結果をアーティファクトとして渡します。  
  3. CodeBuildではIRISのコンパイルチェックを行うようにしています。 コンパイルを実行する環境として、コンテナ版IRISをECS上で動作させます。CodeBuildは取得したプログラムをECSに渡し、内部でコンパイルを実行させます。
  4. CodeBuildによる振舞はbuildspec.ymlに定義します。以下に実際のymlファイルを添付します。
    version: 0.2
    env:
      variables:
          RESULT: 0
    phases:
      build:
        commands:
          # コンパイルチェック用フォルダを作成。
          - mkdir -p /user/local/work
          # CodeCommitから取得したファイルを作成したフォルダにコピー。
          - cd ..
          - cp -r * /user/local/work
          - chmod -R 777 /user/local/work
          # チェック用シェルを実行フォルダに移動。
          - mv /chk_err.sh .
          - mv /chk_err_md.sh .
          # コンパイル用IRISを起動
          - su - irisowner -c "iris start IRIS"
          # Importチェック。
          - su - irisowner -c "iris terminal IRIS \"##CLASS(%SYSTEM.OBJ).ImportDir(\\\"/user/local/work\\\",\\\"*.cls;*.mac;*.int;*.inc;*.dfi\\\",\\\"k\\\",,1)\" " | tee result.txt
          - sh ./chk_err.sh
          # コンパイルチェック。
          - su - irisowner -c "iris terminal IRIS \"##CLASS(%SYSTEM.OBJ).CompileAll(\\\"ck\\\")\" " | tee result.txt
          - sh ./chk_err.sh
          - su - irisowner -c "iris terminal IRIS \"##CLASS(%Library.MessageDictionary).ImportDir(\\\"/user/local/work/01/res\\\")\" " | tee result.txt
          - sh ./chk_err_md.sh
          -
      post_build:
        commands:
          - cd $CODEBUILD_SRC_DIR_main_out
          - mv make_flg_file.bat ../
          - mv appspec.yml ../
          - cd ..
          - mv 00 base
          - mv 01 main
          - ls -al
    artifacts:
      files:
        - '**/*'
      base-directory: $PWD
    
  5. CodeBuildでの実行結果ががエラーになると、パイプライン処理は終了します。成功すると、CodeDeployに処理を移譲します。
  6. CodeDeployでは、あらかじめ設定した環境に②のCodeCommitのアーティファクトを転送します。今回はデプロイ先の環境をEC2に作成しておりますので、そこにファイルが送られます。 ファイルの転送後、appspec.ymlというファイルの記載に従って、ファイルを再配置します。
    version: 0.0
    os: windows
    files:
      - source: /
        destination: E:\deploy
    hooks:
      AfterInstall:
        - location: /make_flg_file.bat
          timeout: 300
          runas: root

■IRISのCI/CDを実現する上での注意点。

  1. IRISのプログラムを実ファイルとして管理する。 スタジオで開発している(まもなく非推奨になりますが)と、ルーチンやクラスはIRISインスタンスの中にデータとして存在しており、実ファイルがありません。 Gitで管理するためには、これらを実ファイルとしてエクスポートしてやる必要があります。(ちなみに私はInteroperabilityの定義やRDBの永続クラスなどもエクスポートしてgit管理しています。)  
  2. ビルド環境であるコンテナ内への命令実行はユーザ指定を忘れずに。 詳しくはこちらをご覧ください。 https://jp.community.intersystems.com/post/aws-codebuild%E3%82%92%E7%94%...  
  3. Deploy後にはIRISへのImportを忘れずに。 IRISはnode.jsのように格納したファイルがそのまま環境へ反映されることはありません。 私の環境ではファイルが配置されたことをInteroperabilityで検知して、それをIRISにImport仕組みを作っています。

■今後の展望
今後の展望としましては、自動でやるのがコンパイルチェックだけでは物足りないので、
ユニットテストもやらせたいところです。(テストケース作るのが大変なので中断しています。)

 

ここまで読んで頂き、ありがとうございました。
ご意見、ご感想等ございましたら、是非コメントいただけますと幸いです。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください