napkin 0.0.5 → 0.0.6
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 +8 -8
- data/Gemfile.lock +34 -6
- data/lib/napkin/cli.rb +4 -0
- data/lib/napkin/cli/staging.rb +155 -0
- data/lib/napkin/version.rb +1 -1
- data/napkin.gemspec +3 -0
- metadata +44 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZmUwMTU1Mjk4MTEzNzU2YWQ5Y2RkMjVkMThlODMwOTYyOGE2ZWVkZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2JkMmFmODkzNTliOTNkNWVjMTQ2MTNiNjVhODAzMTg3YWZhNjllOQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDUzMjk2ZjljZWFjY2YzZjhmZjdmZWU4N2RhYjg3OWM4ZTkzNjA1ZjA1OWY2
|
10
|
+
NjdiZjM2YTcyYjBjYzlkNzViNDhmZDc0NWYwOWFlZmY5MGEzNDZlYTEzNzU0
|
11
|
+
NmYzYWI0YzU2MmU3MzJkZjczN2Y4MzkyMzU2ZWU0MDAzMGE0ODY=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzkxNWNhZGQxZWExNTgzY2IyYjg4MGExOGVmMmZlNzAxOGRkYWZmZGI2NDEw
|
14
|
+
N2Y1YjM5N2Q5NmUyYjcwYmYyMDdjMGZjZGMzMDM1MTIwNjg3YzQ0MjU3ZTkw
|
15
|
+
ZDUzNGM5NTljOWRiZWE3ZWIwZGY3NTM1YWE1MGNhNzYyZjBkMWU=
|
data/Gemfile.lock
CHANGED
@@ -1,35 +1,59 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
napkin (0.0.
|
4
|
+
napkin (0.0.5)
|
5
|
+
aws-sdk (>= 2.0)
|
6
|
+
httparty (>= 0.13.3)
|
5
7
|
jenkins_api_client (~> 1.3.0)
|
6
8
|
octokit (~> 3.0)
|
7
9
|
semantic (~> 1.3.0)
|
10
|
+
sshkit (>= 1.7.1)
|
8
11
|
thor (~> 0.19.1)
|
9
12
|
|
10
13
|
GEM
|
11
14
|
remote: https://rubygems.org/
|
12
15
|
specs:
|
13
|
-
addressable (2.3.
|
16
|
+
addressable (2.3.7)
|
14
17
|
ast (2.0.0)
|
18
|
+
aws-sdk (2.0.31)
|
19
|
+
aws-sdk-resources (= 2.0.31)
|
20
|
+
aws-sdk-core (2.0.31)
|
21
|
+
builder (~> 3.0)
|
22
|
+
jmespath (~> 1.0)
|
23
|
+
multi_json (~> 1.0)
|
24
|
+
multi_xml (~> 0.5)
|
25
|
+
aws-sdk-resources (2.0.31)
|
26
|
+
aws-sdk-core (= 2.0.31)
|
27
|
+
builder (3.2.2)
|
15
28
|
coderay (1.1.0)
|
16
|
-
|
29
|
+
colorize (0.7.5)
|
30
|
+
faraday (0.9.1)
|
17
31
|
multipart-post (>= 1.2, < 3)
|
32
|
+
httparty (0.13.3)
|
33
|
+
json (~> 1.8)
|
34
|
+
multi_xml (>= 0.5.2)
|
18
35
|
jenkins_api_client (1.3.0)
|
19
36
|
json
|
20
37
|
mixlib-shellout (>= 1.1.0)
|
21
38
|
nokogiri (~> 1.6.0)
|
22
39
|
terminal-table (>= 1.4.0)
|
23
40
|
thor (>= 0.16.0)
|
41
|
+
jmespath (1.0.2)
|
42
|
+
multi_json (~> 1.0)
|
24
43
|
json (1.8.1)
|
25
44
|
method_source (0.8.2)
|
26
45
|
mini_portile (0.6.2)
|
27
46
|
mixlib-shellout (2.0.1)
|
47
|
+
multi_json (1.11.0)
|
48
|
+
multi_xml (0.5.5)
|
28
49
|
multipart-post (2.0.0)
|
50
|
+
net-scp (1.2.1)
|
51
|
+
net-ssh (>= 2.6.5)
|
52
|
+
net-ssh (2.9.2)
|
29
53
|
nokogiri (1.6.6.2)
|
30
54
|
mini_portile (~> 0.6.0)
|
31
|
-
octokit (3.
|
32
|
-
sawyer (~> 0.5.3)
|
55
|
+
octokit (3.8.0)
|
56
|
+
sawyer (~> 0.6.0, >= 0.5.3)
|
33
57
|
parser (2.2.0.pre.3)
|
34
58
|
ast (>= 1.1, < 3.0)
|
35
59
|
slop (~> 3.4, >= 3.4.5)
|
@@ -46,11 +70,15 @@ GEM
|
|
46
70
|
rainbow (>= 1.99.1, < 3.0)
|
47
71
|
ruby-progressbar (~> 1.4)
|
48
72
|
ruby-progressbar (1.5.1)
|
49
|
-
sawyer (0.
|
73
|
+
sawyer (0.6.0)
|
50
74
|
addressable (~> 2.3.5)
|
51
75
|
faraday (~> 0.8, < 0.10)
|
52
76
|
semantic (1.3.1)
|
53
77
|
slop (3.6.0)
|
78
|
+
sshkit (1.7.1)
|
79
|
+
colorize (>= 0.7.0)
|
80
|
+
net-scp (>= 1.1.2)
|
81
|
+
net-ssh (>= 2.8.0)
|
54
82
|
terminal-table (1.4.5)
|
55
83
|
thor (0.19.1)
|
56
84
|
|
data/lib/napkin/cli.rb
CHANGED
@@ -4,6 +4,7 @@ require 'thor'
|
|
4
4
|
|
5
5
|
require_relative './cli/github'
|
6
6
|
require_relative './cli/jenkins'
|
7
|
+
require_relative './cli/staging'
|
7
8
|
require_relative './cli/tools'
|
8
9
|
|
9
10
|
module Napkin
|
@@ -14,6 +15,9 @@ module Napkin
|
|
14
15
|
desc 'jenkins', 'manage a jenkins instance'
|
15
16
|
subcommand 'jenkins', Jenkins
|
16
17
|
|
18
|
+
desc 'staging', 'manage the staging (branch) environment'
|
19
|
+
subcommand 'staging', Staging
|
20
|
+
|
17
21
|
desc 'tools', 'install and configure tools for builds'
|
18
22
|
subcommand 'tools', Tools
|
19
23
|
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'aws-sdk'
|
4
|
+
require 'aws-sdk-resources'
|
5
|
+
require 'httparty'
|
6
|
+
require 'sshkit'
|
7
|
+
require 'sshkit/dsl'
|
8
|
+
|
9
|
+
require 'pp'
|
10
|
+
|
11
|
+
SSHKit::Backend::Netssh.configure do |ssh|
|
12
|
+
ssh.connection_timeout = 30
|
13
|
+
ssh.ssh_options = {
|
14
|
+
:keys => [ File.join(ENV['HOME'], '.ssh', 'new_chef_deployer.pem') ],
|
15
|
+
:user => 'ubuntu',
|
16
|
+
:user_known_hosts_file => '/dev/null'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
module Napkin
|
21
|
+
class CLI < Thor
|
22
|
+
class Staging < Thor
|
23
|
+
include Thor::Actions
|
24
|
+
|
25
|
+
desc 'list', 'list all hosts in the staging environment'
|
26
|
+
def list
|
27
|
+
instances.each do |instance|
|
28
|
+
name = instance.tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
|
29
|
+
say "#{name.ljust(30)}\t#{instance.instance_id}\t#{instance.public_dns_name}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'show ID', 'show the instance ID details'
|
34
|
+
def show(id)
|
35
|
+
name = instance(id).tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
|
36
|
+
say "#{name.ljust(30)}\t#{instance(id).instance_id}\t#{instance(id).public_dns_name}"
|
37
|
+
end
|
38
|
+
|
39
|
+
desc 'check_active ID', 'check if an instance is active'
|
40
|
+
def check_active(id)
|
41
|
+
commands = [
|
42
|
+
SSHKit::Command.new("[ `cat /proc/uptime | awk '{ printf \"%.0f\",($1/60/60/24) }'` -lt 3 ] && echo to_keep"),
|
43
|
+
SSHKit::Command.new("cat /lift/logs/nginx/*.log | grep -v robots.txt | grep 'HTTP/1.1\" 200'"),
|
44
|
+
SSHKit::Command.new("zcat /lift/logs/nginx/*.log.*.gz | grep -v robots.txt | grep 'HTTP/1.1\" 200' | egrep \"`date +%d/%b/%Y --date='1 day ago'`|`date +%d/%b/%Y --date='2 days ago'`\"")
|
45
|
+
]
|
46
|
+
|
47
|
+
!check(id, *commands).empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
desc 'destroy_inactive', 'destroy all inactive instances'
|
51
|
+
def destroy_inactive
|
52
|
+
instances.each do |i|
|
53
|
+
destroy(i.instance_id)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
desc 'destroy ID', 'destroy an instance by ID'
|
58
|
+
method_option :force,
|
59
|
+
:aliases => '-f',
|
60
|
+
:default => false,
|
61
|
+
:desc => 'Force the destruction of the instance',
|
62
|
+
:required => false,
|
63
|
+
:type => :boolean
|
64
|
+
def destroy(id)
|
65
|
+
if check_active(id) && !options[:force]
|
66
|
+
say "#{id} is still active. Use -f to force.", :red
|
67
|
+
return false
|
68
|
+
end
|
69
|
+
staging_name = name_for(instance(id)).rpartition('-').first
|
70
|
+
if staging_name.empty?
|
71
|
+
say "#{id} isn't a staging box.", :red
|
72
|
+
return false
|
73
|
+
end
|
74
|
+
instance_ids = instances(true).collect { |instance| name_for(instance).start_with?(staging_name) ? instance.instance_id : nil }.compact
|
75
|
+
instance_ids.each do |instance_id|
|
76
|
+
show(instance_id)
|
77
|
+
destroy_instance(instance_id)
|
78
|
+
end
|
79
|
+
|
80
|
+
notify(staging_name)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def notify(name)
|
86
|
+
options = {
|
87
|
+
:headers => {
|
88
|
+
'Content-Type' => 'application/json'
|
89
|
+
},
|
90
|
+
:body => {
|
91
|
+
:build => {
|
92
|
+
:phase => 'FINISHED',
|
93
|
+
:status => 'SUCCESS',
|
94
|
+
:parameters => {
|
95
|
+
:NODE_NAME => name
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}.to_json
|
99
|
+
}
|
100
|
+
HTTParty.post('http://lift-jarvis.herokuapp.com/jenkins/branch_destroy', options)
|
101
|
+
end
|
102
|
+
|
103
|
+
def destroy_instance(id)
|
104
|
+
say "destroying #{id}", :cyan
|
105
|
+
instance(id).terminate
|
106
|
+
end
|
107
|
+
|
108
|
+
def name_for(instance)
|
109
|
+
instance.tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
|
110
|
+
rescue NoMethodError
|
111
|
+
''
|
112
|
+
end
|
113
|
+
|
114
|
+
def check(id, *commands)
|
115
|
+
hostname = instance(id).public_dns_name
|
116
|
+
name = instance(id).tags.detect { |tag| tag.key == 'Name' && tag.value != '' }.value
|
117
|
+
say "checking #{hostname} (#{name})", :blue
|
118
|
+
output = ''
|
119
|
+
|
120
|
+
on hostname do
|
121
|
+
commands.each do |command|
|
122
|
+
begin
|
123
|
+
output << capture(command)
|
124
|
+
rescue SSHKit::Command::Failed
|
125
|
+
# command failed, with a status code > 0, which means there were no logs found usually
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
output
|
131
|
+
end
|
132
|
+
|
133
|
+
def instance(id)
|
134
|
+
unless @instance_id == id
|
135
|
+
@instance = nil
|
136
|
+
@instance_id = id
|
137
|
+
end
|
138
|
+
|
139
|
+
@instance ||= Aws::EC2::Resource.new.instance(id)
|
140
|
+
end
|
141
|
+
|
142
|
+
def instances(all = false)
|
143
|
+
unless @all == all
|
144
|
+
@instances = nil
|
145
|
+
@all = all
|
146
|
+
end
|
147
|
+
@instances ||= ec2.describe_instances.reservations.map { |r| r.instances.map { |instance| instance if instance.tags.any? { |tag| tag.key == 'Name' && tag.value.end_with?('apps') || all } } }.flatten.compact.reject { |i| i.state.name != 'running' }
|
148
|
+
end
|
149
|
+
|
150
|
+
def ec2
|
151
|
+
@ec2 ||= Aws::EC2::Client.new(:region => 'us-east-1')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
data/lib/napkin/version.rb
CHANGED
data/napkin.gemspec
CHANGED
@@ -28,9 +28,12 @@ Gem::Specification.new do |spec|
|
|
28
28
|
end
|
29
29
|
|
30
30
|
{
|
31
|
+
'aws-sdk' => '>= 2.0',
|
32
|
+
'httparty' => '>= 0.13.3',
|
31
33
|
'jenkins_api_client' => '~> 1.3.0',
|
32
34
|
'octokit' => '~> 3.0',
|
33
35
|
'semantic' => '~> 1.3.0',
|
36
|
+
'sshkit' => '>= 1.7.1',
|
34
37
|
'thor' => '~> 0.19.1'
|
35
38
|
}.each_pair do |dep, ver|
|
36
39
|
spec.add_dependency(dep, ver)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: napkin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Daniel
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.24.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aws-sdk
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: httparty
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.13.3
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.13.3
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: jenkins_api_client
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,6 +108,20 @@ dependencies:
|
|
80
108
|
- - ~>
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: 1.3.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sshkit
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.7.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.7.1
|
83
125
|
- !ruby/object:Gem::Dependency
|
84
126
|
name: thor
|
85
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,6 +153,7 @@ files:
|
|
111
153
|
- lib/napkin/cli.rb
|
112
154
|
- lib/napkin/cli/github.rb
|
113
155
|
- lib/napkin/cli/jenkins.rb
|
156
|
+
- lib/napkin/cli/staging.rb
|
114
157
|
- lib/napkin/cli/tools.rb
|
115
158
|
- lib/napkin/files/lifted-chef.erb
|
116
159
|
- lib/napkin/version.rb
|