dpl-connect 1.8.43
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 +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/.travis.yml +36 -0
- data/Gemfile +100 -0
- data/LICENSE +22 -0
- data/README.md +934 -0
- data/Rakefile +1 -0
- data/TESTING.md +29 -0
- data/bin/dpl +5 -0
- data/dpl.gemspec +32 -0
- data/lib/dpl/cli.rb +66 -0
- data/lib/dpl/error.rb +3 -0
- data/lib/dpl/provider.rb +264 -0
- data/lib/dpl/provider/anynines.rb +13 -0
- data/lib/dpl/provider/appfog.rb +21 -0
- data/lib/dpl/provider/atlas.rb +108 -0
- data/lib/dpl/provider/azure_webapps.rb +48 -0
- data/lib/dpl/provider/bintray.rb +509 -0
- data/lib/dpl/provider/bitballoon.rb +22 -0
- data/lib/dpl/provider/bluemix_cloud_foundry.rb +23 -0
- data/lib/dpl/provider/boxfuse.rb +57 -0
- data/lib/dpl/provider/catalyze.rb +49 -0
- data/lib/dpl/provider/chef_supermarket.rb +85 -0
- data/lib/dpl/provider/cloud66.rb +38 -0
- data/lib/dpl/provider/cloud_files.rb +38 -0
- data/lib/dpl/provider/cloud_foundry.rb +43 -0
- data/lib/dpl/provider/code_deploy.rb +123 -0
- data/lib/dpl/provider/deis.rb +119 -0
- data/lib/dpl/provider/divshot.rb +23 -0
- data/lib/dpl/provider/elastic_beanstalk.rb +195 -0
- data/lib/dpl/provider/engine_yard.rb +90 -0
- data/lib/dpl/provider/firebase.rb +27 -0
- data/lib/dpl/provider/gae.rb +97 -0
- data/lib/dpl/provider/gcs.rb +59 -0
- data/lib/dpl/provider/hackage.rb +29 -0
- data/lib/dpl/provider/heroku.rb +18 -0
- data/lib/dpl/provider/heroku/api.rb +98 -0
- data/lib/dpl/provider/heroku/generic.rb +94 -0
- data/lib/dpl/provider/heroku/git.rb +28 -0
- data/lib/dpl/provider/lambda.rb +236 -0
- data/lib/dpl/provider/launchpad.rb +48 -0
- data/lib/dpl/provider/modulus.rb +23 -0
- data/lib/dpl/provider/npm.rb +64 -0
- data/lib/dpl/provider/openshift.rb +59 -0
- data/lib/dpl/provider/ops_works.rb +132 -0
- data/lib/dpl/provider/packagecloud.rb +144 -0
- data/lib/dpl/provider/pages.rb +79 -0
- data/lib/dpl/provider/puppet_forge.rb +43 -0
- data/lib/dpl/provider/pypi.rb +111 -0
- data/lib/dpl/provider/releases.rb +139 -0
- data/lib/dpl/provider/rubygems.rb +51 -0
- data/lib/dpl/provider/s3.rb +123 -0
- data/lib/dpl/provider/scalingo.rb +97 -0
- data/lib/dpl/provider/script.rb +29 -0
- data/lib/dpl/provider/surge.rb +33 -0
- data/lib/dpl/provider/testfairy.rb +190 -0
- data/lib/dpl/provider/transifex.rb +45 -0
- data/lib/dpl/version.rb +3 -0
- data/notes/engine_yard.md +1 -0
- data/notes/heroku.md +3 -0
- data/spec/cli_spec.rb +36 -0
- data/spec/provider/anynines_spec.rb +20 -0
- data/spec/provider/appfog_spec.rb +35 -0
- data/spec/provider/atlas_spec.rb +99 -0
- data/spec/provider/azure_webapps_spec.rb +95 -0
- data/spec/provider/bintray_spec.rb +259 -0
- data/spec/provider/bitballoon_spec.rb +32 -0
- data/spec/provider/bluemixcloudfoundry_spec.rb +23 -0
- data/spec/provider/boxfuse_spec.rb +16 -0
- data/spec/provider/catalyze_spec.rb +39 -0
- data/spec/provider/chef_supermarket_spec.rb +51 -0
- data/spec/provider/cloud66_spec.rb +44 -0
- data/spec/provider/cloud_files_spec.rb +88 -0
- data/spec/provider/cloudfoundry_spec.rb +71 -0
- data/spec/provider/code_deploy_spec.rb +360 -0
- data/spec/provider/deis_spec.rb +116 -0
- data/spec/provider/divshot_spec.rb +28 -0
- data/spec/provider/elastic_beanstalk_spec.rb +209 -0
- data/spec/provider/firebase_spec.rb +40 -0
- data/spec/provider/gae_spec.rb +26 -0
- data/spec/provider/gcs_spec.rb +115 -0
- data/spec/provider/hackage_spec.rb +47 -0
- data/spec/provider/heroku_spec.rb +357 -0
- data/spec/provider/lambda_spec.rb +432 -0
- data/spec/provider/launchpad_spec.rb +33 -0
- data/spec/provider/modulus_spec.rb +29 -0
- data/spec/provider/npm_spec.rb +95 -0
- data/spec/provider/openshift_spec.rb +91 -0
- data/spec/provider/ops_works_spec.rb +127 -0
- data/spec/provider/packagecloud_spec.rb +56 -0
- data/spec/provider/puppet_forge_spec.rb +60 -0
- data/spec/provider/pypi_spec.rb +103 -0
- data/spec/provider/releases_spec.rb +303 -0
- data/spec/provider/rubygems_spec.rb +106 -0
- data/spec/provider/s3_spec.rb +174 -0
- data/spec/provider/scalingo_spec.rb +64 -0
- data/spec/provider/script_spec.rb +26 -0
- data/spec/provider/surge_spec.rb +15 -0
- data/spec/provider/testfairy_spec.rb +86 -0
- data/spec/provider/transifex_spec.rb +110 -0
- data/spec/provider_spec.rb +210 -0
- data/spec/spec_helper.rb +20 -0
- metadata +279 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module DPL
|
|
2
|
+
class Provider
|
|
3
|
+
class BitBalloon < Provider
|
|
4
|
+
requires 'bitballoon'
|
|
5
|
+
|
|
6
|
+
def check_auth
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def needs_key?
|
|
10
|
+
false
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def push_app
|
|
14
|
+
command = 'bitballoon deploy'
|
|
15
|
+
command << " ./#{option(:local_dir)}" if options.fetch(:local_dir,false)
|
|
16
|
+
command << " --site-id=#{option(:site_id)}" if options[:site_id]
|
|
17
|
+
command << " --access-token=#{option(:access_token)}" if options[:access_token]
|
|
18
|
+
context.shell command
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module DPL
|
|
2
|
+
class Provider
|
|
3
|
+
class BluemixCloudFoundry < CloudFoundry
|
|
4
|
+
|
|
5
|
+
REGIONS = Hash.new {"api.ng.bluemix.net"}.update(
|
|
6
|
+
"eu-gb" => "api.eu-gb.bluemix.net",
|
|
7
|
+
"eu-de" => "api.eu-de.bluemix.net",
|
|
8
|
+
"au-syd" => "api.au-syd.bluemix.net"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
def set_api
|
|
12
|
+
region = options[:region] || "ng"
|
|
13
|
+
options[:api] = options[:api] || REGIONS[region]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def check_auth
|
|
17
|
+
set_api
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module DPL
|
|
2
|
+
class Provider
|
|
3
|
+
class Boxfuse < Provider
|
|
4
|
+
|
|
5
|
+
def deploy
|
|
6
|
+
@user = options[:user]
|
|
7
|
+
@secret = options[:secret]
|
|
8
|
+
@configfile = options[:configfile]
|
|
9
|
+
@payload = options[:payload]
|
|
10
|
+
@image = options[:image]
|
|
11
|
+
@env = options[:env]
|
|
12
|
+
@extra_args = options[:extra_args]
|
|
13
|
+
|
|
14
|
+
@param_user = ''
|
|
15
|
+
if @user.to_s != ''
|
|
16
|
+
@param_user = " -user=" + @user
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
@param_secret = ''
|
|
20
|
+
if @secret.to_s != ''
|
|
21
|
+
@param_secret = " -secret=" + @secret
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@param_configfile = ''
|
|
25
|
+
if @configfile.to_s != ''
|
|
26
|
+
@param_configfile = ' "-configfile=' + @configfile + '"'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
@param_payload = ''
|
|
30
|
+
if @payload.to_s != ''
|
|
31
|
+
@param_payload = ' "' + @payload + '"'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
@param_image = ''
|
|
35
|
+
if @image.to_s != ''
|
|
36
|
+
@param_image = " -image=" + @image
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@param_env = ' -env=test'
|
|
40
|
+
if @env.to_s != ''
|
|
41
|
+
@param_env = " -env=" + @env
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
@param_extra_args = ''
|
|
45
|
+
if @extra_args.to_s != ''
|
|
46
|
+
@param_extra_args = " " + @extra_args
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context.shell "curl -L https://files.boxfuse.com/com/boxfuse/client/boxfuse-commandline/latest/boxfuse-commandline-latest-linux-x64.tar.gz | tar xz"
|
|
50
|
+
|
|
51
|
+
@command = "boxfuse/boxfuse run" + @param_user + @param_secret + @param_configfile + @param_payload + @param_image + @param_env + @param_extra_args
|
|
52
|
+
context.fold("Deploying application") { context.shell @command }
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module DPL
|
|
2
|
+
class Provider
|
|
3
|
+
class Catalyze < Provider
|
|
4
|
+
def config
|
|
5
|
+
{
|
|
6
|
+
# the git repository to deploy to
|
|
7
|
+
"target" => options[:target] || context.env['CATALYZE_TARGET'],
|
|
8
|
+
# the pathspec for files to add to git for deployment e.g. your build directory. defaults to all files.
|
|
9
|
+
"path" => options[:path] || context.env['CATALYZE_PATH'] || '.'
|
|
10
|
+
}
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def needs_key?
|
|
14
|
+
false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def check_app
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check_auth
|
|
21
|
+
error "Missing Catalyze target" unless config['target']
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def push_app
|
|
25
|
+
log "Deploying to Catalyze '#{config['target']}'"
|
|
26
|
+
|
|
27
|
+
if options[:skip_cleanup]
|
|
28
|
+
# create commit message
|
|
29
|
+
build_num = context.env["TRAVIS_BUILD_NUMBER"]
|
|
30
|
+
commit = context.env["TRAVIS_COMMIT"]
|
|
31
|
+
repo_slug = context.env["TRAVIS_REPO_SLUG"]
|
|
32
|
+
branch = context.env["TRAVIS_BRANCH"]
|
|
33
|
+
if build_num && commit && repo_slug && branch
|
|
34
|
+
commit_message = "Build ##{build_num} (#{commit}) of #{repo_slug}@#{branch}"
|
|
35
|
+
else
|
|
36
|
+
commit_message = "Local build"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
log "Using build files for deployment"
|
|
40
|
+
context.shell "git checkout HEAD"
|
|
41
|
+
context.shell "git add #{config["path"]} --all --force"
|
|
42
|
+
context.shell "git commit -m \"#{commit_message}\" --quiet"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context.shell "git push --force #{config['target']} HEAD:master"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module DPL
|
|
2
|
+
class Provider
|
|
3
|
+
class ChefSupermarket < Provider
|
|
4
|
+
|
|
5
|
+
# Most of the code is inspired by:
|
|
6
|
+
# https://github.com/opscode/chef/blob/11.16.4/lib/chef/knife/cookbook_site_share.rb
|
|
7
|
+
|
|
8
|
+
# Compatibility with ruby 1.9
|
|
9
|
+
requires 'rack', version: '< 2.0'
|
|
10
|
+
requires 'mime-types', version: '~> 1.16'
|
|
11
|
+
requires 'chef', version: '< 12.0'
|
|
12
|
+
requires 'chef', load: 'chef/config'
|
|
13
|
+
requires 'chef', load: 'chef/cookbook_loader'
|
|
14
|
+
requires 'chef', load: 'chef/cookbook_uploader'
|
|
15
|
+
requires 'chef', load: 'chef/cookbook_site_streaming_uploader'
|
|
16
|
+
|
|
17
|
+
attr_reader :cookbook_name, :cookbook_category
|
|
18
|
+
attr_reader :cookbook
|
|
19
|
+
|
|
20
|
+
def needs_key?
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def check_auth
|
|
25
|
+
error "Missing user_id option" unless options[:user_id]
|
|
26
|
+
error "Missing client_key option" unless options[:client_key]
|
|
27
|
+
::Chef::Config[:client_key] = options[:client_key]
|
|
28
|
+
error "#{options[:client_key]} does not exist" unless ::File.exist?(options[:client_key])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def check_app
|
|
32
|
+
@cookbook_name = options[:cookbook_name] || options[:app]
|
|
33
|
+
@cookbook_category = options[:cookbook_category]
|
|
34
|
+
unless cookbook_category
|
|
35
|
+
error "Missing cookbook_category option\n" +
|
|
36
|
+
"see https://docs.getchef.com/knife_cookbook_site.html#id12"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
log "Validating cookbook #{cookbook_name}"
|
|
40
|
+
# Check that cookbook exist and is valid
|
|
41
|
+
# So we assume cookbook path is '..'
|
|
42
|
+
cl = ::Chef::CookbookLoader.new '..'
|
|
43
|
+
@cookbook = cl[cookbook_name]
|
|
44
|
+
::Chef::CookbookUploader.new(cookbook, '..').validate_cookbooks
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def push_app
|
|
48
|
+
log "Creating cookbook build directory"
|
|
49
|
+
tmp_cookbook_dir = Chef::CookbookSiteStreamingUploader.create_build_dir(cookbook)
|
|
50
|
+
log "Making tarball in #{tmp_cookbook_dir}"
|
|
51
|
+
system("tar -czf #{cookbook_name}.tgz #{cookbook_name}", :chdir => tmp_cookbook_dir)
|
|
52
|
+
|
|
53
|
+
uri = "https://supermarket.chef.io/api/v1/cookbooks"
|
|
54
|
+
|
|
55
|
+
log "Uploading to #{uri}"
|
|
56
|
+
category_string = { 'category'=>cookbook_category }.to_json
|
|
57
|
+
http_resp = ::Chef::CookbookSiteStreamingUploader.post(
|
|
58
|
+
uri,
|
|
59
|
+
options[:user_id],
|
|
60
|
+
options[:client_key],
|
|
61
|
+
{
|
|
62
|
+
:tarball => File.open("#{tmp_cookbook_dir}/#{cookbook_name}.tgz"),
|
|
63
|
+
:cookbook => category_string
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
res = ::Chef::JSONCompat.from_json(http_resp.body)
|
|
67
|
+
if http_resp.code.to_i != 201
|
|
68
|
+
if res['error_messages']
|
|
69
|
+
if res['error_messages'][0] =~ /Version already exists/
|
|
70
|
+
error "The same version of this cookbook already exists on the Opscode Cookbook Site."
|
|
71
|
+
else
|
|
72
|
+
error "#{res['error_messages'][0]}"
|
|
73
|
+
end
|
|
74
|
+
else
|
|
75
|
+
error "Unknown error while sharing cookbook\n" +
|
|
76
|
+
"Server response: #{http_resp.body}"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
log "Upload complete."
|
|
81
|
+
::FileUtils.rm_rf tmp_cookbook_dir
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'net/https'
|
|
3
|
+
|
|
4
|
+
module DPL
|
|
5
|
+
class Provider
|
|
6
|
+
class Cloud66 < Provider
|
|
7
|
+
def needs_key?
|
|
8
|
+
false
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def push_app
|
|
12
|
+
uri = URI.parse(redeployment_hook)
|
|
13
|
+
|
|
14
|
+
response = webhook_call(uri.scheme, uri.host, uri.port, uri.path)
|
|
15
|
+
|
|
16
|
+
error("Redeployment failed [#{response.code}]") if response.code != '200'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def check_auth
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def webhook_call(scheme, host, port, path)
|
|
25
|
+
http = Net::HTTP.new(host, port)
|
|
26
|
+
http.use_ssl = (scheme.downcase == 'https')
|
|
27
|
+
|
|
28
|
+
request = Net::HTTP::Post.new(path)
|
|
29
|
+
|
|
30
|
+
return http.request(request)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def redeployment_hook
|
|
34
|
+
option(:redeployment_hook)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'dpl/provider'
|
|
2
|
+
|
|
3
|
+
module DPL
|
|
4
|
+
class Provider
|
|
5
|
+
class CloudFiles < Provider
|
|
6
|
+
requires 'net-ssh', load: 'net/ssh', version: '~> 2.9.2' # Anything higher requires Ruby 2.x
|
|
7
|
+
requires 'mime-types', load: 'mime/types', version: '~> 2.6.2' # Anything higher requires Ruby 2.x
|
|
8
|
+
requires 'nokogiri', version: '~> 1.6.8.1' # 1.7.0 and up requires Ruby 2.1.0 (via fog-xml)
|
|
9
|
+
requires 'fog-rackspace', load: 'fog/rackspace'
|
|
10
|
+
experimental 'Rackspace Cloud Files'
|
|
11
|
+
|
|
12
|
+
def needs_key?
|
|
13
|
+
false
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def api
|
|
17
|
+
@api ||= Fog::Storage.new(:provider => 'Rackspace', :rackspace_username => option(:username), :rackspace_api_key => option(:api_key), :rackspace_region => option(:region))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def check_auth
|
|
21
|
+
log "Authenticated as #{option(:username)}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def push_app
|
|
25
|
+
container = api.directories.get(option(:container))
|
|
26
|
+
|
|
27
|
+
raise Error, 'The specified container does not exist.' if container.nil?
|
|
28
|
+
|
|
29
|
+
glob_args = ['**/*']
|
|
30
|
+
glob_args << File::FNM_DOTMATCH if options[:dot_match]
|
|
31
|
+
|
|
32
|
+
Dir.glob(*glob_args).each do |name|
|
|
33
|
+
container.files.create(:key => name, :body => File.open(name)) unless File.directory?(name)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module DPL
|
|
2
|
+
class Provider
|
|
3
|
+
class CloudFoundry < Provider
|
|
4
|
+
|
|
5
|
+
def initial_go_tools_install
|
|
6
|
+
context.shell 'test x$TRAVIS_OS_NAME = "xlinux" && rel="linux64-binary" || rel="macosx64"; wget "https://cli.run.pivotal.io/stable?release=${rel}&source=github" -qO cf.tgz && tar -zxvf cf.tgz && rm cf.tgz'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def check_auth
|
|
10
|
+
initial_go_tools_install
|
|
11
|
+
context.shell "./cf api #{option(:api)} #{'--skip-ssl-validation' if options[:skip_ssl_validation]}"
|
|
12
|
+
context.shell "./cf login -u #{option(:username)} -p #{option(:password)} -o #{option(:organization)} -s #{option(:space)}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def check_app
|
|
16
|
+
if options[:manifest]
|
|
17
|
+
error 'Application must have a manifest.yml for unattended deployment' unless File.exists? options[:manifest]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def needs_key?
|
|
22
|
+
false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def push_app
|
|
26
|
+
error 'Failed to push app' unless context.shell("./cf push#{manifest}")
|
|
27
|
+
|
|
28
|
+
ensure
|
|
29
|
+
context.shell "./cf logout"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def cleanup
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def uncleanup
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def manifest
|
|
39
|
+
options[:manifest].nil? ? "" : " -f #{options[:manifest]}"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
module DPL
|
|
4
|
+
class Provider
|
|
5
|
+
class CodeDeploy < Provider
|
|
6
|
+
requires 'aws-sdk', pre: true, version: '~> 2.0'
|
|
7
|
+
|
|
8
|
+
def code_deploy
|
|
9
|
+
@code_deploy ||= Aws::CodeDeploy::Client.new(code_deploy_options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def code_deploy_options
|
|
13
|
+
code_deploy_options = {
|
|
14
|
+
region: options[:region] || 'us-east-1',
|
|
15
|
+
credentials: Aws::Credentials.new(access_key_id, secret_access_key)
|
|
16
|
+
}
|
|
17
|
+
code_deploy_options[:endpoint] = options[:endpoint] if options[:endpoint]
|
|
18
|
+
code_deploy_options
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def access_key_id
|
|
22
|
+
options[:access_key_id] || context.env['AWS_ACCESS_KEY_ID'] || raise(Error, "missing access_key_id")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def secret_access_key
|
|
26
|
+
options[:secret_access_key] || context.env['AWS_SECRET_ACCESS_KEY'] || raise(Error, "missing secret_access_key")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def needs_key?
|
|
30
|
+
false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def revision
|
|
34
|
+
case options[:revision_type].to_s.downcase
|
|
35
|
+
when "s3" then s3_revision
|
|
36
|
+
when "github" then github_revision
|
|
37
|
+
when "" then options[:bucket] ? s3_revision : github_revision
|
|
38
|
+
else error("unknown revision type %p" % options[:revision_type])
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def s3_revision
|
|
43
|
+
{
|
|
44
|
+
revision_type: 'S3',
|
|
45
|
+
s3_location: {
|
|
46
|
+
bucket: option(:bucket),
|
|
47
|
+
bundle_type: bundle_type,
|
|
48
|
+
key: s3_key
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def github_revision
|
|
54
|
+
{
|
|
55
|
+
revision_type: 'GitHub',
|
|
56
|
+
git_hub_location: {
|
|
57
|
+
commit_id: options[:commit_id] || context.env['TRAVIS_COMMIT'] || `git rev-parse HEAD`.strip,
|
|
58
|
+
repository: options[:repository] || context.env['TRAVIS_REPO_SLUG'] || option(:repository)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def push_app
|
|
64
|
+
data = code_deploy.create_deployment({
|
|
65
|
+
revision: revision,
|
|
66
|
+
application_name: options[:application] || option(:application_name),
|
|
67
|
+
deployment_group_name: options[:deployment_group] || option(:deployment_group_name),
|
|
68
|
+
description: options[:description] || default_description
|
|
69
|
+
})
|
|
70
|
+
log "Triggered deployment #{data.deployment_id.inspect}."
|
|
71
|
+
return unless options[:wait_until_deployed]
|
|
72
|
+
print "Deploying "
|
|
73
|
+
deployment = wait_until_deployed(data[:deployment_id])
|
|
74
|
+
print "\n"
|
|
75
|
+
if deployment[:status] == 'Succeeded'
|
|
76
|
+
log "Deployment successful."
|
|
77
|
+
else
|
|
78
|
+
error "Deployment failed."
|
|
79
|
+
end
|
|
80
|
+
rescue Aws::CodeDeploy::Errors::DeploymentLimitExceededException => exception
|
|
81
|
+
error(exception.message)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def wait_until_deployed(deployment_id)
|
|
85
|
+
deployment = {}
|
|
86
|
+
loop do
|
|
87
|
+
result = code_deploy.get_deployment(deployment_id: deployment_id)
|
|
88
|
+
deployment = result[:deployment_info]
|
|
89
|
+
break if deployment[:status] == "Succeeded" || deployment[:status] == "Failed" || deployment[:status] == "Stopped"
|
|
90
|
+
print "."
|
|
91
|
+
sleep 5
|
|
92
|
+
end
|
|
93
|
+
deployment
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def bundle_type
|
|
97
|
+
if s3_key =~ /\.(tar|tgz|zip)$/
|
|
98
|
+
options[:bundle_type] || $1
|
|
99
|
+
else
|
|
100
|
+
option(:bundle_type)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def s3_key
|
|
105
|
+
options[:key] || option(:s3_key)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def default_description
|
|
109
|
+
"Deploy build #{context.env['TRAVIS_BUILD_NUMBER']} via Travis CI"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def check_auth
|
|
113
|
+
log "Logging in with Access Key: #{access_key_id[-4..-1].rjust(20, '*')}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def cleanup
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def uncleanup
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|