4.1 概要

データベース・アプリケーション継続的インテグレーションおよび継続的デリバリ(CI/CD)は、現代のデータベース管理およびアプリケーション開発における変革的アプローチとなります。この方法論では、データベースの変更内容を開発パイプラインにシームレスに統合しながら、本番環境への迅速かつ安全なデプロイメントが実現されます。データベースCI/CDでは、継続的インテグレーションの迅速なフィードバック・メカニズムと継続的デリバリの合理化されたデプロイメント・プロセスを組み合せることで、今日のペースの速いソフトウェア開発環境における俊敏性と信頼性についての重要なニーズに対応しています。

データベースCI/CD

根本的に、Database CI/CDでは次のことを目的としています:

  • 新機能や更新について、市場投入までの期間を短縮する。
  • 一貫して高品質なコードおよびデータベース・スキーマを維持する。
  • 問題の即時検出および解決を容易にする。
  • アプリケーション・コンポーネントとデータベース・コンポーネントの両方が常にデプロイ可能な状態になっていることを確認する。

このアプローチでは、開発効率が高まるのみでなく、頻繁かつ信頼性の高いリリースによってエンド・ユーザー・エクスペリエンスが大幅に向上します。

Oracle SQLclのprojectコマンドは、データベース・ソフトウェアのバージョニングを標準化しAPEX要素などのリリース可能な成果物を作成するように設計されている強力なツールです。このコマンドでは、開発と運用の一貫したモデルがサポートされており、特定の順序で適用できる反復可能ビルドを実行できるようになります。

SQLclプロジェクトの主な機能は次のとおりです:

  • バージョニングによる機能の管理: データベース開発者が、個々の変更内容を識別し、バージョニングされた機能または問題を作成できます。
  • リリース・アーティファクトの作成: 複数の変更内容をまとめて単一のリリース・アーティファクト(使用のために公開可能)にできます。
  • 正しい順序でのインストール: その環境に以前にインストールされたコンポーネントを考慮に入れ、成果物を正しい順序でインストール可能であることを確認します。
  • ソース・コントロールの統合: ソース・コントロールでのブランチの作成、およびこれらのブランチへのオブジェクトのエクスポートをサポートします。変更内容は、ブランチの差分を使用して実現され、一貫した形式になります。それにより、ファイル・チェックサムによる識別が容易になります。
  • リリースの自動パッケージング: 複数のブランチまたは変更内容が作成されたときに、SQLclプロジェクトにより、それらを1つのリリースにまとめて、自動的に、ターゲット・システムで正しい順序ですべての変更セットが実行されるように設定できます。

SQLclプロジェクト機能は、データベース開発ワークフローの合理化、バージョン管理の強化、データベース・アプリケーションの開発およびデプロイメント・プロセスの全体的な効率の向上のための大きな一歩となります。

4.1.1 サポートされているオブジェクト

サポートされているデータベース・オブジェクト・タイプは、project exportコマンドとproject stageコマンドでの使用がテストされています。次のリストに含まれていないタイプはすべて、project stage add-customコマンドをカスタムSQLとともに使用して追加できます。add-customサブコマンドの詳細は、SQLclコマンドライン・ヘルプでhelp project stage add-customと入力してください。

サポートされているデータベース・オブジェクト・タイプを次に示します:

  • APEX_APP
  • CONSTRAINT
  • CONTEXT
  • FUNCTION
  • INDEX
  • OBJECT_GRANT
  • PACKAGE_BODY
  • PACKAGE_SPEC
  • PROCEDURE
  • REF_CONSTRAINT
  • ROLE_GRANT
  • SEQUENCE
  • SYNONYM
  • SYSTEM_GRANT
  • TABLE
  • TRIGGER
  • TYPE_BODY
  • TYPE_SPEC
  • USER
  • VIEW

4.1.2 データベースCI/CDの概念

この項では、SQLclプロジェクトの理解に関連する概念を説明します。

データベース継続的インテグレーション(CI)とデータベース継続的デリバリ(CD)

データベース継続的インテグレーション(CI)は、データベース・スキーマとロジックの変更をアプリケーション開発に頻繁に統合するプロセスであり、問題に関する即時フィードバックを提供することを目的としています。データベース継続的デリバリ(CD)は、これらの変更内容を本番環境に迅速かつ安全にデプロイすることに重点を置いており、アプリケーションとデータベース・コードの両方が常にデプロイ可能な状態にあるようにします。データベースCI/CDを組み合せることで、市場投入までの時間を短縮し、頻繁かつ高品質なリリースを通じて、一貫したエンドユーザー価値を実現します。

データベース・プロジェクトのスキャフォールディング

