pact_broker-client 1.28.0 → 1.29.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e23b12ee8b9f8c67c792cd830bcd29b9c6d705606476ec473028175c2763486c
4
- data.tar.gz: b610a006305ecb79523fada0b3af80f745437d83cae4fe9691462f5f3da2647d
3
+ metadata.gz: 3a07f8cd0761d2826dd2b2c28b47bee6b3d792480fe97f49724280f451ea47bf
4
+ data.tar.gz: 3dd78bb84b1f392211d4762e89da7040ef56e13a990dc87c1866e7658778a8e6
5
5
  SHA512:
6
- metadata.gz: d2485fe9b05e4039826f722c692eb666b3631fa7d618558ef7abfbdb177e9dcaaf44bf62fd6935fe298ff25bf94282be9383ba81c20b1d0e856974db23bc2787
7
- data.tar.gz: abb37f8f92a773850122c0fac6b98ca72e154e6d9cf5a05bb6bfd985b5179196b44a71b800007b7dd032f14728c98cdf0ab12581c708f5a0baeefee7d7f9115e
6
+ metadata.gz: ea00e0e31727d6f826661ad2316762b94f4f8097f9829f44e2e85f6f7c62d0da5e9002101141dbbd6b5af009768c246ce4375053e2dfe9fce86f605a33e8ccbf
7
+ data.tar.gz: e6fe10b4acc7cf24f24fca2ccc8a3ee4709d1d421c466abba59a20c72c7672498f4bc893ccc2c229d70d5fdb0586d52edcfcdb8be651f4337fd7d1d10434eeaa
@@ -3,22 +3,56 @@ name: Release gem
3
3
  on:
4
4
  repository_dispatch:
5
5
  types:
6
- - release-patch
6
+ - release-triggered
7
7
 
8
8
  jobs:
9
- build:
9
+ test:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
+ - uses: actions/checkout@v2
13
+ - uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: '2.6'
16
+ - run: |
17
+ gem install bundler -v 2.1
18
+ bundle install
19
+ - name: Test
20
+ run: bundle exec rake
21
+
22
+ release:
23
+ needs: test
24
+ runs-on: ubuntu-latest
25
+ outputs:
26
+ gem_name: ${{ steps.release.outputs.gem_name }}
27
+ version: ${{ steps.release.outputs.version }}
28
+ increment: ${{ steps.release.outputs.increment }}
29
+ steps:
12
30
  - uses: actions/checkout@v2
13
31
  with:
14
32
  fetch-depth: 0
15
- - uses: pact-foundation/release-gem@v0.0.5
33
+ - uses: pact-foundation/release-gem@v0.0.11
34
+ id: release
16
35
  env:
17
36
  GEM_HOST_API_KEY: '${{ secrets.RUBYGEMS_API_KEY }}'
18
37
  GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'
19
- # - name: Trigger release of pact-cli Docker image
20
- # uses: peter-evans/repository-dispatch@v1
21
- # with:
22
- # token: ${{ secrets.GHTOKENFORPACTCLIRELEASE }}
23
- # repository: pact-foundation/pact-ruby-cli
24
- # event-type: gem-released
38
+ INCREMENT: '${{ github.event.client_payload.increment }}'
39
+
40
+ notify-gem-released:
41
+ needs: release
42
+ strategy:
43
+ matrix:
44
+ repository: [pact-foundation/pact-ruby-cli, pact-foundation/pact-ruby-standalone, pact-foundation/pact_broker-client]
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - name: Notify ${{ matrix.repository }} of gem release
48
+ uses: peter-evans/repository-dispatch@v1
49
+ with:
50
+ token: ${{ secrets.GHTOKENFORPACTCLIRELEASE }}
51
+ repository: ${{ matrix.repository }}
52
+ event-type: gem-released
53
+ client-payload: |
54
+ {
55
+ "name": "${{ needs.release.outputs.gem_name }}",
56
+ "version": "${{ needs.release.outputs.version }}",
57
+ "increment": "${{ needs.release.outputs.increment }}"
58
+ }
@@ -6,6 +6,9 @@ on:
6
6
  - master
7
7
  paths:
8
8
  - '**.md'
9
+ repository_dispatch:
10
+ types:
11
+ - gem-released
9
12
 
10
13
  jobs:
