RareJob Tech Blog

レアジョブのエンジニア・デザイナーによる技術ブログです

PlantUML で仕様を明確に、常に最新に更新する

どうも。システムディレクションチームのいとうです。 幼少向け学校法人様向け などいろいろなサービスの開発側ハンドリングをしています。

さて、いろいろな要求仕様を具体的な設計に落とし込んでいったり、既存の仕様を整理するために、ユースケースフローチャートを作成したり ER 図を書いたりすることはよくあるかと思います。

こういう図って、性格が出ますよね。 ツールによってはどうしても線が曲がってしまったり、きれいに整列させることが難しかったり、またせっかくきれいに書いていても、途中で間にオブジェクトを追加するとレイアウトが崩れたりなかなか厄介です。オンライン・オフライン問わず、ライセンスの数が足りなくなったりもありますよね。 また、最終的に出力されるのが画像なので、変更差分を目で見ると大変ですし、履歴を残すにしても人によって変更履歴の粒度はまちまちです。

そこで、PlantUML

f:id:lunasys:20190716165553p:plain
sequence_sample
こんなのや
f:id:lunasys:20190716165819p:plain
usecase_sample
こんなのがテキストベースで簡単に管理できてしまいます。

IDEプラグインとしては、 VS Code 用 だったり IntelliJ 用 があるのでローカル環境では瞬殺で導入することができます。 Markdown にも対応しているのですんなり Git 管理下にも置くことができます。

とはいえ、非エンジニアがプラグインを入れないと見れないのは辛い。そのために、わざわざ画像で出力するのはめんどくさい効率が悪すぎる。 Confidential な内部仕様を 公式の PlantUML Server を利用して描画するのは問題があるため、専用のインスタンスAWS Fargate で立ち上げてみましょう。

AWS Fargate で立ち上げる

  1. クラスター作成
    適当な VPC 配下にクラスターを作成します。直接グローバル IP を付与しないのであれば、 ALB を立てる必要があるので、サブネットは最低 2つの AZ が必要です。
  2. タスク定義
    FARGATE タスクを作成します。タスクロールはデフォルトの ecsTaskExecutionRole のままでいいでしょう。タスクサイズは最低の 512MB メモリと 0.25vCPU でもとりあえず問題ないです。コンテナイメージは、 公式のものを そのまま指定します。 (plantuml/plantuml-server:tomcat)
  3. サービスの追加
    作成したクラスターからサービスを作成します。起動タイプ FARGATE タスク定義に、作成したタスク定義を指定します。タスクの数もまずは 1 でいいでしょう。ネットワーク構成、AutoScaling (必要あれば) を完了すれば、自動的にコンテナが起動します。

起動したコンテナの http://[INSTANCE HOST]:8080/uml もしくは ALB 経由の http://[ALB ARN]/uml でアクセスできれば準備完了です。

Confluence で利用する

Confluence では、 Cloud 向け には Draw.io が、 Server 向け には avono AG がそれぞれアプリを公開しています。

Gitlab で利用する

弊社では Git 環境で主に Gitlab を利用していますが、公式で PlantUML に対応しています。 https://docs.gitlab.com/ee/administration/integration/plantuml.html#gitlab から有効にし、 PlantUML URL にコンテナの URL を入力すれば、 WikiIssue でインライン Markdown で PlantUML が使えるようになります。 Issue で細かい仕様を詰めつつ、成果物を Confluence に上げていくような使い方もできますね。

GitHub で利用する

GitHub ではいまのところ、 まだ検討の前段階 のようですね。 クラスメソッドの中の人が Chrome 拡張 を公開してくれているようです。

さいごに

絵心がある人もない人も、UML チャートならみんなが共通の認識を持つことができます。 複雑化するプロダクトも、エンジニアと非エンジニアも、UML チャートで正しく最新に管理しましょう。

UML を書いたことがある人もない人も、一緒にいいプロダクトを作りたい方、ぜひお待ちしています!