kite 1.0.2 → 1.0.4

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: ce668dcff72a31fec89244639d06f41cb92d6210d904077982282f10a6d39f67
4
- data.tar.gz: cfca7d98a7654c1c6fb3697b34621994de3832c9fe091c679c9fb7a6bd933f92
3
+ metadata.gz: 7c516eab6deb826e2384b1002dc82846361159e87682d83f34cff582f32968e6
4
+ data.tar.gz: d69f8de21c4b59897277b3663467cb044119504528832b6d4a7e85157974bc08
5
5
  SHA512:
6
- metadata.gz: d16e609a4ef22244c79a23fed8852e631e8ccd0cc4dfadaefe4aec6cd3ed82932c0369f02798ab79e1d366629d0625dd344eac606fa65793eeb28dbd37af2d84
7
- data.tar.gz: d3af22b47cbb0761285ed6c3df2a0cc9ba75032239f3ee88436fd0805fcd5c5eafc9ba2d8f3bf9800b696fd6fde5765c2f2efe4958ac22c1c01154a363b0cb99
6
+ metadata.gz: e3e3ae732aa5096870ab5ebfb3c42c868a0f0ef98a677ce743cd6d5e74eaa775af27173ca9fea21786de05854d3c3328a2ec2b63f07aef53513045b9776ae735
7
+ data.tar.gz: dd16d0d5991befdbe1659af7677879cbcb075ce3a5e913c8df9024661ddeb5a049a3db61d47e7b7edcea8e62207f2808cecc860b52d481685784f2656636729c
@@ -0,0 +1 @@
1
+ 2.5.0
@@ -1,7 +1,16 @@
1
- sudo: false
1
+ dist: trusty
2
+
3
+ sudo: required
4
+
2
5
  language: ruby
3
- rvm:
4
- - 2.4.0
6
+
7
+ cache: bundler
8
+
9
+
5
10
  before_install: gem install bundler -v 1.14.6
11
+
6
12
  env:
7
13
  COVERAGE: true
14
+
15
+ # Execute all of the commands which need to be executed after the build passed.
16
+ after_success: ruby ci/bump.rb
data/README.md CHANGED
@@ -1,12 +1,13 @@
1
1
  # Kite
2
2
 
