外部リポジトリ内の契約を使用したコンシューマー主導の契約
このフローでは、コンシューマー主導契約のテストを実行します。契約定義は別のリポジトリに保存されます。
前提条件
外部リポジトリに保持されている契約でコンシューマー主導契約を使用するには、次のような Git リポジトリをセットアップする必要があります。
各プロデューサーのすべての契約定義が含まれます。
契約定義を JAR にパッケージ化できます。
契約プロデューサーごとに、Spring Cloud Contract プラグイン (SCC プラグイン) を通じてスタブをローカルにインストールする方法 (たとえば、
pom.xml
) が含まれています。
詳細については、このようなリポジトリのセットアップメソッドについて説明している使い方セクションを参照してください。このようなプロジェクトの例については、このサンプル [GitHub] (英語) を参照してください。
Spring Cloud Contract Stub Runner がセットアップされたコンシューマーコードも必要です。このようなプロジェクトの例については、このサンプル [GitHub] (英語) を参照してください。Spring Cloud Contract がセットアップされたプロデューサーコードとプラグインも必要です。このようなプロジェクトの例については、このサンプル [GitHub] (英語) を参照してください。スタブストレージは Nexus または Artifactory です。
大まかな流れは次のとおりです。
コンシューマーは、別のリポジトリからの契約定義を使用して作業します。
コンシューマーの作業が完了すると、動作するコードを含む ブランチがコンシューマー側で作成され、契約定義を保持する別のリポジトリに対してプルリクエストが行われます。
プロデューサーは、契約定義を含む別のリポジトリへのプルリクエストを引き継ぎ、すべての契約を含む JAR をローカルにインストールします。
プロデューサーは、ローカルに保存された JAR からテストを生成し、テストに合格するために不足している実装を書き込みます。
プロデューサーの作業が完了すると、契約定義を保持するリポジトリへのプルリクエストがマージされます。
CI ツールが契約定義を含むリポジトリを構築し、契約定義を含む JAR が Nexus または Artifactory にアップロードされた後、プロデューサーは ブランチをマージできます。
最後に、コンシューマーはオンラインでの作業に切り替えて、リモートの場所からプロデューサーのスタブを取得し、ブランチをマスターにマージできます。
コンシューマーの流れ
コンシューマー:
プロデューサーにリクエストを送信するテストを作成します。
サーバーが存在しないため、テストは失敗します。
契約定義を保持するリポジトリのクローンを作成します。
コンシューマー名をプロデューサーのサブフォルダーとして、フォルダーに要件を契約として設定します。
例:
producer
という名前のプロデューサーとconsumer
という名前のコンシューマーの場合、契約はsrc/main/resources/contracts/producer/consumer/
に保存されます)契約が定義されると、次の例に示すように、プロデューサースタブがローカルストレージにインストールされます。
$ cd src/main/resource/contracts/producer $ ./mvnw clean install
コンシューマーテストで Spring Cloud Contract (SCC) スタブランナーをセットアップして、次のことを行います。
ローカルストレージからプロデューサースタブを取得します。
コンシューマーごとのスタブモードで作業します (これにより、コンシューマー主導の契約モードが有効になります)。
SCC スタブランナー:
プロデューサーのスタブを取得します。
インメモリ HTTP サーバースタブをプロデューサースタブとともに実行します。これで、テストが HTTP サーバースタブと通信し、テストが成功しました。
プロデューサーの新しい契約を使用して、契約定義を含むリポジトリへのプルリクエストを作成します。
プロデューサーチームがコードをマージするまで、コンシューマーコードを ブランチします。
次の UML 図は、コンシューマーフローを示しています。
プロデューサーの流れ
プロデューサー:
契約定義を含むプルリクエストをリポジトリに引き継ぎます。次のようにコマンドラインから実行できます
$ git checkout -b the_branch_with_pull_request master git pull https://github.com/user_id/project_name.git the_branch_with_pull_request
次のように契約定義をインストールします
$ ./mvnw clean install
次のように、
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 }
次のように、ビルドを実行してテストとスタブを生成します。
- Maven
./mvnw clean install
- Gradle
./gradlew clean build
テストに合格するために、欠落している実装を書き込みます。
次のように、プルリクエストを契約定義とリポジトリにマージします。
$ 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 にアップロードします。
リモート作業に切り替えます。
次のように、契約定義がローカルストレージからではなく リモートの場所から取得されるようにプラグインを設定します。
- 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 }
プロデューサーコードを新しい実装とマージします。
CI システム:
プロジェクトをビルドします。
テスト、スタブ、スタブ JAR を生成します。
アプリケーションとスタブを含むアーティファクトを Nexus または Artifactory にアップロードします。
次の UML 図は、プロデューサープロセスを示しています。