capistrano-hivequeen 7.4.0 → 7.7.0
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 +5 -5
- data/README.rdoc +6 -0
- data/capistrano-hivequeen.gemspec +2 -0
- data/lib/capistrano/hivequeen/capistrano_configuration.rb +16 -5
- data/lib/capistrano/hivequeen/deploy.rb +13 -2
- data/lib/capistrano/hivequeen/ec2_instance_connect.rb +36 -0
- data/lib/capistrano/hivequeen/version.rb +1 -1
- data/lib/capistrano/hivequeen.rb +7 -3
- metadata +35 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 72b660b02784362a5c9a2f8a96a3355a3fd18fb399b57d138942488f89b16b10
|
|
4
|
+
data.tar.gz: da9503dc5137e661476abba23820112d59bd4033d0775dbd015e449a0ee889f2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 96e6bb88e860b84984b32501ac7be9135364b4ad16a4a644540e8b3cb9f30e655f20f829b5bdcf085e4fc8ba4ddc54d18cc1f36a9a59bef356de48af5f37080a
|
|
7
|
+
data.tar.gz: ca952a870f3db6dafbc36701dcb6708a2902d611fd1abf57783be5607bd3fc0b62523f81ebfd2e7c8f19b45741a549ab7704d79b548c56220185392069bcb6ed
|
data/README.rdoc
CHANGED
|
@@ -27,6 +27,12 @@ And in your config/deploy.rb:
|
|
|
27
27
|
|
|
28
28
|
cap staging deploy -s branch=some_feature
|
|
29
29
|
|
|
30
|
+
=== Releasing a new version
|
|
31
|
+
First, bump the version in lib/capistrano/hivequeen/version.rb. Then:
|
|
32
|
+
|
|
33
|
+
gem build capistrano-hivequeen.gemspec
|
|
34
|
+
gem push capistrano-hivequeen-$VERSION.gem
|
|
35
|
+
|
|
30
36
|
== License
|
|
31
37
|
|
|
32
38
|
@copy; Copyright Kickstarter, PBC.
|
|
@@ -38,6 +38,8 @@ Gem::Specification.new do |s|
|
|
|
38
38
|
|
|
39
39
|
## List your runtime dependencies here. Runtime dependencies are those
|
|
40
40
|
## that are needed for an end user to actually USE your code.
|
|
41
|
+
s.add_dependency('aws-sdk-ec2', '~> 1.0')
|
|
42
|
+
s.add_dependency('aws-sdk-ec2instanceconnect', '~> 1.0')
|
|
41
43
|
s.add_dependency('capistrano', '>= 2.11.0')
|
|
42
44
|
s.add_dependency('activesupport', '>= 3.0.0')
|
|
43
45
|
s.add_dependency('json')
|
|
@@ -15,6 +15,9 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
|
15
15
|
# From the command line, use -s override=true to force a deployment
|
|
16
16
|
set :override, false
|
|
17
17
|
|
|
18
|
+
# Don't mark deployments as canary deployments by default
|
|
19
|
+
set :canary, false
|
|
20
|
+
|
|
18
21
|
# Command to get the changes being deployed
|
|
19
22
|
set :changelog_command do
|
|
20
23
|
`git log #{current_commit}...#{real_revision} --pretty="%n%h %an: %s (%ar)" --stat --no-color`
|
|
@@ -75,7 +78,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
|
75
78
|
if exists?(:az)
|
|
76
79
|
servers = servers.select {|s| s['availability_zone'] == az}
|
|
77
80
|
end
|
|
78
|
-
role(role_name.to_sym) { servers.map {|s| s['public_dns']} }
|
|
81
|
+
role(role_name.to_sym) { servers.map {|s| s['public_dns'] || s['private_dns']} }
|
|
79
82
|
end
|
|
80
83
|
|
|
81
84
|
# Ensure some server designated as db server
|
|
@@ -94,14 +97,18 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
|
94
97
|
command_format = "ssh -t -A -l %s %s"
|
|
95
98
|
env['roles'].keys.each do |role_name|
|
|
96
99
|
task role_name do
|
|
97
|
-
|
|
100
|
+
server = roles[role_name.to_sym].servers.sample
|
|
101
|
+
HiveQueen.ec2_instance_connect(server.host)
|
|
102
|
+
cmd = command_format % [user, server]
|
|
98
103
|
puts "Executing #{cmd}"
|
|
99
104
|
exec cmd
|
|
100
105
|
end
|
|
101
106
|
end
|
|
102
107
|
|
|
103
108
|
task :default do
|
|
104
|
-
|
|
109
|
+
server = roles.values.sample.servers.sample
|
|
110
|
+
HiveQueen.ec2_instance_connect(server.host)
|
|
111
|
+
cmd = command_format % [user, server]
|
|
105
112
|
puts "Executing #{cmd}"
|
|
106
113
|
exec cmd
|
|
107
114
|
end
|
|
@@ -111,14 +118,18 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
|
111
118
|
command_format = "ssh -t -A -l %s %s 'source /etc/profile; cd /apps/#{HiveQueen.project}/current && bundle exec rails console'"
|
|
112
119
|
env['roles'].keys.each do |role_name|
|
|
113
120
|
task role_name do
|
|
121
|
+
server = roles[role_name.to_sym].servers.sample
|
|
122
|
+
HiveQueen.ec2_instance_connect(server.host)
|
|
114
123
|
puts "Opening console"
|
|
115
|
-
exec command_format % [user,
|
|
124
|
+
exec command_format % [user, server]
|
|
116
125
|
end
|
|
117
126
|
end
|
|
118
127
|
|
|
119
128
|
task :default do
|
|
129
|
+
server = roles.values.sample.servers.sample
|
|
130
|
+
HiveQueen.ec2_instance_connect(server.host)
|
|
120
131
|
puts "Opening console"
|
|
121
|
-
exec command_format % [user,
|
|
132
|
+
exec command_format % [user, server]
|
|
122
133
|
end
|
|
123
134
|
end
|
|
124
135
|
end
|
|
@@ -7,6 +7,8 @@ Capistrano::Configuration.instance.load do
|
|
|
7
7
|
before "deploy:stage", "hivequeen:start"
|
|
8
8
|
before 'hivequeen:start', 'hivequeen:check_commit'
|
|
9
9
|
on :start, "hivequeen:require_environment", :except => HiveQueen.environment_names
|
|
10
|
+
on :start, "hivequeen:ensure_canary_specifies_hosts"
|
|
11
|
+
|
|
10
12
|
namespace :hivequeen do
|
|
11
13
|
|
|
12
14
|
desc "[internal] abort if no environment specified"
|
|
@@ -14,6 +16,14 @@ Capistrano::Configuration.instance.load do
|
|
|
14
16
|
abort "No environment specified." if !exists?(:environment)
|
|
15
17
|
end
|
|
16
18
|
|
|
19
|
+
desc "[internal] abort if we're trying to do a canary deploy but HOSTS hasn't been defined"
|
|
20
|
+
task :ensure_canary_specifies_hosts do
|
|
21
|
+
# TODO: I suppose we could randomly select instance(s) in this case
|
|
22
|
+
if canary && !ENV.key?('HOSTS')
|
|
23
|
+
abort "You asked to do a canary deployment but didn't specify any hosts! \nPlease invoke like `cap HOSTS=foo.com deploy -s canary=true'"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
17
27
|
desc "[internal] Start a deployment in hivequeen"
|
|
18
28
|
task :start do
|
|
19
29
|
# TODO: is there a better way to determine what cap tasks are running?
|
|
@@ -22,7 +32,8 @@ Capistrano::Configuration.instance.load do
|
|
|
22
32
|
params = {
|
|
23
33
|
:task => tasks.join(' '),
|
|
24
34
|
:commit => real_revision,
|
|
25
|
-
:override => override
|
|
35
|
+
:override => override,
|
|
36
|
+
:canary => canary,
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
if current_commit
|
|
@@ -44,7 +55,7 @@ Capistrano::Configuration.instance.load do
|
|
|
44
55
|
|
|
45
56
|
desc "[internal] Prompt if deploying the currently running commit, or if tests haven't passed"
|
|
46
57
|
task :check_commit do
|
|
47
|
-
if environment.to_s == 'production' && !override
|
|
58
|
+
if environment.to_s == 'production' && !override && !canary
|
|
48
59
|
if current_commit == real_revision
|
|
49
60
|
banner = %q{
|
|
50
61
|
______ _ _ _ ___
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
class HiveQueen
|
|
2
|
+
def self.ec2_client
|
|
3
|
+
@ec2_client ||= Aws::EC2::Client.new
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.ec2_instance_connect_client
|
|
7
|
+
@ec2_instance_connect_client ||= Aws::EC2InstanceConnect::Client.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.ec2_instance_connect(*private_dns)
|
|
11
|
+
# EC2 Instance Connect
|
|
12
|
+
ssh_public_key = File.read(File.expand_path('~/.ssh/ksr_ed25519.pub'))
|
|
13
|
+
ec2_params = {
|
|
14
|
+
filters: [{
|
|
15
|
+
name: 'network-interface.private-dns-name',
|
|
16
|
+
values: private_dns
|
|
17
|
+
}]
|
|
18
|
+
}
|
|
19
|
+
logger.trace("ec2:DescribeInstances #{ec2_params.to_json}")
|
|
20
|
+
instances = ec2_client.describe_instances(**ec2_params).reservations.map(&:instances).flatten
|
|
21
|
+
threads = instances.map do |instance|
|
|
22
|
+
Thread.new do
|
|
23
|
+
ec2ic_params = {
|
|
24
|
+
availability_zone: instance.placement.availability_zone,
|
|
25
|
+
instance_id: instance.instance_id,
|
|
26
|
+
instance_os_user: 'ksr',
|
|
27
|
+
ssh_public_key: ssh_public_key,
|
|
28
|
+
}
|
|
29
|
+
logger.trace("ec2-instance-connect:SendSSHPublicKey #{ec2ic_params.to_json}")
|
|
30
|
+
ec2_instance_connect_client.send_ssh_public_key(**ec2ic_params)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
threads.each(&:join)
|
|
35
|
+
end
|
|
36
|
+
end
|
data/lib/capistrano/hivequeen.rb
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
# HTTP Client for Hive Queen environment configuration
|
|
2
|
+
require 'base64'
|
|
3
|
+
require 'fileutils'
|
|
2
4
|
require 'json'
|
|
5
|
+
|
|
3
6
|
require 'active_support'
|
|
4
7
|
require 'active_support/core_ext'
|
|
5
|
-
require '
|
|
8
|
+
require 'aws-sdk-ec2'
|
|
9
|
+
require 'aws-sdk-ec2instanceconnect'
|
|
6
10
|
require 'excon'
|
|
7
|
-
|
|
11
|
+
|
|
8
12
|
require 'capistrano/hivequeen/version'
|
|
9
13
|
require 'capistrano/hivequeen/multiio'
|
|
14
|
+
require 'capistrano/hivequeen/ec2_instance_connect'
|
|
10
15
|
|
|
11
16
|
# Special cases:
|
|
12
17
|
# - environment not found
|
|
@@ -135,4 +140,3 @@ class HiveQueen
|
|
|
135
140
|
end
|
|
136
141
|
|
|
137
142
|
require "capistrano/hivequeen/capistrano_configuration"
|
|
138
|
-
|
metadata
CHANGED
|
@@ -1,15 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: capistrano-hivequeen
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 7.
|
|
4
|
+
version: 7.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Aaron Suggs
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-07-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: aws-sdk-ec2
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: aws-sdk-ec2instanceconnect
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.0'
|
|
13
41
|
- !ruby/object:Gem::Dependency
|
|
14
42
|
name: capistrano
|
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -93,6 +121,7 @@ files:
|
|
|
93
121
|
- lib/capistrano/hivequeen.rb
|
|
94
122
|
- lib/capistrano/hivequeen/capistrano_configuration.rb
|
|
95
123
|
- lib/capistrano/hivequeen/deploy.rb
|
|
124
|
+
- lib/capistrano/hivequeen/ec2_instance_connect.rb
|
|
96
125
|
- lib/capistrano/hivequeen/multiio.rb
|
|
97
126
|
- lib/capistrano/hivequeen/setup.rb
|
|
98
127
|
- lib/capistrano/hivequeen/version.rb
|
|
@@ -100,7 +129,7 @@ homepage: http://github.com/kickstarter/capistrano-hivequeen
|
|
|
100
129
|
licenses:
|
|
101
130
|
- MIT
|
|
102
131
|
metadata: {}
|
|
103
|
-
post_install_message:
|
|
132
|
+
post_install_message:
|
|
104
133
|
rdoc_options:
|
|
105
134
|
- "--charset=UTF-8"
|
|
106
135
|
require_paths:
|
|
@@ -116,9 +145,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
116
145
|
- !ruby/object:Gem::Version
|
|
117
146
|
version: '0'
|
|
118
147
|
requirements: []
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
signing_key:
|
|
148
|
+
rubygems_version: 3.3.7
|
|
149
|
+
signing_key:
|
|
122
150
|
specification_version: 2
|
|
123
151
|
summary: Capistrano extensions for interacting with HiveQueen
|
|
124
152
|
test_files: []
|