3
- ![Build Status](https://ci.helioscloud.com/api/v1/teams/heliostech/pipelines/kite/jobs/build-master/badge)
4
- [![Build Status](https://travis-ci.org/helios-technologies/kite.svg?branch=master)](https://travis-ci.org/helios-technologies/kite)
5
- [![codecov](https://codecov.io/gh/helios-technologies/kite/branch/master/graph/badge.svg)](https://codecov.io/gh/helios-technologies/kite)
3
+ [![Gem Version](https://badge.fury.io/rb/kite.svg)](https://badge.fury.io/rb/kite)
4
+ [![license](https://img.shields.io/github/license/rubykube/kite.svg)](https://github.com/rubykube/kite/blob/master/LICENSE.md)
6
5
 
6
+ [![Build Status](https://travis-ci.org/rubykube/kite.svg?branch=master)](https://travis-ci.org/rubykube/kite)
7
+ [![codecov](https://codecov.io/gh/rubykube/kite/branch/master/graph/badge.svg)](https://codecov.io/gh/rubykube/kite)
7
8
 
8
9
  Kite is a CLI for scaffolding and managing devops modules
9
- The main purpose is templating of various tools for devops around terraform, bosh, ansible
10
+ The main purpose is templating of various tools for devops around terraform, bosh, ansible.
10
11
  Currently Kite supports modular stacks(Kite modules) on both AWS and GCP.
11
12
 
12
13
  We plan in adding community stack using a simple template repository structure.
@@ -31,7 +32,7 @@ Or install it yourself as:
31
32
 
32
33
  To start using kite for bootstraping your infrastructure
33
34
  follow the steps below.
34
- [Note] Most kite commands can be referred by their first letter(for example kite generate environment test == kite g e test)
35
+ [Note] Most kite commands can be referred by their first letter(for example `kite generate environment test` is the same as `kite g e test`)
35
36
 
36
37
  ### Create your Infrastructure as Code base repository
37
38
 
@@ -57,10 +58,11 @@ Now the environment should be generated at `config/environments/*env_name*`
57
58
 
58
59
  ### Add a module to your environment
59
60
 
60
- To add a Kite module to your environment, you should first initialize it:
61
+ To add a Kite module to your environment, you should first initialize it.
62
+ It's recommended to use specific module versions/tags(master branch would be used by default):
61
63
 
62
64
  ```
63
- kite module init https://url.for/your/module --env *env_name*
65
+ kite module init https://url.for/your/module --env *env_name* --version *x.y.z/x-y-stable*
64
66
  ```
65
67
 
66
68
  This should clone module's source files into `modules/*module_name*` and create a `vars.*module_name*.yml` file with all variables needed by the module.
@@ -80,6 +82,7 @@ Set your default gcloud credentials using
80
82
  ```
81
83
 
82
84
  ```
85
+ kite terraform init
83
86
  kite terraform apply --env *env_name*
84
87
  ```
85
88
 
@@ -107,4 +110,4 @@ $ ruby -Ilib ./bin/concourse/in
107
110
 
108
111
  ## Contributing
109
112
 
110
- Bug reports and pull requests are welcome on GitHub at https://github.com/helios-technologies/kite.
113
+ Bug reports and pull requests are welcome on GitHub at https://github.com/rubykube/kite.
@@ -0,0 +1,207 @@
1
+ require "rubygems/version"
2
+ require "net/http"
3
+ require "json"
4
+ require "uri"
5
+
6
+ #
7
+ # Returns bot's username in GitHub.
8
+ #
9
+ # @return [String]
10
+ def bot_username
11
+ ENV.fetch("BOT_USERNAME", "kite-bot")
12
+ end
13
+
14
+ #
15
+ # Returns bot's displayed name in commits.
16
+ #
17
+ # @return [String]
18
+ def bot_name
19
+ ENV.fetch("BOT_NAME", "Kite Bot")
20
+ end
21
+
22
+ #
23
+ # Returns bot's displayed email in commits.
24
+ #
25
+ # @return [String]
26
+ def bot_email
27
+ ENV.fetch("BOT_EMAIL", "kite-bot@heliostech.fr")
28
+ end
29
+
30
+ #
31
+ # Returns GitHub repository slug in form of :user|:organization/:repository.
32
+ #
33
+ # @return [String]
34
+ def repository_slug
35
+ ENV.fetch("REPOSITORY_SLUG", "rubykube/kite")
36
+ end
37
+
38
+ #
39
+ # Increments the newest available version which is in stage of development (master),
40
+ # and publishes it on the GitHub.
41
+ #
42
+ # The requirements for this to work are:
43
+ # 1) Repository has some tagged versions.
44
+ # 2) The latest version is not released yet (e.g. there is no version-specific branch like "1-3-stable").
45
+ #
46
+ # If you are on 1.1 and you want to start developing 1.2 do the following:
47
+ # 1) Create branch "1-1-stable", and push up-to-date source to it.
48
+ # 2) Push the same to master branch.
49
+ # 3) Push new commit(s) to master, and tag master as 1.2.0.
50
+ # 4) Future pushes to master will be treated as new patch version number.
51
+ #
52
+ def bump_from_master_branch
53
+ # Get latest version of Kite.
54
+ return unless (latest_version = versions.last)
55
+
56
+ # Find a branch which is specific the version.
57
+ # Comparision is based only on major and minor version numbers since
58
+ # these type of branches are named with a convention like: "1-0-stable", "2-4-stable", and so on.
59
+ linked_branch = version_specific_branches.find { |b| b[:version].segments == latest_version.segments[0...2] }
60
+ # If branch exists it means that version has been already released.
61
+ return if linked_branch
62
+
63
+ # Increment patch version number, tag, and push.
64
+ candidate_version = Gem::Version.new(latest_version.segments.dup.tap { |s| s[2] += 1 }.join("."))
65
+ tag_n_push(candidate_version.to_s, name: 'master') unless versions.include?(candidate_version)
66
+ end
67
+
68
+ #
69
+ # Increments the version which is in stage of support (version-specific branches only),
70
+ # and publishes it on the GitHub.
71
+ #
72
+ # The method expects branch name in form of "X-Y-stable", like "2-0-stable".
73
+ # It tags the current Git commit to the next patch number version, and pushes it to Git repository.
74
+ #
75
+ # @param name [String]
76
+ # Branch name.
77
+
78
+ def bump_from_version_specific_branch(name)
79
+ # This helps to ensure branch does exist.
80
+ branch = version_specific_branches.find { |b| b[:name] == name }
81
+ return unless branch
82
+
83
+ # Find latest version for the branch (compare by major and minor).
84
+ # We use find here since versions are sorted in descending order.
85
+ latest_version = versions.reverse.find { |v| v.segments[0...2] == branch[:version].segments }
86
+ return unless latest_version
87
+
88
+ # Increment patch version number, tag, and push.
89
+ candidate_version = Gem::Version.new(latest_version.segments.dup.tap { |s| s[2] += 1 }.join("."))
90
+ tag_n_push(candidate_version.to_s, branch) unless versions.include?(candidate_version)
91
+ end
92
+
93
+ #
94
+ # Configures Git user name & email,
95
+ # updates version at lib/kite/version.rb,
96
+ # creates Git tag, and pushes all the changes made to repository.
97
+ #
98
+ # @param tag [String]
99
+ def tag_n_push(tag, branch)
100
+ File.open "lib/kite/version.rb", "w" do |f|
101
+ f.write <<-RUBY
102
+ module Kite
103
+ VERSION = '#{tag}'
104
+ end
105
+ RUBY
106
+ end
107
+
108
+ [
109
+ %( git config --global user.email "#{bot_email}" ),
110
+ %( git config --global user.name "#{bot_name}" ),
111
+ %( git remote add authenticated-origin https://#{bot_username}:#{ENV.fetch("GITHUB_API_KEY")}@github.com/#{repository_slug} ),
112
+ %( git checkout -b release ),
113
+ %( git add lib/kite/version.rb ),
114
+ %( git commit -m "[ci skip] Bump #{tag}." ),
115
+ %( git push authenticated-origin release:#{branch.fetch(:name)} ),
116
+ %( git tag v#{tag} -a -m "Automatically generated tag from TravisCI build #{ENV.fetch("TRAVIS_BUILD_NUMBER")}." ),
117
+ %( git push authenticated-origin v#{tag} )
118
+ ].each do |command|
119
+ command.strip!
120
+ unless Kernel.system(command)
121
+ # Prevent GitHub API key from being published.
122
+ command.gsub!(ENV["GITHUB_API_KEY"], "(secret)")
123
+ raise %(Command "#{command}" exited with status #{$?.exitstatus || "(unavailable)"}.)
124
+ end
125
+ end
126
+ end
127
+
128
+ #
129
+ # Loads all Kite tags, and returns them in ascending order.
130
+ #
131
+ # @return [Array<Gem::Version>]
132
+ def versions
133
+ @versions ||= github_api_authenticated_get("/repos/#{repository_slug}/tags").map do |x|
134
+ Gem::Version.new(x.fetch("name")[/\d+\.\d+\.\d+/])
135
+ end.sort
136
+ end
137
+
138
+ #
139
+ # Returns hash with all tagged commits as keys (SHA-1) and versions as values.
140
+ #
141
+ # @return [Hash]
142
+ # Key is commit's SHA-1 hash, value is instance of Gem::Version.
143
+ def tagged_commits_mapping
144
+ @commits ||= github_api_authenticated_get("/repos/#{repository_slug}/tags").each_with_object({}) do |x, memo|
145
+ memo[x.fetch("commit").fetch("sha")] = Gem::Version.new(x.fetch("name")[/\d+\.\d+\.\d+/])
146
+ end
147
+ end
148
+
149
+ #
150
+ # Loads all Kite branches, selects only version-specific, and returns them.
151
+ #
152
+ # @return [Array<Hash>]
153
+ # Array of hashes each containing "name" & "version" keys.
154
+ def version_specific_branches
155
+ @branches ||= github_api_authenticated_get("/repos/#{repository_slug}/branches").map do |x|
156
+ if x.fetch("name") =~ /\A(\d)-(\d)-\w+\z/
157
+ { name: x["name"], version: Gem::Version.new($1 + "." + $2) }
158
+ end
159
+ end.compact
160
+ end
161
+
162
+ #
163
+ # Performs call to GitHub API and returns the response. Raises in case of non-200 status.
164
+ #
165
+ # @param path [String]
166
+ # Request path.
167
+ # @return [Hash]
168
+ def github_api_authenticated_get(path)
169
+ http = Net::HTTP.new("api.github.com", 443)
170
+ http.use_ssl = true
171
+ response = http.get path, "Authorization" => %[token #{ENV.fetch("GITHUB_API_KEY")}]
172
+ if response.code.to_i == 200
173
+ JSON.load(response.body)
174
+ else
175
+ raise StandardError, %[HTTP #{response.code}: "#{response.body}".]
176
+ end
177
+ end
178
+
179
+ #
180
+ # Returns true if version has exactly 3 version segments (major, minor, patch), and all are integers.
181
+ #
182
+ # @param version [Gem::Version]
183
+ # @return [true, false]
184
+ def generic_semver?(version)
185
+ version.segments.count == 3 && version.segments.all? { |segment| segment.match?(/\A[0-9]+\z/) }
186
+ end
187
+
188
+ # Build must not run on a fork.
189
+ bump = ENV["TRAVIS_REPO_SLUG"] == repository_slug
190
+ # Skip PRs.
191
+ bump &&= ENV["TRAVIS_PULL_REQUEST"] == "false"
192
+ # Build must run on branch.
193
+ bump &&= !ENV["TRAVIS_BRANCH"].to_s.empty?
194
+ # GitHub API key must be available.
195
+ bump &&= !ENV["GITHUB_API_KEY"].to_s.empty?
196
+ # Build must not run on tag.
197
+ bump &&= ENV["TRAVIS_TAG"].to_s.empty?
198
+ # Ensure this commit is not tagged.
199
+ bump &&= !tagged_commits_mapping.key?(ENV["TRAVIS_COMMIT"])
200
+
201
+ if bump
202
+ if ENV["TRAVIS_BRANCH"] == "master"
203
+ bump_from_master_branch
204
+ else
205
+ bump_from_version_specific_branch(ENV["TRAVIS_BRANCH"])
206
+ end
207
+ end
@@ -23,9 +23,9 @@ Gem::Specification.new do |spec|
23
23
  spec.add_dependency "thor"
24
24
  spec.add_dependency "git"
25
25
 
26
- spec.add_development_dependency "bundler", "~> 1.14"
26
+ spec.add_development_dependency "bundler", "~> 1.16"
27
27
  spec.add_development_dependency "rake", "~> 10.0"
28
- spec.add_development_dependency "rspec", "~> 3.0"
28
+ spec.add_development_dependency "rspec", "~> 3.7"
29
29
  spec.add_development_dependency "git"
30
30
  spec.add_development_dependency "simplecov"
31
31
  spec.add_development_dependency "codecov"
@@ -2,19 +2,25 @@ module Kite
2
2
  class Module < Base
3
3
  include Kite::Helpers
4
4
 
5
- method_option :env, type: :string, desc: "Environment", required: true, default: ENV['KITE_ENV']
5
+ method_option :env, type: :string, desc: "Environment", required: true, default: ENV['KITE_ENV']
6
+ method_option :version, type: :string, desc: "Version", required: false
6
7
  desc 'init https://github.com/foo/bar-module', 'Initialize a kite module and render its vars.module.yml'
7
8
  def init(path)
8
- @env = options[:env]
9
- @path = path
10
- @name = path.gsub(/(.*:|.git)/, '').split('/').last
9
+ @env = options[:env]
10
+ @path = path
11
+ @name = path.gsub(/(.*:|.git)/, '').split('/').last
12
+ @cloud = parse_cloud_config[@env]
13
+ @version = options[:version]
11
14
 
12
15
  unless File.exist? path
13
16
  @uri = path
14
17
  @path = "modules/#{@name}"
15
18
 
16
- say "Cloning the module"
17
19
  clone_module
20
+ unless @version.nil?
21
+ checkout_version
22
+ end
23
+
18
24
  say "Use git submodule add #{@path} to be able to commit this module as a submodule", :yellow
19
25
  end
20
26
 
@@ -42,6 +48,8 @@ module Kite
42
48
  end
43
49
 
44
50
  def clone_module
51
+ say "Cloning the module"
52
+
45
53
  if File.exist? @path
46
54
  overwrite = ask "#{@path} already contains a module! Overwrite? (y/N)"
47
55
 
@@ -50,13 +58,26 @@ module Kite
50
58
  Git.clone(@uri, @path)
51
59
  say "Successfully cloned the fresh #{@name}!", :green
52
60
  else
53
- say "Keeping the current module version"
61
+ say "Keeping the current module revision"
54
62
  end
55
63
  else
56
64
  Git.clone(@uri, @path)
57
65
  end
58
66
  end
59
67
 
68
+ def checkout_version
69
+ module_git = Git.open(@path)
70
+
71
+ say "Switching to #{@version}"
72
+ if @version =~ /\d+\.\d+\.\d+/ && module_git.tags.any? { |t| t.name == @version }
73
+ module_git.checkout("tags/#{@version}")
74
+ elsif module_git.is_remote_branch? @version
75
+ module_git.checkout("origin/#{@version}")
76
+ else
77
+ say "#{@version} tag/branch was not found in the module, keeping the current one", :red
78
+ end
79
+ end
80
+
60
81
  def render_vars
61
82
  create_file "config/environments/#{@env}/vars.#{@name}.yml", YAML.dump(manifest['variables'])
62
83
  end
@@ -71,7 +92,7 @@ module Kite
71
92
  end
72
93
 
73
94
  def manifest
74
- YAML.load(File.open("#{@path}/manifest.yml"))
95
+ YAML.load(ERB.new(File.read("#{@path}/manifest.yml.tt")).result(binding))
75
96
  end
76
97
  end
77
98
 
@@ -1,3 +1,3 @@
1
1
  module Kite
2
- VERSION = "1.0.2"
2
+ VERSION = '1.0.4'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Louis Bellet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-07 00:00:00.000000000 Z
11
+ date: 2018-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.14'
47
+ version: '1.16'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.14'
54
+ version: '1.16'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.0'
75
+ version: '3.7'
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: '3.0'
82
+ version: '3.7'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: git
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -132,6 +132,7 @@ extra_rdoc_files: []
132
132
  files:
133
133
  - ".gitignore"
134
134
  - ".rspec"
135
+ - ".ruby-version"
135
136
  - ".travis.yml"
136
137
  - CHANGELOG.md
137
138
  - Dockerfile
@@ -146,6 +147,7 @@ files:
146
147
  - bin/kite
147
148
  - bin/kite-config
148
149
  - bin/kite-console
150
+ - ci/bump.rb
149
151
  - config/pipelines/review.yml
150
152
  - config/pipelines/tasks/create-pull-requests-tag.yml
151
153
  - config/pipelines/tasks/create-repository-tag.yml
@@ -213,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
215
  version: '0'
214
216
  requirements: []
215
217
  rubyforge_project:
216
- rubygems_version: 2.7.3
218
+ rubygems_version: 2.7.6
217
219
  signing_key:
218
220
  specification_version: 4
219
221
  summary: Command line tool for devops scaffolding.