SQLclプロジェクトを(project initコマンドを使用して)初期化すると、SQLclにより、ファイルと変更ログの作成を管理するために使用する一連のファイルが作成されます。

初期設定では次の3つのフォルダがあります:

  • .dbtools: このフォルダには次の内容が含まれます:

    • エクスポートされるオブジェクトをフィルタで除外するためにproject exportで使用されるプロジェクト・フィルタ。
    • エクスポート時にコードの形式設定に使用されるプロジェクト形式ルール。
    • プロジェクト構成設定。
  • src: このフォルダは、データベースからエクスポートされたオブジェクトが配置される場所です。これは、スキーマとオブジェクト・タイプ別に分かれています。

  • dist: リリース・アーティファクトがこのフォルダ内に作成されます。このフォルダはproject stageコマンドによって移入され、project releaseコマンドによってその内容が圧縮されてリリース・アーティファクトが作成されます。

──.dbtools
│   ├── filters
│   │   └── project.filters
│   ├── project.config.json
│   └── project.sqlformat.xml
├── dist
│   ├── README.md
│   └── install.sql
└── src
    ├── README.md
    └── database
        ├── README.md
        └── hr

拡張データベース・オブジェクト・エクスプローラ

SQLclプロジェクトの主要機能の1つは、ソース・コントロール・リポジトリへのデータベース・オブジェクトのエクスポートです。このエクスポートには、オブジェクトの作成に必要なSQLと、オブジェクトのメタデータの"スナップショット"が含まれます。このスナップショットはコメントとして格納され、sqlcl_snapshotという接頭辞が付きます。次の情報が含まれます。

  • エクスポートされたコードに対して計算されたチェックサム
  • オブジェクト・タイプ
  • オブジェクト名
  • スキーマ名
  • エクスポートされたオブジェクトのSXML表現(DBMS_METADATA SXMLを参照)
エクスポートされたオブジェクトには次のパスが使用されます:
src/database/<SCHEMA>/<OBJECT_TYPE>/<OBJECT_NAME>[.sql|.pks|.pkb]
たとえば、HRスキーマにあるdocという表の場合、ファイル・パスはsrc/database/hr/tables/doc.sqlです。
create table hr.doc (
    id number
);
-- sqlcl_snapshot {"hash":"d992dceaa87a936e8242bdc81201f93030084ab5","type":"TABLE","name":"DOC","schemaName":"HR","sxml":"<TABLE xmlns=\"http://xmlns.abc.com/ku\" version=\"1.0\"> <SCHEMA>HR</SCHEMA> <NAME>DOC</NAME> <RELATIONAL_TABLE><COL_LIST> <COL_LIST_ITEM><NAME>ID</NAME><DATATYPE>NUMBER</DATATYPE> </COL_LIST_ITEM></COL_LIST><DEFAULT_COLLATION>USING_NLS_COMP</DEFAULT_COLLATION><PHYSICAL_PROPERTIES> <HEAP_TABLE></HEAP_TABLE></PHYSICAL_PROPERTIES> </RELATIONAL_TABLE></TABLE>"}

データベース移行スクリプトの自動生成

開発者がデータベースに変更内容を追加すると、それらがブランチにエクスポートされます。Gitブランチは、作業単位間の変更内容を識別するために使用されます。ブランチ間の差分を使用して、変更されたファイルが識別されます。

Gitのブランチと差分

各オブジェクト・ファイルには、特定のチェックサムがあり、場合によっては、そのオブジェクトの指定のための特定のSXMLがあります。OracleのDBMS_METADATA_DIFFを使用すると、SXMLファイルが比較され、両方のオブジェクトを同一にするためのDDLが生成されリポジトリに追加されます。

リリース可能な成果物の構築

デプロイメントの一貫性を確保するには、文を特定の順序で実行する必要があります。文は、一旦実行された後に、再び実行されることはありません(不変)。ユーザーがスキーマやオブジェクトの変更セットを作成できるようにするためにSQLclに導入された、Liquibaseサポートを実行すると、オブジェクトをデータベースにインストールできます。SQLclプロジェクトは、ブランチにある変更内容のブロックごとに変更セットを生成しそれらをまとめてビルドしてリリースにするために、そのサポートに基づいて構築されています。

これは、ブランチ間の比較セットを取得し、比較のリストを表す変更ログの階層型スキャフォールディングを生成することで実現されます。その後、比較セットを使用してSXMLの差分が生成され、それを使用してその変更内容のためのDDLが生成されます。

階層型変更ログ

変更内容のエクスポート後に、project stageコマンドにより、現在のブランチとメイン・ブランチとの差分について変更セットが生成されます。

–-Example
next
├── release.changelog.xml
└── changes
    └── initial-export
        ├── hr
        │   └── table
        │       └── doc.sql
        └── stage.changelog.xml
