ops 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +11 -10
- data/lib/ops/revision.rb +29 -89
- data/lib/ops/server/views/version.erb +24 -47
- data/lib/ops/server.rb +5 -9
- data/lib/ops/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cfa4c11946baaa93a8d4683795a32c455ec879214e7275b7b58a9d5bcc7c93a0
|
4
|
+
data.tar.gz: dde535ba99c5a2772a154a791d6199c57d27e7b9ebc5feb7257aad070fa14404
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4da7f53d6755daf5d6d9118846018bf71f85129d584271577ebe9bc96d8339ec8d6337a44ad01415c31a2b8bf333f71a9060dbdcbf102d2023f9ce02e2a3c21b
|
7
|
+
data.tar.gz: a776b7876b2528378e8f49ce8421b6e2ed7789226c69c14d1e607fab354ddd57e121000062f92e1e23511d2068e03e35f261a88915ca632db0f3cd86f70dbd5e
|
data/README.md
CHANGED
@@ -8,22 +8,23 @@ This gem provides standardized support for obtaining environment, version, and h
|
|
8
8
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
9
9
|
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
|
10
10
|
|
11
|
-
- [
|
12
|
-
- [
|
13
|
-
|
14
|
-
- [
|
15
|
-
- [
|
16
|
-
- [
|
11
|
+
- [Ops](#ops)
|
12
|
+
- [Installation](#installation)
|
13
|
+
- [For Rails apps:](#for-rails-apps)
|
14
|
+
- [For Sinatra apps:](#for-sinatra-apps)
|
15
|
+
- [Adding Custom Heartbeats](#adding-custom-heartbeats)
|
16
|
+
- [The Configuration Service Adapter (Optional)](#the-configuration-service-adapter-optional)
|
17
|
+
- [Running tests](#running-tests)
|
17
18
|
|
18
19
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
19
20
|
|
20
21
|
|
21
22
|
**You will likely want to block or restrict access to the following routes:**
|
22
23
|
|
23
|
-
Route | Notes
|
24
|
-
|
25
|
-
`/ops/env` | Exposes all of your environment variables (e.g. any API keys set as environment variables) to the public
|
26
|
-
`/ops/config` | Exposes all of your configuration keys and values to the public (if you're using a configuration service).
|
24
|
+
| Route | Notes |
|
25
|
+
| ------------- | ---------------------------------------------------------------------------------------------------------- |
|
26
|
+
| `/ops/env` | Exposes all of your environment variables (e.g. any API keys set as environment variables) to the public |
|
27
|
+
| `/ops/config` | Exposes all of your configuration keys and values to the public (if you're using a configuration service). |
|
27
28
|
|
28
29
|
Typical usage:
|
29
30
|
|
data/lib/ops/revision.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
1
3
|
module Ops
|
2
4
|
class Revision
|
3
|
-
|
5
|
+
attr_reader :file_root
|
4
6
|
|
5
7
|
def initialize(new_headers = {}, opts = Ops.config)
|
6
8
|
@file_root = opts.file_root.to_s # convert to string in case they pass us a Pathname
|
@@ -8,114 +10,52 @@ module Ops
|
|
8
10
|
@headers = new_headers
|
9
11
|
end
|
10
12
|
|
11
|
-
|
12
|
-
@version ||= if version_file?
|
13
|
-
chomp(version_file).gsub('^{}', '')
|
14
|
-
elsif development? && branch_source.call =~ /^\* (.*)$/
|
15
|
-
Regexp.last_match(1)
|
16
|
-
else
|
17
|
-
'Unknown (VERSION file is missing)'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def previous_versions
|
22
|
-
@previous_versions ||= get_previous_by_time
|
23
|
-
end
|
24
|
-
|
25
|
-
def get_previous_by_time
|
26
|
-
get_previous_versions.sort_by { |a| a[:time] }
|
27
|
-
end
|
28
|
-
|
29
|
-
def get_previous_versions
|
30
|
-
Dir["#{path}/../*"].each_with_object([]) do |dir, array|
|
31
|
-
next if dir =~ /#{current_dir}$/
|
32
|
-
version, revision = File.join(dir, 'VERSION'), File.join(dir, 'REVISION')
|
33
|
-
array << stats_hash(version: version, revision: revision) if File.exist?(version) && File.exist?(revision)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def path
|
38
|
-
File.absolute_path file_root
|
39
|
-
end
|
40
|
-
|
41
|
-
def current_dir
|
42
|
-
file_root.split('/').last
|
43
|
-
end
|
44
|
-
|
45
|
-
def stats_hash(files)
|
46
|
-
{ version: get_version(files[:version]),
|
47
|
-
revision: get_revision(files[:revision]),
|
48
|
-
time: get_time(files[:revision]) }
|
49
|
-
end
|
50
|
-
|
51
|
-
def get_version(file)
|
52
|
-
chomp(file).gsub('^{}', '')
|
53
|
-
end
|
13
|
+
attr_reader :environment
|
54
14
|
|
55
|
-
def
|
56
|
-
|
15
|
+
def headers
|
16
|
+
@headers.select { |k, v| k.match(/^[-A-Z_].*$/) }
|
57
17
|
end
|
58
18
|
|
59
|
-
def
|
60
|
-
|
19
|
+
def info
|
20
|
+
@info ||= build_info.merge(deploy_info)
|
61
21
|
end
|
62
22
|
|
63
|
-
def
|
64
|
-
|
23
|
+
def previous_info
|
24
|
+
@previous_info ||= previous_build_info.merge(previous_deploy_info)
|
65
25
|
end
|
66
26
|
|
67
|
-
|
68
|
-
|
69
|
-
attr_reader :environment
|
70
|
-
|
71
|
-
def development?
|
72
|
-
environment == 'development'
|
73
|
-
end
|
74
|
-
|
75
|
-
def version_file
|
76
|
-
@version_file ||= File.join(file_root, 'VERSION')
|
77
|
-
end
|
27
|
+
private
|
78
28
|
|
79
|
-
def
|
80
|
-
|
29
|
+
def build_info
|
30
|
+
info_from_file('BUILD-INFO')
|
81
31
|
end
|
82
32
|
|
83
|
-
def
|
84
|
-
|
33
|
+
def previous_build_info
|
34
|
+
info_from_file('PREVIOUS-BUILD-INFO')
|
85
35
|
end
|
86
36
|
|
87
|
-
def
|
88
|
-
|
37
|
+
def deploy_info
|
38
|
+
info_from_file('DEPLOY-INFO')
|
89
39
|
end
|
90
40
|
|
91
|
-
def
|
92
|
-
|
93
|
-
get_time version_file
|
94
|
-
elsif development?
|
95
|
-
'Live'
|
96
|
-
else
|
97
|
-
'Unknown (VERSION file is missing)'
|
98
|
-
end
|
41
|
+
def previous_deploy_info
|
42
|
+
info_from_file('PREVIOUS-DEPLOY-INFO')
|
99
43
|
end
|
100
44
|
|
101
|
-
def
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
'Unknown (REVISION file is missing)'
|
108
|
-
end
|
45
|
+
def info_from_file(name)
|
46
|
+
if file_exists?(name)
|
47
|
+
parse_info_file(name)
|
48
|
+
else
|
49
|
+
{name.downcase.gsub('-', '_') => "No #{name} file found"}
|
50
|
+
end
|
109
51
|
end
|
110
52
|
|
111
|
-
def
|
112
|
-
|
53
|
+
def parse_info_file(filename)
|
54
|
+
YAML.safe_load(File.read(File.join(file_root, filename))) if file_exists?(filename)
|
113
55
|
end
|
114
56
|
|
115
|
-
|
116
|
-
|
117
|
-
def branch_source
|
118
|
-
@branch_source ||= -> { `git branch` }
|
57
|
+
def file_exists?(file_name)
|
58
|
+
File.exist?(File.join(file_root, file_name))
|
119
59
|
end
|
120
60
|
end
|
121
61
|
end
|
@@ -1,25 +1,4 @@
|
|
1
1
|
<div class="container">
|
2
|
-
<div class="spacer"></div>
|
3
|
-
<div id="version">
|
4
|
-
<div class="label">
|
5
|
-
<%= "#{app_name} Version" %>
|
6
|
-
</div>
|
7
|
-
<div class="value">
|
8
|
-
<%= version_link @version.version_or_branch %>
|
9
|
-
</div>
|
10
|
-
</div>
|
11
|
-
<div class="spacer"></div>
|
12
|
-
<div id="date">
|
13
|
-
<div class="label">Date Deployed</div>
|
14
|
-
<div class="value"><%= @version.deploy_date %></div>
|
15
|
-
</div>
|
16
|
-
<div class="spacer"></div>
|
17
|
-
<div id="commit">
|
18
|
-
<div class="label">Last Commit</div>
|
19
|
-
<div class="value">
|
20
|
-
<%= commit_link(@version.last_commit)%>
|
21
|
-
</div>
|
22
|
-
</div>
|
23
2
|
<div class="spacer"></div>
|
24
3
|
<div id="host">
|
25
4
|
<div class="label">Host</div>
|
@@ -31,33 +10,31 @@
|
|
31
10
|
<div class="value"><%= @version.environment %></div>
|
32
11
|
</div>
|
33
12
|
<div class="spacer"></div>
|
34
|
-
<
|
35
|
-
|
36
|
-
<div class="
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
<% @previous_versions.each_with_index do |version, i| %>
|
45
|
-
<tr class="<%= i%2==0 ? 'even' : nil %>">
|
46
|
-
<td>
|
47
|
-
<%= version[:time].strftime('%x %X') %>
|
48
|
-
</td>
|
49
|
-
<td>
|
50
|
-
<%= version_link(version[:version]) %>
|
51
|
-
</td>
|
52
|
-
<td>
|
53
|
-
<%= commit_link(version[:revision]) %>
|
54
|
-
</td>
|
55
|
-
</tr>
|
56
|
-
<% end %>
|
57
|
-
</table>
|
58
|
-
<% end %>
|
13
|
+
<h3>Current Deploy Info</h3>
|
14
|
+
<% @version.info.each do |key, value| %>
|
15
|
+
<div class="spacer"></div>
|
16
|
+
<div>
|
17
|
+
<div class="label">
|
18
|
+
<%= key.to_s.gsub('_',' ').capitalize %>
|
19
|
+
</div>
|
20
|
+
<div class="value">
|
21
|
+
<%= value %>
|
22
|
+
</div>
|
59
23
|
</div>
|
60
|
-
|
24
|
+
<% end %>
|
25
|
+
<div class="spacer"></div>
|
26
|
+
<h3>Previous Deploy Info</h3>
|
27
|
+
<% @version.previous_info.each do |key, value| %>
|
28
|
+
<div class="spacer"></div>
|
29
|
+
<div>
|
30
|
+
<div class="label">
|
31
|
+
<%= key.to_s.gsub('_',' ').capitalize %>
|
32
|
+
</div>
|
33
|
+
<div class="value">
|
34
|
+
<%= value %>
|
35
|
+
</div>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
61
38
|
<div class="spacer"></div>
|
62
39
|
<div id="headers">
|
63
40
|
<div class="label">Headers</div>
|
data/lib/ops/server.rb
CHANGED
@@ -4,9 +4,7 @@ require 'json'
|
|
4
4
|
|
5
5
|
module Ops
|
6
6
|
class Server < Sinatra::Base
|
7
|
-
|
8
|
-
set :views, "#{dir}/server/views"
|
9
|
-
# set :views, File.dirname(File.expand_path('/../server/views', __FILE__))
|
7
|
+
set :views, "#{File.dirname(File.expand_path('', __FILE__))}/server/views"
|
10
8
|
|
11
9
|
helpers Ops::Helpers
|
12
10
|
|
@@ -14,11 +12,10 @@ module Ops
|
|
14
12
|
env.each_with_object({}) { |(k, v), headers| headers[k] = v }
|
15
13
|
end
|
16
14
|
|
17
|
-
def jsonified_version(version,
|
15
|
+
def jsonified_version(version, headers)
|
18
16
|
JSON.generate(
|
19
|
-
|
20
|
-
|
21
|
-
previous_versions: previous_versions,
|
17
|
+
info: version.info,
|
18
|
+
previous_info: version.previous_info,
|
22
19
|
headers: headers
|
23
20
|
)
|
24
21
|
end
|
@@ -34,12 +31,11 @@ module Ops
|
|
34
31
|
|
35
32
|
get '/version/?:format?', provides: %i(html json) do
|
36
33
|
@version = Revision.new(request_headers)
|
37
|
-
@previous_versions = @version.previous_versions
|
38
34
|
@headers = @version.headers
|
39
35
|
|
40
36
|
if json_request?
|
41
37
|
content_type 'application/json'
|
42
|
-
return jsonified_version(@version, @
|
38
|
+
return jsonified_version(@version, @headers)
|
43
39
|
end
|
44
40
|
|
45
41
|
erb :version
|
data/lib/ops/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Pelz-Sherman
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2022-10-20 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
@@ -83,8 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '0'
|
85
85
|
requirements: []
|
86
|
-
|
87
|
-
rubygems_version: 2.4.5.1
|
86
|
+
rubygems_version: 3.1.6
|
88
87
|
signing_key:
|
89
88
|
specification_version: 4
|
90
89
|
summary: Provide ops info endpoints.
|