外部リポジトリ内の契約を使用したコンシューマー主導の契約

このフローでは、コンシューマー主導契約のテストを実行します。契約定義は別のリポジトリに保存されます。

前提条件

外部リポジトリに保持されている契約でコンシューマー主導契約を使用するには、次のような Git リポジトリをセットアップする必要があります。

  • 各プロデューサーのすべての契約定義が含まれます。

  • 契約定義を JAR にパッケージ化できます。

  • 契約プロデューサーごとに、Spring Cloud Contract プラグイン (SCC プラグイン) を通じてスタブをローカルにインストールする方法 (たとえば、pom.xml) が含まれています。

詳細については、このようなリポジトリのセットアップメソッドについて説明している使い方セクションを参照してください。このようなプロジェクトの例については、このサンプル [GitHub] (英語) を参照してください。

Spring Cloud Contract Stub Runner がセットアップされたコンシューマーコードも必要です。このようなプロジェクトの例については、このサンプル [GitHub] (英語) を参照してください。Spring Cloud Contract がセットアップされたプロデューサーコードとプラグインも必要です。このようなプロジェクトの例については、このサンプル [GitHub] (英語) を参照してください。スタブストレージは Nexus または Artifactory です。

大まかな流れは次のとおりです。

  1. コンシューマーは、別のリポジトリからの契約定義を使用して作業します。

  2. コンシューマーの作業が完了すると、動作するコードを含む ブランチ がコンシューマー側で作成され、契約定義を保持する別のリポジトリに対してプルリクエストが行われます。

  3. プロデューサーは、契約定義を含む別のリポジトリへのプルリクエストを引き継ぎ、すべての契約を含む JAR をローカルにインストールします。

  4. プロデューサーは、ローカルに保存された JAR からテストを生成し、テストに合格するために不足している実装を書き込みます。

  5. プロデューサーの作業が完了すると、契約定義を保持するリポジトリへのプルリクエストがマージされます。

  6. CI ツールが契約定義を含むリポジトリを構築し、契約定義を含む JAR が Nexus または Artifactory にアップロードされた後、プロデューサーは ブランチ をマージできます。

  7. 最後に、コンシューマーはオンラインでの作業に切り替えて、リモート の場所からプロデューサーのスタブを取得し、ブランチ をマスターにマージできます。

コンシューマーの流れ

コンシューマー:

  1. プロデューサーにリクエストを送信するテストを作成します。

    サーバーが存在しないため、テストは失敗します。

  2. 契約定義を保持するリポジトリのクローンを作成します。

  3. コンシューマー名をプロデューサーのサブフォルダーとして、フォルダーに要件を契約として設定します。

    例: producer という名前のプロデューサーと consumer という名前のコンシューマーの場合、契約は src/main/resources/contracts/producer/consumer/ に保存されます)

  4. 契約が定義されると、次の例に示すように、プロデューサースタブがローカルストレージにインストールされます。

    $ cd src/main/resource/contracts/producer
    $ ./mvnw clean install
  5. コンシューマーテストで Spring Cloud Contract (SCC) スタブランナーをセットアップして、次のことを行います。

    • ローカルストレージからプロデューサースタブを取得します。

    • コンシューマーごとのスタブモードで作業します (これにより、コンシューマー主導の契約モードが有効になります)。

      SCC スタブランナー:

    • プロデューサーのスタブを取得します。

    • インメモリ HTTP サーバースタブをプロデューサースタブとともに実行します。これで、テストが HTTP サーバースタブと通信し、テストが成功しました。

    • プロデューサーの新しい契約を使用して、契約定義を含むリポジトリへのプルリクエストを作成します。

    • プロデューサーチームがコードをマージするまで、コンシューマーコードを ブランチ します。

次の UML 図は、コンシューマーフローを示しています。

flow-overview-consumer-cdc-external-consumer

プロデューサーの流れ

プロデューサー:

  1. 契約定義を含むプルリクエストをリポジトリに引き継ぎます。次のようにコマンドラインから実行できます

    $ git checkout -b the_branch_with_pull_request master
    git pull https://github.com/user_id/project_name.git the_branch_with_pull_request
  2. 次のように契約定義をインストールします

    $ ./mvnw clean install
  3. 次のように、src/test/resources/contracts からではなく JAR から契約定義をフェッチするようにプラグインを設定します。

    === Maven::

    +

    <plugin>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-contract-maven-plugin</artifactId>
    	<version>${spring-cloud-contract.version}</version>
    	<extensions>true</extensions>
    	<configuration>
    		<!-- We want to use the JAR with contracts with the following coordinates -->
    		<contractDependency>
    			<groupId>com.example</groupId>
    			<artifactId>beer-contracts</artifactId>
    		</contractDependency>
    		<!-- The JAR with contracts should be taken from Maven local -->
    		<contractsMode>LOCAL</contractsMode>
    		<!-- ... additional configuration -->
    	</configuration>
    </plugin>
    Gradle
    contracts {
    	// We want to use the JAR with contracts with the following coordinates
    	// group id `com.example`, artifact id `beer-contracts`, LATEST version and NO classifier
    	contractDependency {
    		stringNotation = 'com.example:beer-contracts:+:'
    	}
    	// The JAR with contracts should be taken from Maven local
    	contractsMode = "LOCAL"
    	// Additional configuration
    }

    ===

  4. 次のように、ビルドを実行してテストとスタブを生成します。

    === Maven::

    +

    ./mvnw clean install
    Gradle
    ./gradlew clean build

    ===

  5. テストに合格するために、欠落している実装を書き込みます。

  6. 次のように、プルリクエストを契約定義とリポジトリにマージします。

    $ git commit -am "Finished the implementation to make the contract tests pass"
    $ git checkout master
    $ git merge --no-ff the_branch_with_pull_request
    $ git push origin master

    CI システムは、契約定義を使用してプロジェクトを構築し、契約定義を使用して JAR を Nexus または Artifactory にアップロードします。

  7. リモート作業に切り替えます。

  8. 次のように、契約定義がローカルストレージからではなく リモート の場所から取得されるようにプラグインを設定します。

    === Maven::

    +

    <plugin>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-contract-maven-plugin</artifactId>
    	<version>${spring-cloud-contract.version}</version>
    	<extensions>true</extensions>
    	<configuration>
    		<!-- We want to use the JAR with contracts with the following coordinates -->
    		<contractDependency>
    			<groupId>com.example</groupId>
    			<artifactId>beer-contracts</artifactId>
    		</contractDependency>
    		<!-- The JAR with contracts should be taken from a remote location -->
    		<contractsMode>REMOTE</contractsMode>
    		<!-- ... additional configuration -->
    	</configuration>
    </plugin>
    Gradle
    contracts {
    	// We want to use the JAR with contracts with the following coordinates
    	// group id `com.example`, artifact id `beer-contracts`, LATEST version and NO classifier
    	contractDependency {
    		stringNotation = 'com.example:beer-contracts:+:'
    	}
    	// The JAR with contracts should be taken from a remote location
    	contractsMode = "REMOTE"
    	// Additional configuration
    }

    ===

  9. プロデューサーコードを新しい実装とマージします。

  10. CI システム:

    • プロジェクトをビルドします。

    • テスト、スタブ、スタブ JAR を生成します。

    • アプリケーションとスタブを含むアーティファクトを Nexus または Artifactory にアップロードします。

次の UML 図は、プロデューサープロセスを示しています。

flow-overview-consumer-cdc-external-producer