この例では、doc.sqlにエクスポートされる表が1つあります。この例は、概念を説明するために簡略化されています。project stageコマンドでは、現在のブランチの内容が比較されます。デフォルトでは、プロジェクトのベース・ブランチに対してそれが比較されます。ベース・ブランチを制御するプロジェクト構成はgit.defaultBranchです。これは、次のコマンドを使用して表示できます:
project config -list -name git.defaultBranch
これを変更するには、同じconfigコマンドを-setオプションとともに使用します。
SQL> project config -list -name git.defaultBranch 
 +============================+
 | SETTING NAME      | VALUE  |
 +============================+
 | git.defaultBranch | master |
 +----------------------------+
project stageコマンドにも所定の形式があります。コマンドを実行すると、次の構造が作成されます:
next/changes/<branch_name>
この例では、hr.doc表の初期エクスポート用に作成されたブランチをinitial-exportと呼びます。新しいブランチが作成されstageコマンドが実行されるたびに、next/changes/<branch_name>の下に新しいフォルダができます。

この例では、doc.sqlファイルは、自動的に先頭にLiquibaseフォーマット済SQL形式が含まれており、個別の変更セットとして定義されています。doc.sqlは、変更ログ・ファイル内で参照されます。

-- Liquibase-formatted sql
-- changeset HR:d992dceaa87a936e8242bdc81201f93030084ab5 stripComments:false logicalFilePath:initial-export/hr/table/doc.sql
-- sqlcl_snapshot src/database/hr/tables/doc.sql:null:d992dceaa87a936e8242bdc81201f93030084ab5:create
 
create table hr.doc (
    id number
);

この例では、stage.changelog.xmlによってLiquibaseフォーマット済SQLの変更セットが参照されています。

--stage.changelog.xml

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
<!--BEGIN-->
<include file="hr/table/doc.sql" relativeToChangelogFile="true"/>
<!--END-->
<!--BEGIN CUSTOM-->
<!--END CUSTOM-->
</databaseChangeLog>

nextフォルダには、最上部にrelease.changelog.xmlがあります。このファイルは、project releaseコマンドで再度参照されます。

--release.changelog.xml

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
<!--BEGIN CHANGE-->
<include file="changes/initial-export/stage.changelog.xml" relativeToChangelogFile="true"/>
<!--END CHANGE-->
<!--BEGIN CODE-->
<!--END CODE-->
</databaseChangeLog>

すべての変更内容がリリース用に作成されたら、project releaseコマンドを実行してnextフォルダにあるすべてのファイルを取得し、それらを"番号付きリリース"フォルダに移動します。

最終的な構造は次のとおりです:

releases
├── 1.0
│   ├── code
│   │   └── code.changelog.xml
│   ├── release.changelog.xml
│   └── changes
│       └── initial-export
│           ├── code
│           │   └── _custom
│           ├── hr
│           │   └── table
│           │       └── doc.sql
│           └── stage.changelog.xml
├── main.changelog.xml
├── next
│   └── release.changelog.xml
└── util
    ├── prechecks.sql
    └── recompile.sql

再実行可能な成果物を生成するには、project gen-artifactコマンドを実行します。これにより、artifacts/<projectname>-<version>.zipでファイルが作成されます。デフォルトでは、成果物はGitリポジトリに含まれません(これを変更するには、.gitignoreファイルを変更します)。

この成果物の内容は次のとおりです:

releases/next/release.changelog.xml
releases/1.0/changes/initial-export/stage.changelog.xml
releases/1.0/changes/initial-export/hr/table/doc.sql
releases/1.0/release.changelog.xml
releases/1.0/code/code.changelog.xml
releases/util/recompile.sql
releases/util/prechecks.sql
releases/main.changelog.xml
README.md
install.sql

最後の部分は、本番データベースへの成果物のデプロイです。コマンドproject deployにより、生成された成果物を取得し、SQLclを使用してそれを実行します。

SQL> project deploy -file demo-1.0.zip 
Starting the migration...
Running Changeset: initial-export/hr/table/doc.sql::d992dceaa87a936e8242bdc81201f93030084ab5::HR
Table HR.DOC created.
Liquibase: Update has been successful. Rows affected: 1
Installing/updating schemas
--Starting Liquibase at 2024-09-19T09:09:02.326601 (version [local build] #0 built at 2024-08-14 18:40+0000)
Table HR.DOC created.
 
UPDATE SUMMARY
Run:                          1
Previously run:               0
Filtered out:                 0
-------------------------------
Total change sets:            1
 
Produced logfile: sqlcl-lb-1726733337322.log
Operation completed successfully.
Migration has been completed.