継続的インテグレーション CI(継続的統合)

概要

CIは、テスト,Lint,Build,Deployを自動化する方法(アーキテクチャ)のこと。特定の技術ではない。 TEST,Lint,Build,Deployは従来、開発者がlocalhost環境で手動で行っていた。 CIは、それをサーバー環境でも自動で実施するすることができる。 ローカル環境でもテスト,Lintをすべきだが、やはり人間が行うとミスがあるので、サーバー環境でもチェックしようという意味がある。 例えば、CIツールを使えばgithubでmainにマージを行ったタイミングで本番環境にデプロイすることができる。 また、リポジトリにアップしたタイミングでテストやLintを行うという運用もある。

継続的デリバリー(CD)

デプロイの自動化に重きをおいた考え方を継続的デリバリー(CD)とも呼ぶ。 CIとセットで呼ばれることが多く、CI/CDという呼び方も見られる。

CIツール

古くはJenkinsがCIツールとしては良く知られている。 他にはTravis CI, Circle CI, GitHub Actionsなどがある。 2022年ではGitHubが有力。 CIはどこで実行されるか? LinuxのテストサーバーでCIをコマンド実行、 DockerでCIコマンドを実行など。

Jenkins

JenkinsはCI/CDツールで有名なもの。 Jenkins自体がテスト,Lint,Build,Deployを行うのでなくパイプ役という役目である。 GitHub,Caven,JUnitなどをパイプラインで繋げて次々と実行する。

GitHub Actionsの応用例

GitHubのmainブランチにマージしたタイミングで本番環境にデプロイするという応用がある。

AWS

CIツールの組み込みが可能であるがややこしい。 AWSの設定をいろいろいじるため、AWSに詳しくならねばならない。

DDD ドメイン駆動設計

概要

DDDとはソフトウェア開発手法の一つ。 事業者の業務の「ある領域」における特定の課題を解決することに重きをおいた開発手法。この「ある領域」をドメインと呼ぶ。 通常の開発手法はシステム視点であるが、DDDは業務視点とされる。 従来の開発手法であれば業務をシステムに合わせるという感じであるが、DDDは業務にシステムを合わせるという感じである。 ・複雑な処理の部分の開発手法に向いている。 ・マイクロサービスと相性が良いとのこと。 ・アジャイル開発手法と似ている。というか両立できるともある。 ・DDDは過去のプロジェクトの成功をモデル化したもの。それをソフトウェアに埋め込む。 ・高い保守性、再利用性、拡張性、変化に強いとされる。 ・反対の開発手法はユースケース駆動開発

開発の流れ

ウォーターフォール開発では事前に作るべきものを設計した上で、その設計通りに開発していく。 しかし、DDDは事業者と相談しながら更新を重ねる。

ドメインエキスパート

対象のドメインに詳しい人をドメインエキスパートと呼ぶ。 業務からシステムとして必要な個所だけ洗いだせる人のこと。 ドメインをモデルとして作り上げていく人 運用してみて必要が生じたらモデルに反映させる人 ・DDDの開発では事業担当者と話し合いを頻繁に行う必要がある。その話し合いをする人をドメインエキスパートと呼ぶ。 ・ドメインエキスパートは事業担当者とユビキタス言語で話す。→開発者と事業者が共通で利用する言語。

ドメインモデル

DDDにはドメインモデルという用語がある。 ドメインエキスパートは事業者から話を聞いてドメインモデルを作り上げ、プログラマはドメインモデルを見てプログラミングする。 ドメインモデルとクラスは同じ構造になっていなければならない。 ドメインモデルにはエンティティ、値オブジェクト、リポジトリという概念がある。 ・ドメインモデルは最初から決まっておらず、改善し続けるものである。 ・モデリング=モデルを作成する活動のこと。モデルはドメインモデルとも呼ばれる。 ・プログラミングのMVCモデルはModel, View, Controllerに分かれる。DDDではそのうちのModelが活躍する。

リポジトリ

倉庫ようにふるまうクラス。 倉庫から出し入れするように、DBやリソースからデータを取り出したり保存したりする。

エンティティ

エンティティはUMLのエンティティと大体同じ。ただエンティティのフィールド(プロパティ)にidが含まれる必要がある。

値オブジェクト

普通、「値」はプリミティブ型として扱う。 値オブジェクトは「値」クラス化したもの。 例えば「通貨」という値をクラス化した通貨クラスという値オブジェクトを作成できる。 通貨クラスは加算機能、単位変更機能なのだが実装される。 「通貨」を値オブジェクト化すると「資金」という呼び方がふさわしくなる。 「年齢」を値オブジェクト化した場合、西暦表記変換機能や和暦変換などの実装が考えられる。