記事
· 2024年10月8日 9m read

GitLab を使用した InterSystems ソリューションの継続的デリバリー - パート X: コード以外の話

約 4 年のギャップを経て、私の CI/CD シリーズが帰ってきました! 長年にわたり、InterSystems の数社のお客様と連携し、様々なユースケースに対応する CI/CD パイプラインを開発してきました。 この記事で紹介する情報が誰かのお役に立てられれば幸いです。

この連載記事では、InterSystems テクノロジーと GitLab を使用したソフトウェア開発の様々な可能なアプローチを取り上げています。

取り上げたいトピックは広範にありますが、今回は、コードを超えた内容についてお話ししましょう。構成とデータについてです。

問題

前回はコードの昇格について話しました。ある意味ステートレスで、常に、(おそらく)空のインスタンスから完全なコードベースへと進めます。 ただし、時にはデータまたは状態を提供することも必要です。 データには様々なタイプがあります。

  • 構成: ユーザー、ウェブアプリ、LUT、カスタムスキーマ、タスク、ビジネスパートナーなど
  • 設定: 環境固有の key-value ペア
  • データ: 参照テーブルとアプリが機能するために提供しなければならない場合があるテーブル

これらすべてのデータタイプについて、およびソース管理にコミットしてからデプロイする方法について説明します。

構成

システム構成は多数のクラスに広がっていますが、InterSystems IRIS はほとんどを XML にエクスポートできます。 まず最初に、これは以下についての情報を含むSecurityパッケージです。

  • Web アプリケーション
  • DocDB
  • ドメイン
  • 監査イベント
  • KMIPServers
  • LDAP 構成
  • リソース
  • ロール
  • SQL 特権
  • SSL 構成
  • サービス
  • ユーザー

これらのすべてのクラスは Exists、Export、および Import メソッドを提供しているため、環境間で移動することが可能です。

いくつかの欠点:

  • ユーザーと SSL 構成にはパスワードなどの機密情報が含まれる場合があります。 セキュリティ上の理由により、通常はこれらをソース管理に保存することは推奨されません。 1 回限りの転送を行うには Export/Import メソッドを使用します。
  • Export/Import メソッドはデフォルトですべてを 1 つのファイルに出力するため、ソース管理には不便である場合があります。 ルックアップテーブル、カスタムスキーマ、ビジネスパートナー、タスク、認証情報、および SSL 構成のエクスポートとインポートを行えるユーティリティクラスがあります。 これはファイル当たり 1 つの項目をエクスポートするため、LUT を含むディレクトリ、カスタムスキーマのディレクトリ、などを得ることができます。 SSL 構成の場合は、証明書やキーといったファイルもエクスポートします。

また、Export/Import の代わりに %Installer または Merge CPF を使用してこれらのほとんどを作成できることも覚えておくとよいでしょう。 いずれのツールもネームスペースとデータベースの作成をサポートしています。 Merge CPF はグローバルバッファーサイズなどのシステム設定を調整できます。

タスク

