fa-harness-tools 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a3cee0250f6a943fb938d11c0e118f53d26ea03be5edb7e8f8fc7fb0f73e154e
4
- data.tar.gz: 030ab9dac48945eac8366a8cfcbafecc4bbbeebc5dc16254f97bfa3cfdb26368
3
+ metadata.gz: 43514c409f804648259a4b51366d9d4eec846c54badb0642a9fb3d916d13ad8d
4
+ data.tar.gz: 5c5e29f48aaf5e1f82a7cc608523086728e1085e89c9dde688c47db522b73b9f
5
5
  SHA512:
6
- metadata.gz: 3f00171760572605f0282595bc852bf20181768464dd9811051cb71a6658daa9692bdb77c46dbb180eca6c982b17736cf0f4c24e89cf6fba60fcddd379d81a08
7
- data.tar.gz: 863db5b6b4230a1d2fedd00ab20f05d830fb682bc9b4947f1e4bdd69429dfa90ba637fac2afabd6cd7c8c7b71271e6a53346593325e46a0c7c6377453c86e7bd
6
+ metadata.gz: 070f23a423e9e104c294eb3c6fd47fb0d45d5edc904be12cef90e1c83cd22e372b97e7544f9f3824006066e1c3a285274a3c10e0d6b7b0badf5360acaf2dcc86
7
+ data.tar.gz: 5cce7e38b1286181ae729433d5fdcd556dccb4c79500ee5b1c3cc471263ed767e714453ae10f910399954c4606c4ec1fbefbfec648e9f822a22ae151ba3b8ed8
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fa-harness-tools (1.0.4)
4
+ fa-harness-tools (1.0.5)
5
5
  octokit (~> 4.0)
6
6
  tzinfo (~> 2.0)
7
7
  tzinfo-data (~> 1.0)
@@ -11,15 +11,16 @@ GEM
11
11
  specs:
12
12
  addressable (2.7.0)
13
13
  public_suffix (>= 2.0.2, < 5.0)
14
- concurrent-ruby (1.1.5)
14
+ concurrent-ruby (1.1.6)
15
15
  diff-lcs (1.3)
16
- faraday (0.17.0)
16
+ faraday (1.0.1)
17
17
  multipart-post (>= 1.2, < 3)
18
18
  multipart-post (2.1.1)
19
- octokit (4.14.0)
19
+ octokit (4.18.0)
20
+ faraday (>= 0.9)
20
21
  sawyer (~> 0.8.0, >= 0.5.3)
21
- public_suffix (4.0.1)
22
- rake (10.5.0)
22
+ public_suffix (4.0.5)
23
+ rake (13.0.1)
23
24
  rspec (3.9.0)
24
25
  rspec-core (~> 3.9.0)
25
26
  rspec-expectations (~> 3.9.0)
@@ -37,9 +38,9 @@ GEM
37
38
  addressable (>= 2.3.5)
38
39
  faraday (> 0.8, < 2.0)
39
40
  timecop (0.9.1)
40
- tzinfo (2.0.0)
41
+ tzinfo (2.0.2)
41
42
  concurrent-ruby (~> 1.0)
42
- tzinfo-data (1.2019.3)
43
+ tzinfo-data (1.2020.1)
43
44
  tzinfo (>= 1.0.0)
44
45
 
45
46
  PLATFORMS
@@ -48,7 +49,7 @@ PLATFORMS
48
49
  DEPENDENCIES
49
50
  bundler (~> 1.0)
50
51
  fa-harness-tools!
51
- rake (~> 10.0)
52
+ rake (~> 13.0)
52
53
  rspec (~> 3.8)
53
54
  timecop (~> 0.9)
54
55
 
data/README.md CHANGED
@@ -22,6 +22,8 @@ Or install it yourself as:
22
22
 