11
14
  build:
@@ -1,3 +1,31 @@
1
+ <a name="v1.29.0"></a>
2
+ ### v1.29.0 (2020-08-05)
3
+
4
+ #### Features
5
+
6
+ * print out helpful error message for 403 ([5d5a18a](/../../commit/5d5a18a))
7
+ * support publishing pacts for multiple consumers at the same time ([573e97c](/../../commit/573e97c))
8
+
9
+ <a name="v1.28.4"></a>
10
+ ### v1.28.4 (2020-07-31)
11
+
12
+ #### Bug Fixes
13
+
14
+ * add missing require for PactBroker::Client::Error ([72eb796](/../../commit/72eb796))
15
+
16
+ <a name="v1.28.3"></a>
17
+ ### v1.28.3 (2020-07-19)
18
+
19
+ <a name="v1.28.2"></a>
20
+ ### v1.28.2 (2020-07-17)
21
+
22
+
23
+ #### Bug Fixes
24
+
25
+ * **create-version-tag**
26
+ * raise an error if the version does not exist rather than automatically creating it. ([2ed7a55](/../../commit/2ed7a55))
27
+
28
+
1
29
  <a name="v1.28.0"></a>
2
30
  ### v1.28.0 (2020-07-12)
3
31
 
data/README.md CHANGED
@@ -42,13 +42,11 @@ Publish pacts to a Pact Broker.
42
42
  ### create-version-tag
43
43
 
