pact_verifier_cli 不尊重消费者版本选择器

pact_verifier_cli not honoring consumer-version-selectors

$ pact_verifier_cli -v

pact_verifier_cli 0.8.6
pact verifier version     : v0.8.6
pact specification version: v3.0.0

当我运行执行以下命令时,我得到了一个验证协议。

pact_verifier_cli --broker-url <> --provider-name <> --hostname <> --scheme "https" --request-timeout 60000 --consumer-version-selectors "{\"tag\": \"all\",\"latest\": false}"

当我 运行 以下命令时,我得到 5 个验证协议。

curl -s -X POST -H "Content-Type: application/json" -d @pact_consumer_version_selectors.json "<>/pacts/provider/<>/for-verification")

我没有正确格式化参数吗?或者这是一个已知问题?或者我是否缺少对这两个端点之间逻辑的理解?

-- 编辑 -- 我也尝试过传递垃圾作为标志的值,它仍然 returns 相同的验证协议。我倾向于忽略此输入,因为我什至不能让它失败。

如果您传递以下标志,您将获得一些额外的输出,这些输出将显示发送给 Pact 代理的内容以及可能的响应:--loglevel trace:

23:26:09 [DEBUG] (1) pact_verifier::pact_broker: Link URL is templated
23:26:09 [DEBUG] (1) pact_verifier::pact_broker: templated URL = https://testdemo.pactflow.io/pacts/provider/{provider}/for-verification
23:26:09 [DEBUG] (1) pact_verifier::pact_broker: Looking up value for key 'provider'
23:26:09 [DEBUG] (1) pact_verifier::pact_broker: final URL = https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification
23:26:09 [INFO] Fetching path '/pacts/provider/pactflow-example-provider/for-verification' from pact broker
...
23:26:09 [DEBUG] (1) reqwest::async_impl::client: response '200 OK' for https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification
23:26:09 [TRACE] (1) pact_verifier::pact_broker: [pact_verifier/src/pact_broker.rs:481] with_retries: attempt 2/3 is Ok(Response { url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("testdemo.pactflow.io")), port: None, path: "/pacts/provider/pactflow-example-provider/for-verification", query: None, fragment: None }, status: 200, headers: {"date": "Sun, 15 Aug 2021 23:26:09 GMT", "content-type": "application/hal+json;charset=utf-8", "content-length": "1337", "vary": "Accept", "server": "Webmachine-Ruby/1.6.0 Rack/1.3", "x-pact-broker-version": "2.81.0", "x-pact-broker-git-sha": "05d0c34e", "x-pactflow-git-sha": "569de2cc7", "x-content-type-options": "nosniff", "strict-transport-security": "max-age=63072000; includeSubDomains; preload", "x-request-id": "5fa14caaeab2e9b6f724309a9442b48e"} })
23:26:09 [DEBUG] (1) pact_verifier::pact_broker: templated URL = https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification
23:26:09 [DEBUG] (1) pact_verifier::pact_broker: final URL = https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification
23:26:09 [DEBUG] (1) pact_verifier::pact_broker: Sending JSON to https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification using POST: {"providerVersionTags":[],"includePendingStatus":false,"consumerVersionSelectors":[{"tag":"master"}]}
...
23:26:10 [DEBUG] (1) reqwest::async_impl::client: response '200 OK' for https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification
23:26:10 [TRACE] (1) pact_verifier::pact_broker: [pact_verifier/src/pact_broker.rs:481] with_retries: attempt 2/3 is Ok(Response { url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("testdemo.pactflow.io")), port: None, path: "/pacts/provider/pactflow-example-provider/for-verification", query: None, fragment: None }, status: 200, headers: {"date": "Sun, 15 Aug 2021 23:26:10 GMT", "content-type": "application/hal+json;charset=utf-8", "content-length": "1441", "vary": "Accept", "server": "Webmachine-Ruby/1.6.0 Rack/1.3", "x-pact-broker-version": "2.81.0", "x-pact-broker-git-sha": "05d0c34e", "x-pactflow-git-sha": "569de2cc7", "x-content-type-options": "nosniff", "strict-transport-security": "max-age=63072000; includeSubDomains; preload", "x-request-id": "ecf83aa32df81b160ebd90d602c6c275"} })
23:26:10 [DEBUG] (1) pact_verifier::pact_broker: response from pacts for verification Object({"_embedded": Object({"pacts": Array([Object({"_links": Object({"self": Object({"href": String("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/metadata/c1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NDU2JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDQ1OSZzW11bdF09bWFzdGVyJnNbXVtjdl09MjQ1ODUmc1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NTg3JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDU5Mg"), "name": String("Pact between pactflow-example-consumer (9eaca30+1628208719) and pactflow-example-provider")})}), "shortDescription": String("one of master, one of master, one of master, one of master, one of master"), "verificationProperties": Object({"notices": Array([Object({"text": String("The pact at https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489 is being verified because the pact content belongs to the consumer versions matching the following criteria:\n    * all consumer versions tagged 'master' (9eaca30+1627468723)\n    * all consumer versions tagged 'master' (9eaca30+1627468853)\n    * all consumer versions tagged 'master' (9eaca30+1628207964)\n    * all consumer versions tagged 'master' (9eaca30+1628207994)\n    * all consumer versions tagged 'master' (9eaca30+1628208719)"), "when": String("before_verification")})])})})])}), "_links": Object({"self": Object({"href": String("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/for-verification"), "title": String("Pacts to be verified")})})})
23:26:10 [INFO] Fetching path '/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/metadata/c1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NDU2JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDQ1OSZzW11bdF09bWFzdGVyJnNbXVtjdl09MjQ1ODUmc1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NTg3JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDU5Mg' from pact broker
...
23:26:10 [DEBUG] (1) reqwest::async_impl::client: response '200 OK' for https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/metadata/c1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NDU2JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDQ1OSZzW11bdF09bWFzdGVyJnNbXVtjdl09MjQ1ODUmc1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NTg3JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDU5Mg
23:26:10 [TRACE] (1) pact_verifier::pact_broker: [pact_verifier/src/pact_broker.rs:481] with_retries: attempt 2/3 is Ok(Response { url: Url { scheme: "https", cannot_be_a_base: false, username: "", password: None, host: Some(Domain("testdemo.pactflow.io")), port: None, path: "/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/metadata/c1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NDU2JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDQ1OSZzW11bdF09bWFzdGVyJnNbXVtjdl09MjQ1ODUmc1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NTg3JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDU5Mg", query: None, fragment: None }, status: 200, headers: {"date": "Sun, 15 Aug 2021 23:26:10 GMT", "content-type": "application/hal+json;charset=utf-8", "content-length": "6486", "vary": "Accept", "server": "Webmachine-Ruby/1.6.0 Rack/1.3", "x-pact-broker-version": "2.81.0", "x-pact-broker-git-sha": "05d0c34e", "x-pactflow-git-sha": "569de2cc7", "x-content-type-options": "nosniff", "strict-transport-security": "max-age=63072000; includeSubDomains; preload", "x-request-id": "a93dbefb19056cb24e9114c8951f7138"} })
23:26:10 [DEBUG] (1) pact_verifier: Got pact with links [Link { name: "curies", href: None, templated: false, title: None }, Link { name: "pb:all-pact-versions", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/versions"), templated: false, title: Some("All versions of this pact") }, Link { name: "pb:consumer", href: Some("https://testdemo.pactflow.io/pacticipants/pactflow-example-consumer"), templated: false, title: Some("Consumer") }, Link { name: "pb:consumer-version", href: Some("https://testdemo.pactflow.io/pacticipants/pactflow-example-consumer/versions/9eaca30%2B1628208719"), templated: false, title: Some("Consumer version") }, Link { name: "pb:consumer-webhooks", href: Some("https://testdemo.pactflow.io/webhooks/consumer/pactflow-example-provider"), templated: false, title: Some("Webhooks for all pacts with provider pactflow-example-provider") }, Link { name: "pb:diff", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/diff/pact-version/{pactVersion}"), templated: true, title: Some("Diff with another specified version of this pact") }, Link { name: "pb:diff-previous-distinct", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/version/9eaca30%2B1628208719/diff/previous-distinct"), templated: false, title: Some("Diff with previous distinct version of this pact") }, Link { name: "pb:latest-pact-version", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/latest"), templated: false, title: Some("Latest version of this pact") }, Link { name: "pb:latest-tagged-pact-version", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/latest/{tag}"), templated: true, title: Some("Latest tagged version of this pact") }, Link { name: "pb:latest-untagged-pact-version", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/latest-untagged"), templated: false, title: Some("Latest untagged version of this pact") }, Link { name: "pb:latest-verification-results", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/verification-results/latest"), templated: false, title: None }, Link { name: "pb:matrix-for-consumer-version", href: Some("https://testdemo.pactflow.io/matrix?q[][pacticipant]=pactflow-example-consumer&q[][version]=9eaca30%2B1628208719&latestby=cvpv"), templated: false, title: Some("View matrix rows for the consumer version to which this pact belongs") }, Link { name: "pb:pact-version", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489"), templated: false, title: Some("Pact content version permalink") }, Link { name: "pb:pact-webhooks", href: Some("https://testdemo.pactflow.io/webhooks/provider/pactflow-example-provider/consumer/pactflow-example-consumer"), templated: false, title: Some("Webhooks for the pact between pactflow-example-consumer and pactflow-example-provider") }, Link { name: "pb:previous-distinct", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/version/9eaca30%2B1628208719/previous-distinct"), templated: false, title: Some("Previous distinct version of this pact") }, Link { name: "pb:provider", href: Some("https://testdemo.pactflow.io/pacticipants/pactflow-example-provider"), templated: false, title: Some("Provider") }, Link { name: "pb:publish-verification-results", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489/metadata/c1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NDU2JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDQ1OSZzW11bdF09bWFzdGVyJnNbXVtjdl09MjQ1ODUmc1tdW3RdPW1hc3RlciZzW11bY3ZdPTI0NTg3JnNbXVt0XT1tYXN0ZXImc1tdW2N2XT0yNDU5Mg/verification-results"), templated: false, title: Some("Publish verification results") }, Link { name: "pb:tag-prod-version", href: Some("https://testdemo.pactflow.io/pacticipants/pactflow-example-consumer/versions/9eaca30%2B1628208719/tags/prod"), templated: false, title: Some("PUT to this resource to tag this consumer version as 'production'") }, Link { name: "pb:tag-version", href: Some("https://testdemo.pactflow.io/pacticipants/pactflow-example-consumer/versions/9eaca30%2B1628208719/tags/{tag}"), templated: false, title: Some("PUT to this resource to tag this consumer version") }, Link { name: "pb:triggered-webhooks", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/version/9eaca30%2B1628208719/triggered-webhooks"), templated: false, title: Some("Webhooks triggered by the publication of this pact") }, Link { name: "self", href: Some("https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/version/9eaca30%2B1628208719"), templated: false, title: Some("Pact") }]
...
The pact at https://testdemo.pactflow.io/pacts/provider/pactflow-example-provider/consumer/pactflow-example-consumer/pact-version/4a6c2017e4f913c5b18ee0b526eae842567bf489 is being verified because the pact content belongs to the consumer versions matching the following criteria:
    * all consumer versions tagged 'master' (9eaca30+1627468723)
    * all consumer versions tagged 'master' (9eaca30+1627468853)
    * all consumer versions tagged 'master' (9eaca30+1628207964)
    * all consumer versions tagged 'master' (9eaca30+1628207994)
    * all consumer versions tagged 'master' (9eaca30+1628208719)
Verifying a pact between pactflow-example-consumer and pactflow-example-provider

我觉得这个请求格式正确。

标签 all 有点奇怪,通常这代表一个环境或一个功能分支(参见此处的黄金法则:https://docs.pact.io/pact_broker/tags/

您 运行 的 Pact 代理版本也很重要,但鉴于您有来自手动 curl 的响应,这似乎不是问题。

如果确实存在差异,能否请您在这里提出问题https://github.com/pact-foundation/pact-reference/

看起来像是 0.8.6 中的错误,其中为了发送 json 需要某种身份验证。
添加虚拟 --token 1234 可缓​​解此问题!