travis_dpl_test 2.0.3.beta.4.ror

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +172 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/CONTRIBUTING.md +392 -0
  5. data/Gemfile +32 -0
  6. data/Gemfile.lock +611 -0
  7. data/LICENSE +19 -0
  8. data/README.md +2744 -0
  9. data/Rakefile +210 -0
  10. data/bin/dpl +11 -0
  11. data/config/transliterate.yml +733 -0
  12. data/dpl.gemspec +23 -0
  13. data/lib/dpl/assets/atlas/install +19 -0
  14. data/lib/dpl/assets/convox/install +11 -0
  15. data/lib/dpl/assets/dpl/README.erb.md +138 -0
  16. data/lib/dpl/assets/dpl/git_ssh +8 -0
  17. data/lib/dpl/assets/git/detect_private_key +8 -0
  18. data/lib/dpl/assets/hephy/filter_log +3 -0
  19. data/lib/dpl/assets/pypi/install +4 -0
  20. data/lib/dpl/assets/scalingo/install +6 -0
  21. data/lib/dpl/cli.rb +100 -0
  22. data/lib/dpl/ctx/bash.rb +549 -0
  23. data/lib/dpl/ctx/test.rb +255 -0
  24. data/lib/dpl/ctx.rb +4 -0
  25. data/lib/dpl/helper/assets.rb +38 -0
  26. data/lib/dpl/helper/cmd.rb +169 -0
  27. data/lib/dpl/helper/config_file.rb +49 -0
  28. data/lib/dpl/helper/cookbook_site_streaming_uploader.rb +249 -0
  29. data/lib/dpl/helper/env.rb +92 -0
  30. data/lib/dpl/helper/github.rb +22 -0
  31. data/lib/dpl/helper/interpolate.rb +160 -0
  32. data/lib/dpl/helper/memoize.rb +23 -0
  33. data/lib/dpl/helper/squiggle.rb +24 -0
  34. data/lib/dpl/helper/transliterate.rb +13 -0
  35. data/lib/dpl/helper/wrap.rb +11 -0
  36. data/lib/dpl/helper/zip.rb +71 -0
  37. data/lib/dpl/provider/dsl.rb +410 -0
  38. data/lib/dpl/provider/examples.rb +132 -0
  39. data/lib/dpl/provider/status.rb +61 -0
  40. data/lib/dpl/provider.rb +651 -0
  41. data/lib/dpl/providers/anynines.rb +71 -0
  42. data/lib/dpl/providers/azure_web_apps.rb +63 -0
  43. data/lib/dpl/providers/bintray.rb +324 -0
  44. data/lib/dpl/providers/bluemixcloudfoundry.rb +98 -0
  45. data/lib/dpl/providers/boxfuse.rb +52 -0
  46. data/lib/dpl/providers/cargo.rb +32 -0
  47. data/lib/dpl/providers/chef_supermarket.rb +132 -0
  48. data/lib/dpl/providers/cloud66.rb +46 -0
  49. data/lib/dpl/providers/cloudfiles.rb +62 -0
  50. data/lib/dpl/providers/cloudformation.rb +281 -0
  51. data/lib/dpl/providers/cloudfoundry.rb +89 -0
  52. data/lib/dpl/providers/codedeploy.rb +190 -0
  53. data/lib/dpl/providers/convox.rb +130 -0
  54. data/lib/dpl/providers/datica.rb +64 -0
  55. data/lib/dpl/providers/ecr.rb +129 -0
  56. data/lib/dpl/providers/elasticbeanstalk.rb +207 -0
  57. data/lib/dpl/providers/engineyard.rb +113 -0
  58. data/lib/dpl/providers/firebase.rb +45 -0
  59. data/lib/dpl/providers/flynn.rb +35 -0
  60. data/lib/dpl/providers/gae.rb +78 -0
  61. data/lib/dpl/providers/gcs.rb +132 -0
  62. data/lib/dpl/providers/git_push.rb +273 -0
  63. data/lib/dpl/providers/gleis.rb +74 -0
  64. data/lib/dpl/providers/hackage.rb +53 -0
  65. data/lib/dpl/providers/hephy.rb +107 -0
  66. data/lib/dpl/providers/heroku/api.rb +123 -0
  67. data/lib/dpl/providers/heroku/git.rb +54 -0
  68. data/lib/dpl/providers/heroku.rb +111 -0
  69. data/lib/dpl/providers/lambda.rb +211 -0
  70. data/lib/dpl/providers/launchpad.rb +80 -0
  71. data/lib/dpl/providers/netlify.rb +38 -0
  72. data/lib/dpl/providers/npm.rb +130 -0
  73. data/lib/dpl/providers/nuget.rb +41 -0
  74. data/lib/dpl/providers/openshift.rb +52 -0
  75. data/lib/dpl/providers/opsworks.rb +146 -0
  76. data/lib/dpl/providers/packagecloud.rb_ +194 -0
  77. data/lib/dpl/providers/pages/api.rb +106 -0
  78. data/lib/dpl/providers/pages/git.rb +262 -0
  79. data/lib/dpl/providers/pages.rb +18 -0
  80. data/lib/dpl/providers/puppetforge.rb +50 -0
  81. data/lib/dpl/providers/pypi.rb +125 -0
  82. data/lib/dpl/providers/releases.rb +234 -0
  83. data/lib/dpl/providers/rubygems.rb +97 -0
  84. data/lib/dpl/providers/s3.rb +251 -0
  85. data/lib/dpl/providers/scalingo.rb +69 -0
  86. data/lib/dpl/providers/script.rb +32 -0
  87. data/lib/dpl/providers/snap.rb +68 -0
  88. data/lib/dpl/providers/surge.rb +59 -0
  89. data/lib/dpl/providers/testfairy.rb +101 -0
  90. data/lib/dpl/providers/transifex.rb +72 -0
  91. data/lib/dpl/providers.rb +48 -0
  92. data/lib/dpl/string_ext.rb +23 -0
  93. data/lib/dpl/support/aws_sdk_patch.rb +26 -0
  94. data/lib/dpl/support/gems.rb +73 -0
  95. data/lib/dpl/support/gstore_patch.rb +8 -0
  96. data/lib/dpl/support/version.rb +84 -0
  97. data/lib/dpl/version.rb +5 -0
  98. data/lib/dpl.rb +23 -0
  99. data/status.json +237 -0
  100. metadata +161 -0
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Pages < Provider
6
+ register :pages
7
+
8
+ abstract
9
+
10
+ env :github, :pages
11
+
12
+ opt '--strategy NAME', 'GitHub Pages deployment strategy', default: 'git', enum: %w[api git]
13
+ end
14
+ end
15
+ end
16
+
17
+ require 'dpl/providers/pages/git'
18
+ require 'dpl/providers/pages/api'
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Puppetforge < Provider
6
+ register :puppetforge
7
+
8
+ status :alpha
9
+
10
+ full_name 'Puppet Forge'
11
+
12
+ description sq(<<-STR)
13
+ tbd
14
+ STR
15
+
16
+ gem 'puppet', '~> 7.25', require: 'puppet/face'
17
+ gem 'puppet-blacksmith', '~> 7', require: 'puppet_blacksmith'
18
+
19
+ env :puppetforge
20
+
21
+ opt '--username NAME', 'Puppet Forge user name', required: true, alias: :user
22
+ opt '--password PASS', 'Puppet Forge password', required: true, secret: true
23
+ opt '--url URL', 'Puppet Forge URL to deploy to', default: 'https://forgeapi.puppetlabs.com/'
24
+
25
+ msgs upload: 'Uploading to Puppet Forge %s/%s'
26
+
27
+ def validate
28
+ file.metadata
29
+ end
30
+
31
+ def deploy
32
+ build
33
+ info :upload, forge.username, file.name
34
+ forge.push!(file.name)
35
+ end
36
+
37
+ def file
38
+ @file ||= Blacksmith::Modulefile.new
39
+ end
40
+
41
+ def build
42
+ Puppet::Face['module', :current].build('./')
43
+ end
44
+
45
+ def forge
46
+ @forge ||= Blacksmith::Forge.new(username, password, url)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Pypi < Provider
6
+ register :pypi
7
+
8
+ status :stable
9
+
10
+ full_name 'PyPI'
11
+
12
+ description sq(<<-STR)
13
+ tbd
14
+ STR
15
+
16
+ env :pypi
17
+
18
+ VERSION = /\A\d+(?:\.\d+)*\z/
19
+
20
+ env :pypi
21
+
22
+ opt '--username NAME', 'PyPI Username', required: true, alias: :user
23
+ opt '--password PASS', 'PyPI Password', required: true, secret: true
24
+ opt '--server SERVER', 'Release to a different index', default: 'https://upload.pypi.org/legacy/'
25
+ opt '--distributions DISTS', 'Space-separated list of distributions to be uploaded to PyPI', default: 'sdist'
26
+ opt '--docs_dir DIR', 'Path to the directory to upload documentation from', default: 'build/docs'
27
+ opt '--skip_existing', 'Do not overwrite an existing file with the same name on the server.'
28
+ opt '--upload_docs', 'Upload documentation', default: false, type: :boolean, note: 'most PyPI servers, including upload.pypi.org, do not support uploading documentation'
29
+ opt '--twine_check', 'Whether to run twine check', default: true
30
+ opt '--remove_build_dir', 'Remove the build dir after the upload', default: true
31
+ opt '--setuptools_version VER', format: VERSION
32
+ opt '--twine_version VER', format: VERSION
33
+ opt '--wheel_version VER', format: VERSION
34
+
35
+ msgs login: 'Authenticated as %{username}',
36
+ upload_docs: 'Uploading documentation (skip using "skip_upload_docs: true")'
37
+
38
+ cmds setup_py: 'python setup.py %{distributions}',
39
+ twine_check: 'twine check dist/*',
40
+ twine_upload: 'twine upload %{skip_existing_option} -r pypi dist/*',
41
+ rm_dist: 'rm -rf dist/*',
42
+ upload_docs: 'python setup.py upload_docs %{docs_dir_option} -r %{server}'
43
+
44
+ errs install: 'Failed to install pip, setuptools, twine or wheel.',
45
+ setup_py: 'setup.py failed',
46
+ twine_check: 'Twine check failed',
47
+ twine_upload: 'Twine upload failed.',
48
+ upload_docs: 'Uploading docs failed.'
49
+
50
+ def install
51
+ script :install
52
+ end
53
+
54
+ def login
55
+ write_config
56
+ info :login
57
+ end
58
+
59
+ def setup
60
+ shell :setup_py
61
+ end
62
+
63
+ def validate
64
+ shell :twine_check if twine_check?
65
+ end
66
+
67
+ def deploy
68
+ shell :twine_upload
69
+ upload_docs if upload_docs?
70
+ shell :rm_dist if remove_build_dir?
71
+ end
72
+
73
+ private
74
+
75
+ PYPIRC = sq(<<-RC)
76
+ [distutils]
77
+ index-servers = pypi
78
+ pypi
79
+ [pypi]
80
+ repository: %{server}
81
+ username: %{username}
82
+ password: %{password}
83
+ RC
84
+
85
+ def write_config
86
+ write_file('~/.pypirc', pypirc)
87
+ end
88
+
89
+ def pypirc
90
+ interpolate(PYPIRC, opts, secure: true)
91
+ end
92
+
93
+ def upload_docs
94
+ info :upload_docs
95
+ shell :upload_docs
96
+ end
97
+
98
+ def skip_existing_option
99
+ '--skip-existing' if skip_existing?
100
+ end
101
+
102
+ def docs_dir_option
103
+ "--upload-dir #{docs_dir}" if docs_dir
104
+ end
105
+
106
+ def setuptools_arg
107
+ version_arg(:setuptools)
108
+ end
109
+
110
+ def twine_arg
111
+ version_arg(:twine)
112
+ end
113
+
114
+ def wheel_arg
115
+ version_arg(:wheel)
116
+ end
117
+
118
+ def version_arg(name)
119
+ arg = name.to_s
120
+ arg << "==#{send(:"#{name}_version")}" if send(:"#{name}_version") =~ VERSION
121
+ arg
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,234 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dpl/helper/github'
4
+
5
+ module Dpl
6
+ module Providers
7
+ class Releases < Provider
8
+ include Github
9
+
10
+ register :releases
11
+
12
+ status :stable
13
+
14
+ full_name 'GitHub Releases'
15
+
16
+ description sq(<<-STR)
17
+ tbd
18
+ STR
19
+
20
+ gem 'octokit', '~> 7'
21
+ gem 'mime-types', '~> 3.4.1'
22
+ gem 'public_suffix', '~> 5'
23
+
24
+ env :github, :releases
25
+
26
+ required :token, %i[username password]
27
+
28
+ opt '--token TOKEN', 'GitHub oauth token (needs public_repo or repo permission)', secret: true, alias: :api_key
29
+ opt '--username LOGIN', 'GitHub login name', alias: :user
30
+ opt '--password PASS', 'GitHub password', secret: true
31
+ opt '--repo SLUG', 'GitHub repo slug', default: :repo_slug
32
+ opt '--file GLOB', 'File or glob to release to GitHub', default: '*', type: :array
33
+ opt '--file_glob', 'Interpret files as globs', default: true
34
+ opt '--overwrite', 'Overwrite files with the same name'
35
+ opt '--prerelease', 'Identify the release as a prerelease'
36
+ opt '--release_number NUM', 'Release number (override automatic release detection)'
37
+ opt '--release_notes STR', 'Content for the release notes', alias: :body
38
+ opt '--release_notes_file PATH', 'Path to a file containing the release notes', note: 'will be ignored if --release_notes is given'
39
+ opt '--draft', 'Identify the release as a draft'
40
+ opt '--tag_name TAG', 'Git tag from which to create the release'
41
+ opt '--target_commitish STR', 'Commitish value that determines where the Git tag is created from'
42
+ opt '--name NAME', 'Name for the release'
43
+ # should this have --url, like Pages does?
44
+
45
+ needs :git
46
+
47
+ msgs deploy: 'Deploying to repo: %{slug}',
48
+ local_tag: 'Current tag is: %{local_tag}',
49
+ login: 'Authenticated as %s',
50
+ insufficient_scopes: 'Dpl does not have permission to upload assets. Make sure your token has the repo or public_repo scope.',
51
+ insufficient_perm: 'Release resource not found. Make sure your token belongs to an account which has push permission to this repo.',
52
+ overwrite_existing: 'File %s already exists, overwriting.',
53
+ skip_existing: 'File %s already exists, skipping.',
54
+ upload_file: 'Uploading file %s ...',
55
+ set_tag_name: 'Setting tag_name to %s',
56
+ set_target_commitish: 'Setting target_commitish to %s',
57
+ missing_file: 'File %s does not exist.',
58
+ not_a_file: '%s is not a file, skipping.'
59
+
60
+ cmds git_fetch_tags: 'git fetch --tags'
61
+
62
+ URL = 'https://api.github.com/repos/%s/releases/%s'
63
+
64
+ OCTOKIT_OPTS = %i[
65
+ repo
66
+ name
67
+ body
68
+ prerelease
69
+ release_number
70
+ tag_name
71
+ target_commitish
72
+ ].freeze
73
+
74
+ TIMEOUTS = {
75
+ timeout: 180,
76
+ open_timeout: 180
77
+ }.freeze
78
+
79
+ def validate
80
+ info :deploy
81
+ shell :git_fetch_tags if env_tag.nil?
82
+ info :local_tag
83
+ end
84
+
85
+ def login
86
+ user.login
87
+ info :login, user.login
88
+ error :insufficient_scopes unless sufficient_scopes?
89
+ end
90
+
91
+ def deploy
92
+ upload_files
93
+ api.update_release(url, octokit_opts)
94
+ end
95
+
96
+ def upload_files
97
+ files.each { |file| upload_file(file) }
98
+ end
99
+
100
+ def upload_file(path)
101
+ file = normalize_filename(path)
102
+ asset = asset(file)
103
+ return info :skip_existing, file if asset && !overwrite?
104
+
105
+ delete(asset, file) if asset
106
+ info :upload_file, file
107
+ api.upload_asset(url, path, name: file, content_type: content_type(path))
108
+ end
109
+
110
+ def delete(asset, file)
111
+ info :overwrite_existing, file
112
+ api.delete_release_asset(asset.url)
113
+ end
114
+
115
+ def octokit_opts
116
+ opts = with_tag(self.opts.dup)
117
+ opts = with_target_commitish(opts)
118
+ opts = opts.select { |key, _| OCTOKIT_OPTS.include?(key) }
119
+ compact(opts.merge(body: release_notes, draft: draft?))
120
+ end
121
+ memoize :octokit_opts
122
+
123
+ def with_tag(opts)
124
+ return opts if tag_name? || draft?
125
+
126
+ info :set_tag_name, local_tag
127
+ opts.merge(tag_name: local_tag)
128
+ end
129
+
130
+ def with_target_commitish(opts)
131
+ return opts if target_commitish? || !same_repo?
132
+
133
+ info :set_target_commitish, git_sha
134
+ opts.merge(target_commitish: git_sha)
135
+ end
136
+
137
+ def content_type(file)
138
+ type = MIME::Types.type_for(file).first
139
+ type ||= 'application/octet-stream'
140
+ type.to_s
141
+ end
142
+
143
+ def url
144
+ if release_number?
145
+ format(URL, slug, release_number)
146
+ elsif release
147
+ release.rels[:self].href
148
+ else
149
+ create_release.rels[:self].href
150
+ end
151
+ end
152
+ memoize :url
153
+
154
+ def release
155
+ releases.detect { |release| release.tag_name == local_tag }
156
+ end
157
+
158
+ def create_release
159
+ api.create_release(slug, local_tag, octokit_opts.merge(draft: true))
160
+ rescue Octokit::NotFound
161
+ error :insufficient_perm
162
+ end
163
+
164
+ def local_tag
165
+ env_tag || git_tag
166
+ end
167
+
168
+ def env_tag
169
+ tag = ENV['TRAVIS_TAG']
170
+ tag unless tag.to_s.empty?
171
+ end
172
+
173
+ def sufficient_scopes?
174
+ api.scopes.include?('public_repo') || api.scopes.include?('repo')
175
+ end
176
+
177
+ def slug
178
+ repo || repo_slug
179
+ end
180
+
181
+ def same_repo?
182
+ slug == repo_slug
183
+ end
184
+
185
+ def asset(name)
186
+ api.release_assets(url).detect { |asset| asset.name == name }
187
+ end
188
+
189
+ def release_notes
190
+ super || release_notes_file || nil
191
+ end
192
+
193
+ def release_notes_file
194
+ release_notes_file? && exists?(super) && read(super)
195
+ end
196
+
197
+ def user
198
+ @user ||= api.user
199
+ end
200
+
201
+ def releases
202
+ @releases ||= api.releases(slug)
203
+ end
204
+
205
+ def api
206
+ @api ||= Octokit::Client.new(**creds, auto_paginate: true, connection_options: { request: TIMEOUTS })
207
+ end
208
+
209
+ def creds
210
+ username && password ? { login: username, password: } : { access_token: token }
211
+ end
212
+
213
+ def files
214
+ files = file_glob? ? Dir.glob("{#{file.join(',')}}").uniq : file
215
+ files = files.select { |file| exists?(file) }
216
+ files.select { |file| file?(file) }
217
+ end
218
+
219
+ def exists?(file)
220
+ return true if File.exist?(file)
221
+
222
+ error :missing_file, file
223
+ false
224
+ end
225
+
226
+ def file?(file)
227
+ return true if File.file?(file)
228
+
229
+ warn :not_a_file, file
230
+ false
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dpl
4
+ module Providers
5
+ class Rubygems < Provider
6
+ register :rubygems
7
+
8
+ status :stable
9
+
10
+ description sq(<<-STR)
11
+ tbd
12
+ STR
13
+
14
+ gem 'gems', '~> 1.1.1'
15
+
16
+ env :rubygems
17
+
18
+ required :api_key, %i[username password]
19
+
20
+ opt '--api_key KEY', 'Rubygems api key', secret: true
21
+ opt '--username USER', 'Rubygems user name', alias: :user
22
+ opt '--password PASS', 'Rubygems password', secret: true
23
+ opt '--gem NAME', 'Name of the gem to release', default: :repo_name
24
+ opt '--gemspec FILE', 'Gemspec file to use to build the gem'
25
+ opt '--gemspec_glob GLOB', 'Glob pattern to search for gemspec files when multiple gems are generated in the repository (overrides the gemspec option)'
26
+ opt '--host URL'
27
+
28
+ msgs login_api_key: 'Authenticating with api key %{api_key}',
29
+ login_creds: 'Authenticating with username %{username} and password %{password}',
30
+ setup: 'Setting up host %{host}',
31
+ gem_lookup: 'Looking up gem %{gem} ... ',
32
+ gem_found: 'found.',
33
+ gem_not_found: 'no such gem.',
34
+ gem_push: 'Pushing gem %{gem}'
35
+
36
+ cmds gem_build: 'gem build %{gemspec}'
37
+
38
+ errs gem_build: 'Failed to build %{gemspec}'
39
+
40
+ def setup
41
+ return unless host?
42
+
43
+ info :setup
44
+ Gems.host = host
45
+ end
46
+
47
+ def login
48
+ api_key? ? login_api_key : login_creds
49
+ end
50
+
51
+ def validate
52
+ print :gem_lookup
53
+ name = Gems.info(gem)['name']
54
+ info name ? :gem_found : :gem_not_found
55
+ end
56
+
57
+ def deploy
58
+ build
59
+ push
60
+ end
61
+
62
+ private
63
+
64
+ def login_api_key
65
+ info :login_api_key
66
+ Gems.key = api_key
67
+ end
68
+
69
+ def login_creds
70
+ info :login_creds
71
+ Gems.username = username
72
+ Gems.password = password
73
+ end
74
+
75
+ def build
76
+ Dir[gemspec_glob].each do |gemspec|
77
+ shell :gem_build, gemspec: gemspec.whitelist
78
+ end
79
+ end
80
+
81
+ def push
82
+ Dir["#{gem}-*.gem"].each do |file|
83
+ info :gem_push, gem: file.whitelist
84
+ info Gems.push(File.new(file), *[host].compact)
85
+ end
86
+ end
87
+
88
+ def gemspec_glob
89
+ super || "#{gemspec || gem}.gemspec"
90
+ end
91
+
92
+ def gemspec
93
+ super.gsub('.gemspec', '') if gemspec?
94
+ end
95
+ end
96
+ end
97
+ end