44
44
  ```
45
- Usage:
46
- pact-broker create-version-tag -a, --pacticipant=PACTICIPANT -b, --broker-base-url=BROKER_BASE_URL -e, --version=VERSION
47
-
48
45
  Options:
49
46
  -a, --pacticipant=PACTICIPANT # The pacticipant name
50
47
  -e, --version=VERSION # The pacticipant version
51
48
  -t, [--tag=TAG] # Tag name for pacticipant version. Can be specified multiple times.
49
+ [--auto-create-version], [--no-auto-create-version] # Automatically create the pacticipant version if it does not exist. Default: false
52
50
  -g, [--tag-with-git-branch], [--no-tag-with-git-branch] # Tag pacticipant version with the name of the current git branch. Default: false
53
51
  -b, --broker-base-url=BROKER_BASE_URL # The base URL of the Pact Broker
54
52
  -u, [--broker-username=BROKER_USERNAME] # Pact Broker basic auth username
@@ -69,6 +69,12 @@ module PactBroker
69
69
  yield response
70
70
  elsif response.code == 404
71
71
  nil
72
+ elsif response.code == 403
73
+ message = "Authorization failed (insufficient permissions)"
74
+ if response.body && response.body.size > 0
75
+ message = message + ": #{response.body}"
76
+ end
77
+ raise Error.new(message)
72
78
  elsif response.code == 401
73
79
  message = "Authentication failed"
74
80
  if response.body && response.body.size > 0
@@ -8,6 +8,7 @@ module PactBroker
8
8
  class PactPublicationError < ::Thor::Error; end
9
9
  class WebhookCreationError < ::Thor::Error; end
10
10
  class AuthError < ::Thor::Error; end
11
+ class VersionCreationError < ::Thor::Error; end
11
12
 
12
13
  class Broker < CustomThor
13
14
  desc 'can-i-deploy', ''
@@ -52,6 +53,7 @@ module PactBroker
52
53
  method_option :verbose, aliases: "-v", type: :boolean, default: false, required: false, desc: "Verbose output. Default: false"
53
54
 
54
55
  def publish(*pact_files)
56
+ require 'pact_broker/client/error'
55
57
  validate_credentials
56
58
  validate_pact_files(pact_files)
57
59
  success = publish_pacts(pact_files)
@@ -64,6 +66,7 @@ module PactBroker
64
66
  method_option :pacticipant, required: true, aliases: "-a", desc: "The pacticipant name"
65
67
  method_option :version, required: true, aliases: "-e", desc: "The pacticipant version"
66
68
  method_option :tag, aliases: "-t", type: :array, banner: "TAG", desc: "Tag name for pacticipant version. Can be specified multiple times."
69
+ method_option :auto_create_version, type: :boolean, default: false, desc: "Automatically create the pacticipant version if it does not exist. Default: false"
67
70
  method_option :tag_with_git_branch, aliases: "-g", type: :boolean, default: false, required: false, desc: "Tag pacticipant version with the name of the current git branch. Default: false"
68
71
  method_option :broker_base_url, required: true, aliases: "-b", desc: "The base URL of the Pact Broker"
69
72
  method_option :broker_username, aliases: "-u", desc: "Pact Broker basic auth username"
@@ -80,7 +83,10 @@ module PactBroker
80
83
  options.pacticipant,
81
84
  options.version,
82
85
  tags,
86
+ options.auto_create_version,
83
87
  pact_broker_client_options)
88
+ rescue PactBroker::Client::Error => e
89
+ raise VersionCreationError.new(e.message)
84
90
  end
85
91
 
86
92
  method_option :pacticipant, required: true, aliases: "-a", desc: "The name of the pacticipant that the version belongs to."
@@ -6,30 +6,22 @@ module PactBroker
6
6
  module Client
7
7
  class CreateTag
8
8
 
9
- class Result
10
- attr_reader :success, :message
11
-
12
- def initialize success, message = nil
13
- @success = success
14
- @message = message
15
- end
16
- end
17
-
18
- def self.call(pact_broker_base_url, pacticipant_name, version, tags, pact_broker_client_options={})
19
- new(pact_broker_base_url, pacticipant_name, version, tags, pact_broker_client_options).call
9
+ def self.call(pact_broker_base_url, pacticipant_name, version, tags, auto_create_version, pact_broker_client_options={})
10
+ new(pact_broker_base_url, pacticipant_name, version, tags, auto_create_version, pact_broker_client_options).call
20
11
  end
21
12
 
22
- def initialize(pact_broker_base_url, pacticipant_name, version, tags, pact_broker_client_options)
13
+ def initialize(pact_broker_base_url, pacticipant_name, version, tags, auto_create_version, pact_broker_client_options)
23
14
  @pact_broker_base_url = pact_broker_base_url
24
15
  @pacticipant_name = pacticipant_name
25
16
  @version = version
26
17
  @tags = tags
18
+ @auto_create_version = auto_create_version
27
19
  @pact_broker_client_options = pact_broker_client_options
28
20
  end
29
21
 
30
22
  def call
23
+ ensure_version_exists if !auto_create_version
31
24
  tags.each do | tag |
32
- # todo check that pacticipant exists first
33
25
  $stdout.puts "Tagging #{pacticipant_name} version #{version} as #{tag}"
34
26
  Retry.while_error do
35
27
  pact_broker_client.pacticipants.versions.tag pacticipant: pacticipant_name, version: version, tag: tag
@@ -39,11 +31,17 @@ module PactBroker
39
31
 
40
32
  private
41
33
 
42
- attr_reader :pact_broker_base_url, :pacticipant_name, :version, :tags, :pact_broker_client_options
34
+ attr_reader :pact_broker_base_url, :pacticipant_name, :version, :tags, :auto_create_version, :pact_broker_client_options
43
35
 
44
36
  def pact_broker_client
45
37
  @pact_broker_client ||= PactBroker::Client::PactBrokerClient.new(base_url: pact_broker_base_url, client_options: pact_broker_client_options)
46
38
  end
39
+
40
+ def ensure_version_exists
41
+ if pact_broker_client.pacticipants.versions.find(pacticipant: pacticipant_name, version: version).nil?
42
+ raise PactBroker::Client::Error.new("Could not create tag. Version #{version} of #{pacticipant_name} does not exist.")
43
+ end
44
+ end
47
45
  end
48
46
  end
49
47
  end
@@ -11,7 +11,7 @@ APPVEYOR_REPO_COMMIT APPVEYOR_REPO_BRANCH https://www.appveyor.com/docs/en
11
11
  CI_COMMIT_REF_NAME https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
12
12
  CI_BRANCH CI_COMMIT_ID https://documentation.codeship.com/pro/builds-and-configuration/environment-variables/
13
13
  bamboo.repository.git.branch https://confluence.atlassian.com/bamboo/bamboo-variables-289277087.html
14
- BITBUCKET_BRANCH https://confluence.atlassian.com/bitbucket/variables-in-pipelines-794502608.html
14
+ BITBUCKET_BRANCH BITBUCKET_COMMIT https://confluence.atlassian.com/bitbucket/variables-in-pipelines-794502608.html
15
15
 
16
16
  =end
17
17
 
@@ -21,6 +21,11 @@ module PactBroker
21
21
  module Git
22
22
  COMMAND = 'git name-rev --name-only HEAD'.freeze
23
23
  BRANCH_ENV_VAR_NAMES = %w{BUILDKITE_BRANCH CIRCLE_BRANCH TRAVIS_BRANCH GIT_BRANCH GIT_LOCAL_BRANCH APPVEYOR_REPO_BRANCH CI_COMMIT_REF_NAME BITBUCKET_BRANCH}.freeze
24
+ COMMIT_ENV_VAR_NAMES = %w{BUILDKITE_COMMIT CIRCLE_SHA1 TRAVIS_COMMIT GIT_COMMIT APPVEYOR_REPO_COMMIT CI_COMMIT_ID BITBUCKET_COMMIT}
25
+
26
+ def self.commit
27
+ find_commit_from_env_vars
28
+ end
24
29
 
25
30
  def self.branch
26
31
  find_branch_from_env_vars || branch_from_git_command
@@ -28,11 +33,15 @@ module PactBroker
28
33
 
29
34
  # private
30
35
 
36
+ def self.find_commit_from_env_vars
37
+ COMMIT_ENV_VAR_NAMES.collect { |env_var_name| value_from_env_var(env_var_name) }.compact.first
38
+ end
39
+
31
40
  def self.find_branch_from_env_vars
32
- BRANCH_ENV_VAR_NAMES.collect { |env_var_name| branch_from_env_var(env_var_name) }.compact.first
41
+ BRANCH_ENV_VAR_NAMES.collect { |env_var_name| value_from_env_var(env_var_name) }.compact.first
33
42
  end
34
43
 
35
- def self.branch_from_env_var(env_var_name)
44
+ def self.value_from_env_var(env_var_name)
36
45
  val = ENV[env_var_name]
37
46
  if val && val.strip.size > 0
38
47
  val
@@ -52,6 +52,10 @@ module PactBroker
52
52
  @pact_files ||= pact_file_paths.collect{ |pact_file_path| PactFile.new(pact_file_path) }
53
53
  end
54
54
 
55
+ def consumer_names
56
+ pact_files.collect(&:consumer_name).uniq
57
+ end
58
+
55
59
  def publish_pact pact
56
60
  begin
57
61
  $stdout.puts "Publishing #{pact.pact_name} to pact broker at #{pact_broker_base_url}"
@@ -72,12 +76,14 @@ module PactBroker
72
76
  def tag_consumer_version tag
73
77
  versions = pact_broker_client.pacticipants.versions
74
78
  Retry.while_error do
75
- $stdout.puts "Tagging version #{consumer_version} of #{consumer_name} as #{tag.inspect}"
76
- versions.tag(pacticipant: consumer_name, version: consumer_version, tag: tag)
77
- true
79
+ consumer_names.collect do | consumer_name |
80
+ $stdout.puts "Tagging version #{consumer_version} of #{consumer_name} as #{tag.inspect}"
81
+ versions.tag(pacticipant: consumer_name, version: consumer_version, tag: tag)
82
+ true
83
+ end
78
84
  end
79
85
  rescue => e
80
- $stderr.puts "Failed to tag version #{consumer_version} of #{consumer_name} due to error: #{e.class} - #{e}}"
86
+ $stderr.puts "Failed to tag versions due to error: #{e.class} - #{e}"
81
87
  false
82
88
  end
83
89
 
@@ -94,10 +100,6 @@ module PactBroker
94
100
  end
95
101
  end
96
102
 
97
- def consumer_name
98
- pact_files.first.consumer_name
99
- end
100
-
101
103
  def validate
102
104
  raise PactBroker::Client::Error.new("Please specify the consumer_version") unless (consumer_version && consumer_version.to_s.strip.size > 0)
103
105
  raise PactBroker::Client::Error.new("Please specify the pact_broker_base_url") unless (pact_broker_base_url && pact_broker_base_url.to_s.strip.size > 0)
@@ -1,5 +1,5 @@
1
1
  module PactBroker
2
2
  module Client
3
- VERSION = '1.28.0'
3
+ VERSION = '1.29.0'
4
4
  end
5
5
  end
@@ -28,7 +28,7 @@ module PactBroker
28
28
 
29
29
  def call
30
30
  version_hash = if params[:version]
31
- versions_client.find params
31
+ versions_client.find(params)
32
32
  else
33
33
  pact_broker_client.pacticipants.versions.latest(params)
34
34
  end
@@ -1,14 +1,30 @@
1
- #!/bin/bash
1
+ #!/bin/sh
2
2
 
3
- output=$(curl -v -X POST https://api.github.com/repos/pact-foundation/pact_broker-client/dispatches \
3
+ # Script to trigger release of gem via the pact-foundation/release-gem action
4
+ # Requires a Github API token with repo scope stored in the
5
+ # environment variable GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES
6
+
7
+ : "${GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES:?Please set environment variable GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES}"
8
+
9
+ if [ -n "$1" ]; then
10
+ increment="\"${1}\""
11
+ else
12
+ increment="null"
13
+ fi
14
+
15
+ repository_slug=$(git remote get-url $(git remote show) | cut -d':' -f2 | sed 's/\.git//')
16
+
17
+ output=$(curl -v -X POST https://api.github.com/repos/${repository_slug}/dispatches \
4
18
  -H 'Accept: application/vnd.github.everest-preview+json' \
5
- -H "Authorization: Bearer $GITHUB_ACCESS_TOKEN" \
6
- -d '{"event_type": "release-patch"}' 2>&1)
19
+ -H "Authorization: Bearer $GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES" \
20
+ -d "{\"event_type\": \"release-triggered\", \"client_payload\": {\"increment\": ${increment}}}" 2>&1)
7
21
 
8
22
  if ! echo "${output}" | grep "HTTP\/1.1 204" > /dev/null; then
9
- echo "$output" | sed "s/${GITHUB_ACCESS_TOKEN}/****/g"
10
- echo "Failed to do the thing"
23
+ echo "$output" | sed "s/${GITHUB_ACCESS_TOKEN_FOR_PF_RELEASES}/********/g"
24
+ echo "Failed to trigger release"
11
25
  exit 1
26
+ else
27
+ echo "Release workflow triggered"
12
28
  fi
13
29
 
14
- echo "See https://github.com/pact-foundation/pact_broker-client/actions?query=workflow%3A%22Release+gem%22"
30
+ echo "See https://github.com/${repository_slug}/actions?query=workflow%3A%22Release+gem%22"
@@ -5,7 +5,7 @@ describe "pact-broker create-version-tag", skip_windows: true do
5
5
  end
6
6
 
7
7
  context "when the version is successfully tagged" do
8
- subject { `bundle exec bin/pact-broker create-version-tag --pacticipant Condor --version 1.3.0 --tag prod --broker-base-url http://localhost:5001` }
8
+ subject { `bundle exec bin/pact-broker create-version-tag --auto-create-version --pacticipant Condor --version 1.3.0 --tag prod --broker-base-url http://localhost:5001` }
9
9
 
10
10
  it "returns a success exit code" do
11
11
  subject
@@ -81,6 +81,25 @@ module PactBroker
81
81
  end
82
82
  end
83
83
 
84
+ context "when publishing multiple files with different consumers" do
85
+ let(:pact_file_paths) { ['spec/pacts/consumer-provider.json','spec/pacts/foo-bar.json']}
86
+ let(:tags) { ['dev'] }
87
+
88
+ it "tags each consumer" do
89
+ expect(pact_versions_client).to receive(:tag).with(
90
+ pacticipant: "Consumer",
91
+ version: consumer_version,
92
+ tag: "dev"
93
+ )
94
+ expect(pact_versions_client).to receive(:tag).with(
95
+ pacticipant: "Foo",
96
+ version: consumer_version,
97
+ tag: "dev"
98
+ )
99
+ subject.call
100
+ end
101
+ end
102
+
84
103
  context "when publishing one or more pacts fails" do
85
104
  let(:pact_file_paths) { ['spec/pacts/consumer-provider.json','spec/pacts/foo-bar.json']}
86
105
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.28.0
4
+ version: 1.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Beth Skurrie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-12 00:00:00.000000000 Z
11
+ date: 2020-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty