真実のアプリの単一のソース:1つのrepoですべてのリソースのケースを作る


あなたはよくエンジニアとの会話についてエンジニアと話をするでしょう"Single Source of Truth" (SSoT) 特定のデータモデルにアクセスするエントリの1つのポイントを持つ方法として.これにより、ホスト名や接続文字列の組織のwikisを検索したり、データベースやデータフローダイアグラムへの参照可能なコードreposを追跡できません.確かに、あなたはあなたが探偵作業を行うと言うことができるバグを修正するために保存します.

そして、それはすべてのための単一のポイントである必要はありません、それはデータモデルに基づいて分割することができます.私がIT部門のための開発者であったとき、これはワークステーション課題のためにユーザーの詳細、資産管理データベースとネットワーク装置詳細のためのActive Directoryでありえました.
あなたが従うならば、あなたもあなたのコードでこれを認識しますSOLID 原則、特に「単一責任原理」

"There should never be more than one reason to change" or "every class should have only one responsibility"


言い換えると、論理の一部は1つのもの/ドメインに対して責任があるだけです.つ以上の場所にロジックを持っている場合は、独自のモジュールや関数に分割します.これはまた、2010年のコアコンセプトですDRY principles .
この「単一の責任」思考のタイプは、SSOTの中心にあります.

  • 努力の重複:これは、リソースの任意のタイプ(人の時間、ホスティング、ドキュメント、金融、サービスなど)を維持し、変更する努力することができます.

  • ヒューマンエラー:避けられない.人間のインタラクションが起こることがありえるインスタンスのナンバーを減らすことは、データが不正確でありえる回数を減らす.データモデルについては、これはデータモデル構造かデータ入力でありえます.しっかりした原則のために、これは誤って単一の場所で、または、一貫してすべてを横切って実装される特徴またはバグ修正でありえます.

  • どのようにアプリはこれに収まりますか?
    展開取得アプリの例を見てください.もちろん、すべてのアプリケーションは異なっているし、別の構造を持っているので、私はこのシンプルを維持します.
    私たちにはリリースされるべき特徴があります.以下の手順は
  • 機能を開発し、リリースブランチまたはトランクにPRを準備します.これは、機能のためのユニットテストとAPI/構造ドキュメントが含まれます.
  • 機能は、インフラストラクチャに新しいリソースを必要とするので、コード(IAC)の実装としてインフラストラクチャに変更を要求します.これはコードレビュープロセスを経て、devとdevopsチーム間の調整で各環境に展開されます.
  • コードレビューでは、ビルドをdevとqaの段階でプッシュし、uatの準備ができました.我々は現在、新しい機能を含む使用機能の変更を使用してwiki(Confluence、Git *ページなど)に入ることができます.
  • コードレビューを受け入れ、変更を生産にプッシュされます.
  • 真実の源は以下の通りです.
  • コードrepo (ソースコード用)
  • Wiki (ドキュメント用)
  • CI/CDパイプライン(単体テスト、ビルド、展開用)、および
  • IAC(リソースプロビジョニング用).
  • この理解を伴う問題は、1つの「源」の変化は別の源の変化に依存しています.これは上記の問題を強調します.

  • ステップとしての努力の重複は、同じチームまたは複数のチームによって複数の場所で取られる必要があります.

  • ヒューマンエラーは、これらの“ソース”のいずれかとして導入されているか忘れてはいけないか、機能に関連しない決定した.
  • エラーのこの導入の理由は、“ソース”と“ドメインのソース”に焦点を当てる“真実の単一のソース”のポイントを逃している.この場合、ドメインはアプリケーションです.

    ドメイン・ロジック

    今私たちのアプリケーション/ドメインの詳細を単一のソースに集中するときに発生します:
  • 機能を開発し、リリースブランチまたはトランクにPRを準備します.これには、ユニットテスト、IAC変更、API/構造ドキュメント、wikiドキュメントをASCII Doctor/Markdown/RSTとします.
  • パイプラインはPRを拾って、特徴コード、IACとドキュメンテーション構文に対して単位テストを実行します.
  • コードのレビューは、devとqaを介して機能をプッシュします.各ステップは、環境にIACを適用し、更新された環境に機能ビルドを展開します.dev、devops、secopsなどのメンバーは、コードレビュープロセスの一部になります.
  • UAT/生産段階では、ドキュメントの選択の拡張を使用してwikiにプッシュされますMark for Markdown , Official AsciiDoctor Exporter , and RST Exporter ), または出版のためのDocBook/電子ブック/PDFに解析されます.
  • これらの2つのプロセスの間の注意への1つの変更は、人間のインタラクションの縮小と「GO TOシステム」ステップです.パイプラインはすべてのタスクを更新します.リポジトリを調べると、すべての更新ファイルがrepoの一部として存在します.
    project
     |- doc/
         |- index.ad
         |- usage.ad
     |- infra/
         |- app.yml (ansible playbook)
         |- main.hcl (terraform project)
     |- pipeline/
         |- main.yml
         |- env_template.yml
     |- project/
         |- lib/
             |- ...
         |- project.(py|ts|...)
    CONTRIBUTORS.md
    CHANGELOG.md
    README.ad
    USAGE.ad
    ...
    
    他の大きな変化は、我々のコードの品質を検証するために非人間のチェックを適用するために、我々のパイプラインの中にいくつかのステージゲートを実装した方法です.これは、コードレビューと生産へのより速い展開の間、考慮するより少ないものを意味します.

    考慮
    もちろん、私たちがすることに対して常にダウンサイドになることがあります.これは違うので、我々はそれを得る必要があります.

  • より多くの前部投資:これがうまく働くために、多くの仕事は、この責任をとるために我々のパイプラインを準備するためにされる必要があります.私はこれを投資と呼びます、しかし、前に費やされる時間が仕事を繰り返すためにより少ない時間を後で意味するので.これは
  • 我々のWikiにコンテンツを書くか、我々のIACプロビジョナーと統合するためのサービスアカウント/トークンの作成
  • チェックとユニットテストを実装するパイプラインの記述
  • ステージゲートを簡素化するために情報を収集するパイプラインタスクの実装
  • 接続文字列とアクセス許可を扱うための秘密の活用
  • テストスイートを設計して、アプリケーションテストを実行するだけでなく、他のすべてのテストを実行します.

  • 柔軟性が低い:このプロセスがどのように厳密に統合されているかによって、プロトタイピング、展開、およびドキュメンテーションに関して、柔軟性が等しくなります.

  • いいえ、“高速修正”:私たちは今、この巨大なパイプラインプロセスを実装しているとして、単一の行の変更を作成するためのタイプミスを修正する“ビルドと展開”として単純ではありません.新しい機能を実装したかのように、同じチェックのすべてを実行する必要があります.
  • これらの違いに応じて

  • 徹底的なコードレビュー:パイプラインは、コードレビュープロセスを自動化する多くのツールと実行されたプロセスを実装できます.これは、シニアとリードは、彼らが集中するべきものに集中することができることを意味します.プログレスプロセスがパイプラインで文書化されているように、アップフロント作業も段階的に行うことができます.

  • 生産へのより速い時間:我々がコードレビューのタスクの多くを自動化したので、我々はいつでも彼らを走らせることができて、必要に応じて人間ベースのステージゲートを要求するだけです.これは潜在的に数週間から数日または時間までの機能のローテーションをスピードアップすることができます.

  • “高速修正”は“可能”です:私は高速修正がまだ行われることができますので、引用符で追加しています.パイプラインはまだ徹底的に行われているが、パイプラインがどれくらい速く動くかに基づいて、「高速修正」を出すことができる.もう一つの注意は、パイプラインが正しく仕事をしているならば、私たちは、「高速修正」が過去のものである点に着くべきです.
  • あなたが何を考えるかについて知らせてください.私たちは皆、私たちの違いを持っています、そして、私は私がここで考えなかった考慮があると確信します.様々なプロセスをしようとすると激しく異なる別の下での作業から、これは(時間を与えられた)非常によく評価され、歓迎されるプロセスです.