23
23
  Examples below use [variables defined by Harness](https://docs.harness.io/article/9dvxcegm90-variables) so should be suitable to use directly in Harness scripts.
24
24
 
25
+ Full scripts that can be used in Harness are available in the [examples/](examples/) directory.
26
+
25
27
  ### Required environment variables
26
28
 
27
29
  * `GITHUB_OAUTH_TOKEN` must be exported, containing a valid [personal access token](https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line) for GitHub
@@ -0,0 +1,17 @@
1
+ # Create deployment Git tags
2
+
3
+ ## Purpose
4
+
5
+ Can be added to a Harness pipeline to add a Git tag on every deployment. The tags can then be used by the other pre-flight checks.
6
+
7
+ ## Requirements
8
+
9
+ 1. Add a GitHub OAuth token to the Harness secrets manager, named `github-oauth-token`
10
+ 2. Assumes the artifact build number is the commit ID
11
+ 3. fa-harness-tools is installed on the Harness delegates (`gem install -v $VERSION fa-harness-tools`)
12
+
13
+ ## Installation
14
+
15
+ Add the script to the Harness template library and then add to the last phase of the deployment workflow.
16
+
17
+ Define the `ONLY_ENVIRONMENT` variable input on the template, defaulting to `false`.
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+ #
3
+ # Creates a Git tag to mark successful deployment with fa-harness-tools
4
+ #
5
+ # Optionally set ONLY_ENVIRONMENT to only tag when running a deployment in
6
+ # that Harness environment.
7
+
8
+ set -e
9
+
10
+ export GITHUB_OAUTH_TOKEN="${secrets.getValue("github-oauth-token")}"
11
+
12
+ if [ -z "${ONLY_ENVIRONMENT}" -o "${ONLY_ENVIRONMENT}" = "${env.name}" ]; then
13
+ create-deployment-tag \
14
+ --build-no "${artifact.buildNo}" \
15
+ --environment "${env.name}" \
16
+ --repository "${artifact.source.repositoryName}" \
17
+ --tagger-email "noreply@example.com" \
18
+ --tagger-name "Harness"
19
+ fi
@@ -0,0 +1,20 @@
1
+ # Production pre-flight checks
2
+
3
+ ## Purpose
4
+
5
+ Can be added to a Harness pipeline to enforce a set of strict requirements for production deployments:
6
+
7
+ 1. Only deploy within the daily deployment window/schedule
8
+ 2. Only deploy builds from the master branch
9
+ 3. Automated (triggered) deployments may only deploy forwards
10
+ 4. Manual deployments may only deploy forwards or roll back three deployments
11
+
12
+ ## Requirements
13
+
14
+ 1. Add a GitHub OAuth token to the Harness secrets manager, named `github-oauth-token`
15
+ 2. Assumes the artifact build number is the commit ID
16
+ 3. fa-harness-tools is installed on the Harness delegates (`gem install -v $VERSION fa-harness-tools`)
17
+
18
+ ## Installation
19
+
20
+ Add the script to the Harness template library and then add to an early phase of the deployment workflow.
@@ -0,0 +1,33 @@
1
+ #!/bin/bash
2
+ #
3
+ # Runs production deployment checks from fa-harness-tools
4
+
5
+ set -e
6
+
7
+ export GITHUB_OAUTH_TOKEN="${secrets.getValue("github-oauth-token")}"
8
+
9
+ run() {
10
+ CMD=$1
11
+ shift
12
+ $CMD \
13
+ --build-no "${artifact.buildNo}" \
14
+ --environment "${env.name}" \
15
+ --repository "${artifact.source.repositoryName}" \
16
+ "$@"
17
+ }
18
+
19
+ # 1. Check we're within the daily deployment schedule
20
+ check-schedule
21
+
22
+ # 2. Check the commit is on the master branch
23
+ run check-branch-protection
24
+
25
+ if [[ "${deploymentTriggeredBy}" =~ "Deployment Trigger" ]]; then
26
+ # 3. For automated deployments (trigger from CI), check deployment is fast-forward
27
+ run check-forward-deploy
28
+ else
29
+ # 3. For user deployments, check deployment is fast-forward or within last three deployments for rollbacks
30
+ run check-recent-deploy --allowed-rollback-count 3
31
+ fi
32
+
33
+ exit 0
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_runtime_dependency "tzinfo-data", "~> 1.0"
32
32
 
33
33
  spec.add_development_dependency "bundler", "~> 1.0"
34
- spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "rake", "~> 13.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.8"
36
36
  spec.add_development_dependency "timecop", "~> 0.9"
37
37
  end
@@ -42,7 +42,7 @@ module FaHarnessTools
42
42
  return true, "first deploy"
43
43
  end
44
44
 
45
- latest_allowed_rev = latest_allowed_tag[:commit][:sha]
45
+ latest_allowed_rev = @client.get_commit_sha_from_tag(latest_allowed_tag)
46
46
  rev = @context.new_commit_sha
47
47
 
48
48
  if @client.is_ancestor_of?(latest_allowed_rev, rev)
@@ -17,17 +17,24 @@ module FaHarnessTools
17
17
 
18
18
  # Return all tags starting "harness-deploy-ENV-"
19
19
  #
20
- # Used to find deployments in an environment. The commit SHA of the tag is
21
- # in [:commit][:sha] in the returned hash.
20
+ # Used to find deployments in an environment. Provides only the tag name
21
+ # and object, though that may be an annotated tag or a commit.
22
+ #
23
+ # Use #get_commit_sha_from_tag to reliably find the commit that a tag
24
+ # points to.
22
25
  #
23
26
  # @return [Array[Hash]] Array of tag data hash, or [] if none
24
27
  def all_deploy_tags(prefix:, environment:)
25
- @octokit.auto_paginate = true
26
- @octokit.tags(owner_repo).find_all do |tag|
27
- tag[:name].start_with?("#{prefix}-#{environment}-")
28
+ # #refs is a much quicker way than #tags to pull back all tag names, so
29
+ # we prefer this and then fetch commit information only when we need it
30
+ @octokit.refs(owner_repo, "tags/#{prefix}-#{environment}-").map do |ref|
31
+ {
32
+ name: ref[:ref][10..-1], # remove refs/tags/ prefix
33
+ object: ref[:object],
34
+ }
28
35
  end
29
- ensure
30
- @octokit.auto_paginate = false
36
+ rescue Octokit::NotFound
37
+ []
31
38
  end
32
39
 
33
40
  # Return the last (when sorted) tag starting "harness-deploy-ENV-"
@@ -39,7 +46,11 @@ module FaHarnessTools
39
46
  def last_deploy_tag(prefix:, environment:)
40
47
  last_tag = all_deploy_tags(prefix: prefix, environment: environment).
41
48
  sort_by { |tag| tag[:name] }.last
42
- last_tag ? last_tag : nil
49
+ return nil unless last_tag
50
+
51
+ last_tag.merge(
52
+ commit: { sha: get_commit_sha_from_tag(last_tag) },
53
+ )
43
54
  end
44
55
 
45
56
  # Return a full commit SHA from a short SHA
@@ -52,6 +63,28 @@ module FaHarnessTools
52
63
  commit[:sha]
53
64
  end
54
65
 
66
+ # Return a full commit SHA from a tag
67
+ #
68
+ # The `tag` argument should be a Hash of tag data with an :object that can
69
+ # either be an annotated tag or a commit object.
70
+ #
71
+ # @return [String] Full commit SHA
72
+ # @raise [LookupError] If tag cannot be found
73
+ def get_commit_sha_from_tag(tag)
74
+ case tag[:object][:type]
75
+ when "commit"
76
+ tag[:object][:sha]
77
+ when "tag"
78
+ # When a tag points to a tag, recurse into it until we find a commit object
79
+ refed_tag = @octokit.tag(owner_repo, tag[:object][:sha])
80
+ get_commit_sha_from_tag(refed_tag.to_h.merge(tag.slice(:name)))
81
+ else
82
+ raise LookupError, "Tag #{tag[:name]} points to a non-commit object (#{tag[:object].inspect})"
83
+ end
84
+ rescue Octokit::NotFound
85
+ raise LookupError, "Unable to find tag #{tag.inspect} in Git repo"
86
+ end
87
+
55
88
  # Checks if <ancestor> is an ancestor of <commit>
56
89
  #
57
90
  # i.e. commit and ancestor are directly related
@@ -1,3 +1,3 @@
1
1
  module FaHarnessTools
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fa-harness-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - FreeAgent
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-26 00:00:00.000000000 Z
11
+ date: 2020-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: octokit
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '10.0'
75
+ version: '13.0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '10.0'
82
+ version: '13.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -133,6 +133,10 @@ files:
133
133
  - Rakefile
134
134
  - bin/console
135
135
  - bin/setup
136
+ - examples/create-deployment-tag/README.md
137
+ - examples/create-deployment-tag/create-deployment-tag.sh
138
+ - examples/production-preflight-checks/README.md
139
+ - examples/production-preflight-checks/production-preflight-checks.sh
136
140
  - exe/check-branch-protection
137
141
  - exe/check-forward-deploy
138
142
  - exe/check-recent-deploy