%SYS.Task クラスはタスクを保管し ExportTasks および ImportTasks メソッドを提供します。 また、タスクを 1 つずつインポート/エクスポートするには、上記のユーティリティクラスも確認してください。 タスクをインポートする際に StartDate またはその他のスケジュール関連のプロパティが過去の日時である場合、インポートエラー(ERROR #7432: Start Date and Time must be after the current date and time)が発生する可能性があることに注意しましょう。 ソリューションとして、LastSchedule0 に設定すると、InterSystems IRIS は新たにインポートしたタスクを最も近い未来に実行するようにスケジュールを設定し直します。

相互運用性

相互運用性本番には以下が含まれます。

  • ビジネスパートナー
  • システムのデフォルト設定
  • 認証情報
  • ルックアップテーブル

最初の 2 つは Ens.Config パッケージにあり、%Export%Import メソッドを使用できます。 認証情報とルックアップテーブルは上記のユーティリティクラスを使ってエクスポートします。 最近のバージョンでは、ルックアップテーブルは $system.OBJ クラスでエクスポート/インポートできます。

設定

システムデフォルト設定 - 環境固有の設定のデフォルトの相互運用性メカニズムです。

システムデフォルト設定の目的は、本番定義を環境間でコピーするプロセスを単純化することにあります。 いずれのプロダクションにおいても、いくつかの設定の値はプロダクションの設計の一部として決定されます。そのためこれらの設定は通常すべての環境で同一です。 一方でその他の設定は、環境に合わせて調整する必要があり、これらの設定にはファイルパス、ポート番号などが含まれます。

システムデフォルト設定は、InterSystems IRIS がインストールされている環境に固有の値のみを指定する必要があります。 それに反し、プロダクションの定義では、すべての環境で同一となる設定の値を指定する必要があります。

これらを本番環境で使用することを非常にお勧めします。 システムデフォルト設定を転送するには、%Export%Import を使用してください。

アプリケーション設定

アプリケーションもおそらく設定を使用します。 その場合、システムデフォルト設定を使用することをお勧めします。 これは相互運用性メカニズムではありますが、設定は %GetSetting(pProductionName, pItemName, pHostClassName, pTargetType, pSettingName, Output pValue)ドキュメント)からアクセスできます。 必要でないデフォルト設定を設定するラッパーを書くことができます。例:

ClassMethod GetSetting(name, Output value) As %Boolean [Codemode=expression]
{
##class(Ens.Config.DefaultSettings).%GetSetting("myAppName", "default", "default", , name, .value)
}

ほかにもカテゴリが必要な場合は、pItemNamepHostClassName 引数を公開することもできます。 設定は主に、インポート、システム管理ポータルの使用、Ens.Config.DefaultSettings クラスのオブジェクトの作成、または ^Ens.Config.DefaultSettingsD グローバルの設定によって設定できます。

ここでの主なアドバイスは、設定を 1 か所にまとめておき(システムデフォルト設定またはカスタムソリューションのどちらでもかまいません)、アプリケーションは指定された API のみを使用して設定を取得するようにすることです。 この場合、アプリケーション自体は環境について認識せず、残っているのは環境固有の値を含む集中設定ストレージを提供することだけです。 これを行うには、リポジトリに環境ブランチ名と同じファイル名で設定ファイルを含む設定フォルダを作成します。 次に、CI/CD フェーズにおいて、$CI_COMMIT_BRANCH 環境変数を使って正しいファイルを読み込みます。

DEV.xml
TEST.xml
PROD.xml

環境ごとに複数のファイルがある場合は、環境ブランチに因んだフォルダ名を使用してください。 InterSystems IRIS 内部から環境変数値を取得するには、$System.Util.GetEnviron("name")使用します

データ

一部のデータ(参照テーブル、カタログなど)を使用できるようにするには、いくつかの方法があります。

  • グローバルエクスポート。 バイナリ GOF export または新しい XML エクスポートをのいずれかを使用します。 GOF エクスポートの場合は、ソースとターゲットシステムのロケールが一致する(または少なくともグローバルこれ―ションがターゲットシステムで使用できる)必要があることに注意しましょう。 XML エクスポート にはさらに多くの空き容量が必要です。 グローバルを xml.gz ファイルにエクスポートし、$system.OBJ メソッドが必要に応じて xml.gz ファイルを自動的にアーカイブ(アーカイブ解除)するようにすることで改善できます。 このアプローチの主なデメリットは、XML であってもほとんどが base64 でエンコードされるため、データを人間が読み取れないことです。
  • CSV。 CSV をエクスポートして、LOAD DATA でインポートします。 CSV は最もストレージ効率が高く人間が読み取れる形式であるため、私の一番の優先オプションです。何にでもインポートできます。
  • JSON。 クラスを JSON 対応にします。
  • XML。 オブジェクトを XML に投影するためにクラスを XML 対応にします。 データに複合構造が含まれる場合に使用します。

どの形式を使用するかは、ユースケースによって異なります。 ここでは、ストレージ効率の順に形式をリストしていますが、データ量があまり多くない場合には考慮する点ではありません。

まとめ

状態は、CI/CD デプロイパイプラインをさらに複雑にしますが、InterSystems IRIS ではそれを管理するためのツールを豊富に提供しています。

リンク

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