dpl 2.0.0.beta.2 → 2.0.3.beta.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,127 @@
1
+ module Dpl
2
+ module Providers
3
+ class Ecr < Provider
4
+ status :alpha
5
+
6
+ full_name 'AWS ECR'
7
+
8
+ description sq(<<-str)
9
+ tbd
10
+ str
11
+
12
+ gem 'aws-sdk-ecr', '~> 1.0'
13
+ # gem 'docker-api', '~> 1.34'
14
+ gem 'json'
15
+
16
+ env :aws
17
+
18
+ opt '--access_key_id ID', 'AWS access key', required: true, secret: true
19
+ opt '--secret_access_key KEY', 'AWS secret access key', required: true, secret: true
20
+ opt '--account_id ID', 'AWS Account ID', note: 'Required if the repository is owned by a different account than the IAM user'
21
+ opt '--source SOURCE', 'Image to push', note: 'can be the id or the name and optional tag (e.g. mysql:5.6)', required: true
22
+ opt '--target TARGET', 'Comma separated list of partial repository names to push to', eg: 'image-one:tag,image-two', required: true
23
+ opt '--region REGION', 'Comma separated list of regions to push to', default: 'us-east-1'
24
+
25
+ msgs login: 'Using Access Key: %{access_key_id}',
26
+ auth_region: 'Authenticated with %{url}',
27
+ deploy: 'Pushing image %{source} to regions %{regions} as %{targets}',
28
+ image_pushed: 'Pushed image %{source} to region %{region} as %{target}'
29
+
30
+ cmds login: 'docker login -u %{user} -p %{pass} %{url}',
31
+ tag: 'docker tag %{source} %{url}/%{repo}:%{tag}',
32
+ push: 'docker push %{url}/%{repo}'
33
+
34
+ errs unknown_image: 'Image %{source} not found in the local Docker repository'
35
+
36
+ attr_reader :endpoints
37
+
38
+ def login
39
+ info :login
40
+ auth_regions
41
+ end
42
+
43
+ def validate
44
+ # TODO validate the image exists locally
45
+ end
46
+
47
+ def deploy
48
+ info :deploy, regions: regions.join(', '), targets: targets.join(', ')
49
+ regions.product(targets).each do |region, target|
50
+ push(region, target)
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def push(region, target)
57
+ url, repo, tag = endpoints[region], *target.split(':')
58
+ shell :tag, url: url, repo: repo, tag: tag || 'latest'
59
+ shell :push, url: url, repo: repo
60
+ info :image_pushed, region: region, target: target
61
+ end
62
+
63
+ def auth_regions
64
+ @endpoints = regions.map { |region| [region, auth_region(region)] }.to_h
65
+ end
66
+
67
+ def auth_region(region)
68
+ token = auth_token(region)
69
+ user, pass = parse_auth(token.authorization_token)
70
+ url = token.proxy_endpoint
71
+ shell :login, user: user, pass: pass, url: url, echo: false, silent: true
72
+ info :auth_region, url: url
73
+ strip_protocol(url)
74
+ end
75
+
76
+ def auth_token(region)
77
+ ecr(region).get_authorization_token(registry_ids).authorization_data[0]
78
+ end
79
+
80
+ def registry_ids
81
+ account_id? ? { registry_ids: [account_id] } : {}
82
+ end
83
+
84
+ def regions
85
+ # not sure how this was meant to be normalized when being a YAML list
86
+ region.split(',')
87
+ end
88
+
89
+ def targets
90
+ # not sure how this was meant to be normalized when being a YAML list
91
+ target.split(',')
92
+ end
93
+
94
+ def creds
95
+ @creds ||= only(opts, :access_key_id, :secret_access_key)
96
+ end
97
+
98
+ def ecr(region)
99
+ Aws::ECR::Client.new(region: region, **creds)
100
+ end
101
+
102
+ def parse_auth(str)
103
+ user, pass = Base64.decode64(str).split(':')
104
+ [user, pass.chomp]
105
+ end
106
+
107
+ def strip_protocol(url)
108
+ url.sub(/^https?:\/\//, '')
109
+ end
110
+
111
+ def progress(events)
112
+ events.split("\r\n").each do |event|
113
+ event = JSON.parse(event)
114
+ if e = event['error']
115
+ error e
116
+ elsif %w(Preparing Pushing).include?(event['status'])
117
+ nil
118
+ elsif event['id']
119
+ info "#{event['status']} [#{event['id']}]"
120
+ elsif event['status']
121
+ info event['status']
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -8,7 +8,14 @@ module Dpl
8
8
  full_name 'AWS Elastic Beanstalk'
9
9
 
10
10
  description sq(<<-str)
11
- tbd
11
+ Deploy to AWS Elastic Beanstalk: https://aws.amazon.com/elasticbeanstalk/
12
+
13
+ This provider:
14
+
15
+ * Creates a zip file (or uses one you provide)
16
+ * Uploads it to your EB application
17
+ * Optionally deploys to a specific EB environment
18
+ * Optionally waits until the deployment finishes
12
19
  str
13
20
 
14
21
  gem 'aws-sdk-elasticbeanstalk', '~> 1.0'
@@ -23,14 +30,13 @@ module Dpl
23
30
  opt '--secret_access_key KEY', 'AWS Secret Key', required: true, secret: true
24
31
  opt '--region REGION', 'AWS Region the Elastic Beanstalk app is running in', default: 'us-east-1'
25
32
  opt '--app NAME', 'Elastic Beanstalk application name', default: :repo_name
26
- opt '--env NAME', 'Elastic Beanstalk environment name which will be updated', required: true
33
+ opt '--env NAME', 'Elastic Beanstalk environment name to be updated.'
27
34
  opt '--bucket NAME', 'Bucket name to upload app to', required: true, alias: :bucket_name
28
35
  opt '--bucket_path PATH', 'Location within Bucket to upload app to'
29
36
  opt '--description DESC', 'Description for the application version'
30
37
  opt '--label LABEL', 'Label for the application version'
31
- opt '--zip_file PATH', 'The zip file that you want to deploy'
32
- opt '--only_create_app_version', 'Only create the app version, do not actually deploy it'
33
- opt '--wait_until_deployed', 'Wait until the deployment has finished'
38
+ opt '--zip_file PATH', 'The zip file that you want to deploy. If not given, a zipfile will be created from the current directory, honoring .ebignore and .gitignore.'
39
+ opt '--wait_until_deployed', 'Wait until the deployment has finished', requires: :env
34
40
  opt '--wait_until_deployed_timeout SEC', 'How many seconds to wait for Elastic Beanstalk deployment update.', type: :integer, default: 600
35
41
  opt '--debug', internal: true
36
42
 
@@ -56,7 +62,7 @@ module Dpl
56
62
  create_zip unless zip_exists?
57
63
  upload
58
64
  create_version
59
- update_app unless only_create_app_version?
65
+ update_app if env?
60
66
  end
61
67
 
62
68
  def zip_file
@@ -33,7 +33,7 @@ module Dpl
33
33
  opt '--cache_control HEADER', 'HTTP header Cache-Control to suggest that the browser cache the file.', see: 'https://cloud.google.com/storage/docs/xml-api/reference-headers#cachecontrol'
34
34
  opt '--glob GLOB', default: '**/*'
35
35
 
36
- cmds install: 'curl -L %{URL} | tar xz -C ~ && ~/google-cloud-sdk/install.sh --path-update false --usage-reporting false --command-completion false',
36
+ cmds install: 'curl -L %{URL} | tar xz -C ~ && ~/google-cloud-sdk/install.sh --quiet --path-update false --usage-reporting false --command-completion false',
37
37
  login_key: 'gcloud auth activate-service-account --key-file=%{key_file}',
38
38
  rsync: 'gsutil %{gs_opts} rsync %{rsync_opts} %{glob} %{target}',
39
39
  copy: 'gsutil %{gs_opts} cp %{copy_opts} -r %{source} %{target}'
@@ -0,0 +1,269 @@
1
+ module Dpl
2
+ module Providers
3
+ class GitPush < Provider
4
+ register :git_push
5
+
6
+ status :dev
7
+
8
+ full_name 'Git (push)'
9
+
10
+ description sq(<<-str)
11
+ Experimental, generic provider for updating a Git remote branch with
12
+ changes produced by the build, and optionally opening a pull request.
13
+ str
14
+
15
+ gem 'octokit', '~> 4.15.0'
16
+ gem 'public_suffix', '~> 3.0.3'
17
+
18
+ env :github, :git
19
+
20
+ required :token, [:deploy_key, :name, :email]
21
+
22
+ opt '--repo SLUG', 'Repo slug', default: :repo_slug
23
+ opt '--token TOKEN', 'GitHub token with repo permission', secret: true, alias: :github_token
24
+ opt '--deploy_key PATH', 'Path to a file containing a private deploy key with write access to the repository', see: 'https://developer.github.com/v3/guides/managing-deploy-keys/#deploy-keys'
25
+ opt '--branch BRANCH', 'Target branch to push to', required: true
26
+ opt '--base_branch BRANCH', 'Base branch to branch off initially, and (optionally) create a pull request for', default: 'master'
27
+ opt '--name NAME', 'Committer name', note: 'defaults to the GitHub name or login associated with the GitHub token' #, default: :user_name
28
+ opt '--email EMAIL', 'Committer email', note: 'defaults to the GitHub email associated with the GitHub token' #, default: :user_email
29
+ opt '--commit_message MSG', default: 'Update %{base_branch}', interpolate: true
30
+ opt '--allow_empty_commit', 'Allow an empty commit to be created'
31
+ opt '--force', 'Whether to push --force', default: false
32
+ opt '--local_dir DIR', 'Local directory to push', default: '.'
33
+ opt '--pull_request', 'Whether to create a pull request for the given branch'
34
+ opt '--allow_same_branch', 'Whether to allow pushing to the same branch as the current branch', default: false, note: 'setting this to true risks creating infinite build loops, use conditional builds or other mechanisms to prevent build from infinitely triggering more builds'
35
+ opt '--host HOST', default: 'github.com'
36
+ opt '--enterprise', 'Whether to use a GitHub Enterprise API style URL'
37
+
38
+ needs :git
39
+
40
+ msgs login: 'Authenticated as %s',
41
+ invalid_token: 'The provided GitHub token is invalid (error: %s)',
42
+ insufficient_scopes: 'Dpl does not have permission to access %{url} using the provided GitHub token. Please make sure the token have the repo or public_repo scope.',
43
+ same_branch: 'Prevented from pushing to the same branch as the current build branch %{git_branch}. This is meant to prevent infinite build loops. If you do need to push back to the same branch enable `allow_same_branch` and take precautions to prevent infinite loops as needed, for example using conditional builds.',
44
+ setup_deploy_key: 'Moving deploy key %{deploy_key} to %{path}',
45
+ check_deploy_key: 'Checking deploy key',
46
+ setup: 'Source dir: %{src_dir}, branch: %{branch}, base branch: %{base_branch}',
47
+ git_clone: 'Cloning the branch %{branch} to %{work_dir}',
48
+ git_branch: 'Switching to branch %{branch}',
49
+ copy_files: 'Copying %{src_dir} contents to %{work_dir}',
50
+ git_config: 'Configuring git committer to be: %{name} <%{email}>',
51
+ git_push: 'Pushing to %{url} HEAD:%{branch}',
52
+ pr_exists: 'Pull request exists.',
53
+ pr_created: 'Pull request #%{number} created.',
54
+ stop: 'There are no changes to commit, stopping.'
55
+
56
+ cmds git_clone: 'git clone --quiet --branch="%{clone_branch}" "%{remote_url}" . > /dev/null 2>&1',
57
+ git_branch: 'git checkout -b "%{branch}"',
58
+ check_deploy_key: 'ssh -i %{key} -T git@github.com 2>&1 | grep successful > /dev/null',
59
+ copy_files: 'rsync -rl --exclude .git --delete "%{src_dir}/" .',
60
+ git_config_email: 'git config user.email %{quoted_email}',
61
+ git_config_name: 'git config user.name %{quoted_name}',
62
+ git_add: 'git add -A .',
63
+ git_commit_hook: 'cp %{path} .git/hooks/pre-commit',
64
+ git_commit: 'git commit %{git_commit_opts} -q %{git_commit_msg_opts}',
65
+ git_show: 'git show --stat-count=10 HEAD',
66
+ git_push: 'git push %{git_push_opts} --quiet "%{remote_url}" HEAD:"%{branch}" > /dev/null 2>&1'
67
+
68
+ errs copy_files: 'Failed to copy %{src_dir}.',
69
+ check_deploy_key: 'Failed to authenticate using the deploy key',
70
+ git_init: 'Failed to create new git repo',
71
+ git_push: 'Failed to push the build to %{url}:%{branch}'
72
+
73
+ def validate
74
+ error :same_branch if same_branch? && !allow_same_branch?
75
+ end
76
+
77
+ def setup
78
+ info :setup
79
+ info :git_config
80
+ end
81
+
82
+ def login
83
+ token? ? login_token : setup_deploy_key
84
+ end
85
+
86
+ def prepare
87
+ Dir.chdir(work_dir)
88
+ end
89
+
90
+ def deploy
91
+ git_clone
92
+ copy_files
93
+ return info :stop unless git_dirty?
94
+ push
95
+ pull_request if pull_request?
96
+ end
97
+
98
+ def push
99
+ git_config
100
+ git_commit
101
+ git_push
102
+ end
103
+
104
+ def pull_request
105
+ pr_exists? ? info(:pr_exists) : create_pr
106
+ end
107
+
108
+ private
109
+
110
+ def same_branch?
111
+ git_branch == branch
112
+ end
113
+
114
+ def login_token
115
+ return unless github?
116
+ info :login, user.login
117
+ error :insufficient_scopes unless sufficient_scopes?
118
+ rescue Octokit::Unauthorized => e
119
+ error :invalid_token, e.message
120
+ end
121
+
122
+ def setup_deploy_key
123
+ path = '~/.dpl/deploy_key'
124
+ info :setup_deploy_key, path: path
125
+ mv deploy_key, path
126
+ chmod 0600, path
127
+ setup_git_ssh path
128
+ shell :check_deploy_key, key: path
129
+ end
130
+
131
+ def git_clone
132
+ shell :git_clone, echo: false
133
+ shell :git_branch unless branch_exists?
134
+ end
135
+
136
+ def clone_branch
137
+ branch_exists? ? branch : base_branch
138
+ end
139
+
140
+ def copy_files
141
+ shell :copy_files
142
+ end
143
+
144
+ def git_config
145
+ shell :git_config_name, echo: false
146
+ shell :git_config_email, echo: false
147
+ end
148
+
149
+ def branch_exists?
150
+ git_ls_remote?(remote_url, branch)
151
+ end
152
+
153
+ def git_commit
154
+ shell :git_commit_hook, path: asset(:git, :detect_private_key).path, echo: false if deploy_key?
155
+ shell :git_add
156
+ shell :git_commit
157
+ shell :git_show
158
+ end
159
+
160
+ def git_push
161
+ shell :git_push, echo: false
162
+ end
163
+
164
+ def git_push_opts
165
+ '--force' if force?
166
+ end
167
+
168
+ def git_commit_opts
169
+ ' --allow-empty' if allow_empty_commit?
170
+ end
171
+
172
+ def git_commit_msg_opts
173
+ msg = interpolate(commit_message, vars: vars)
174
+ msg.split("\n").reject(&:empty?).map { |msg| %(-m #{quote(msg)}) }
175
+ end
176
+
177
+ def name
178
+ str = super if name?
179
+ str ||= user_name
180
+ str = "#{str} (via Travis CI)" if ENV['TRAVIS'] && !name?
181
+ str
182
+ end
183
+ memoize :name
184
+
185
+ def email
186
+ str = super if email?
187
+ str || user_email
188
+ end
189
+ memoize :email
190
+
191
+ def project_name
192
+ super || repo_slug
193
+ end
194
+
195
+ def remote_url
196
+ token? ? https_url_with_token : git_url
197
+ end
198
+
199
+ def https_url_with_token
200
+ "https://#{token}@#{url}"
201
+ end
202
+
203
+ def git_url
204
+ "git@#{host}:#{slug}.git"
205
+ end
206
+
207
+ def url
208
+ "#{host}/#{slug}.git"
209
+ end
210
+
211
+ def slug
212
+ repo || repo_slug
213
+ end
214
+
215
+ def src_dir
216
+ @src_dir ||= expand(local_dir)
217
+ end
218
+
219
+ def work_dir
220
+ @work_dir ||= tmp_dir
221
+ end
222
+
223
+ def sufficient_scopes?
224
+ scopes.include?('public_repo') || scopes.include?('repo')
225
+ end
226
+
227
+ def user
228
+ @user ||= github.user
229
+ end
230
+
231
+ def user_name
232
+ user.name || user.login
233
+ end
234
+
235
+ def user_email
236
+ user.email
237
+ end
238
+
239
+ def scopes
240
+ @scopes ||= github.scopes
241
+ end
242
+
243
+ def pr_exists?
244
+ !!github.pulls(repo).detect { |pull| pull.head.ref == branch }
245
+ end
246
+
247
+ def create_pr
248
+ pr = github.create_pull_request(repo, base_branch, branch, "Update #{base_branch}")
249
+ info :pr_created, number: pr.number
250
+ end
251
+
252
+ def github?
253
+ host.include?('github') || enterprise?
254
+ end
255
+
256
+ def github
257
+ @github ||= Octokit::Client.new(access_token: token, api_endpoint: api_url, auto_paginate: true)
258
+ end
259
+
260
+ def api_url
261
+ enterprise? ? "https://#{host}/api/v3/" : 'https://api.github.com/'
262
+ end
263
+
264
+ def now
265
+ Time.now
266
+ end
267
+ end
268
+ end
269
+ end
@@ -9,7 +9,7 @@ module Dpl
9
9
  tbd
10
10
  str
11
11
 
12
- gem 'gleis', '~> 0.6.0'
12
+ gem 'gleis', '~> 0.8.0'
13
13
 
14
14
  env :gleis
15
15
 
@@ -32,7 +32,7 @@ module Dpl
32
32
  opt '--subnet_ids IDS', 'List of subnet IDs to be added to the function', type: :array, note: 'Needs the ec2:DescribeSubnets and ec2:DescribeVpcs permission for the user of the access/secret key to work'
33
33
  opt '--security_group_ids IDS', 'List of security group IDs to be added to the function', type: :array, note: 'Needs the ec2:DescribeSecurityGroups and ec2:DescribeVpcs permission for the user of the access/secret key to work'
34
34
  opt '--environment VARS', 'List of Environment Variables to add to the function', type: :array, format: /[\w\-]+=.+/, note: 'Can be encrypted for added security', alias: :environment_variables
35
- opt '--runtime NAME', 'Lambda runtime to use', note: 'required when creating a new function', default: 'nodejs8.10', enum: %w(java8 nodejs8.10 nodejs10.x python2.7 python3.6 python3.7 dotnetcore2.1 go1.x ruby2.5)
35
+ opt '--runtime NAME', 'Lambda runtime to use', note: 'required when creating a new function', default: 'nodejs10.x', enum: %w(nodejs16.x nodejs14.x nodejs12.x nodejs10.x python3.8 python3.7 python3.6 python2.7 ruby2.7 ruby2.5 java11 java8 go1.x dotnetcore2.1)
36
36
  opt '--dead_letter_arn ARN', 'ARN to an SNS or SQS resource used for the dead letter queue.'
37
37
  opt '--kms_key_arn ARN', 'KMS key ARN to use to encrypt environment_variables.'
38
38
  opt '--tracing_mode MODE', 'Tracing mode', default: 'PassThrough', enum: %w(Active PassThrough), note: 'Needs xray:PutTraceSegments xray:PutTelemetryRecords on the role'
@@ -9,6 +9,8 @@ module Dpl
9
9
  tbd
10
10
  str
11
11
 
12
+ node_js '>= 12.0.0'
13
+
12
14
  npm 'netlify-cli', 'netlify'
13
15
 
14
16
  env :netlify
@@ -0,0 +1,39 @@
1
+ module Dpl
2
+ module Providers
3
+ class Nuget < Provider
4
+ status :alpha
5
+
6
+ full_name 'nuget'
7
+
8
+ description sq(<<-str)
9
+ tbd
10
+ str
11
+
12
+ env :nuget, :dotnet
13
+
14
+ opt '--api_key KEY', 'NuGet registry API key', required: true, secret: true, note: 'can be retrieved from your NuGet registry provider', see: 'https://docs.npmjs.com/creating-and-viewing-authentication-tokens'
15
+ opt '--registry URL', 'NuGet registry url', required: true, eg: 'https://www.myget.org/F/org-name/api/v2/package'
16
+ opt '--src SRC', 'The nupkg file(s) to publish', default: '*.nupkg'
17
+ opt '--no_symbols', 'Do not push symbols, even if present'
18
+ opt '--skip_duplicate', 'Do not overwrite existing packages'
19
+
20
+ msgs login: 'Authenticating with API key %{api_key}',
21
+ push: 'Pushing package %{src} to %{registry}'
22
+
23
+ cmds push: 'dotnet nuget push %{src} -k %{api_key} -s %{registry} %{push_opts}'
24
+
25
+ errs push: 'Failed to push'
26
+
27
+ def deploy
28
+ info :login
29
+ shell :push
30
+ end
31
+
32
+ private
33
+
34
+ def push_opts
35
+ opts_for(%i(no_symbols skip_duplicate), dashed: true)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -58,7 +58,7 @@ module Dpl
58
58
  cmds git_clone: 'git clone --quiet --branch="%{target_branch}" --depth=1 "%{remote_url}" . > /dev/null 2>&1',
59
59
  git_init: 'git init .',
60
60
  git_checkout: 'git checkout --orphan "%{target_branch}"',
61
- check_deploy_key: 'ssh -i %{key} -T git@github.com 2>&1 | grep successful > /dev/null',
61
+ check_deploy_key: 'ssh -i %{key} -T git@%{url} 2>&1 | grep successful > /dev/null',
62
62
  copy_files: 'rsync -rl --exclude .git --delete "%{src_dir}/" .',
63
63
  git_config_email: 'git config user.email %{quoted_email}',
64
64
  git_config_name: 'git config user.name %{quoted_name}',
@@ -68,7 +68,7 @@ module Dpl
68
68
  git_commit_hook: 'cp %{path} .git/hooks/pre-commit',
69
69
  git_commit: 'git commit %{git_commit_opts} -q %{git_commit_msg_opts}',
70
70
  git_show: 'git show --stat-count=10 HEAD',
71
- git_push: 'git push%{git_push_opts} --quiet "%{remote_url}" "%{target_branch}":"%{target_branch}" > /dev/null 2>&1'
71
+ git_push: 'git push%{git_push_opts} --quiet "%{remote_url}" "%{target_branch}":"%{target_branch}"'
72
72
 
73
73
  errs copy_files: 'Failed to copy %{src_dir}.',
74
74
  check_deploy_key: 'Failed to authenticate using the deploy key',
@@ -119,7 +119,7 @@ module Dpl
119
119
  mv deploy_key, path
120
120
  chmod 0600, path
121
121
  setup_git_ssh path
122
- shell :check_deploy_key, key: path
122
+ shell :check_deploy_key, key: path, url: opts[:url]
123
123
  end
124
124
 
125
125
  def git_clone?
@@ -155,7 +155,8 @@ module Dpl
155
155
  end
156
156
 
157
157
  def git_push
158
- shell :git_push, echo: false
158
+ shell 'ssh-keygen -lv -f /home/travis/.dpl/deploy_key'
159
+ shell :git_push
159
160
  end
160
161
 
161
162
  def git_status
@@ -11,8 +11,8 @@ module Dpl
11
11
  tbd
12
12
  str
13
13
 
14
- gem 'puppet', '~> 5.5.14', require: 'puppet/face'
15
- gem 'puppet-blacksmith', '~> 3.3.1', require: 'puppet_blacksmith'
14
+ gem 'puppet', '~> 6.26.0', require: 'puppet/face'
15
+ gem 'puppet-blacksmith', '~> 4.1.2', require: 'puppet_blacksmith'
16
16
 
17
17
  env :puppetforge
18
18
 
@@ -31,7 +31,7 @@ module Dpl
31
31
  opt '--file_glob', 'Interpret files as globs', default: true
32
32
  opt '--overwrite', 'Overwrite files with the same name'
33
33
  opt '--prerelease', 'Identify the release as a prerelease'
34
- opt '--release_number NUM', 'Release number (overide automatic release detection)'
34
+ opt '--release_number NUM', 'Release number (override automatic release detection)'
35
35
  opt '--release_notes STR', 'Content for the release notes', alias: :body
36
36
  opt '--release_notes_file PATH', 'Path to a file containing the release notes', note: 'will be ignored if --release_notes is given'
37
37
  opt '--draft', 'Identify the release as a draft'
@@ -70,13 +70,13 @@ module Dpl
70
70
 
71
71
  def build
72
72
  Dir[gemspec_glob].each do |gemspec|
73
- shell :gem_build, gemspec: gemspec.untaint
73
+ shell :gem_build, gemspec: gemspec.whitelist
74
74
  end
75
75
  end
76
76
 
77
77
  def push
78
78
  Dir["#{gem}-*.gem"].each do |file|
79
- info :gem_push, gem: file.untaint
79
+ info :gem_push, gem: file.whitelist
80
80
  info Gems.push(File.new(file), *[host].compact)
81
81
  end
82
82
  end
@@ -3,7 +3,7 @@ module Dpl
3
3
  class Snap < Provider
4
4
  register :snap
5
5
 
6
- status :beta
6
+ status :stable
7
7
 
8
8
  description sq(<<-str)
9
9
  tbd
data/lib/dpl/providers.rb CHANGED
@@ -11,6 +11,7 @@ require 'dpl/providers/cloudfiles'
11
11
  require 'dpl/providers/cloudformation'
12
12
  require 'dpl/providers/cloudfoundry'
13
13
  require 'dpl/providers/codedeploy'
14
+ require 'dpl/providers/ecr'
14
15
  require 'dpl/providers/convox'
15
16
  require 'dpl/providers/elasticbeanstalk'
16
17
  require 'dpl/providers/engineyard'
@@ -18,6 +19,7 @@ require 'dpl/providers/firebase'
18
19
  require 'dpl/providers/flynn'
19
20
  require 'dpl/providers/gae'
20
21
  require 'dpl/providers/gcs'
22
+ require 'dpl/providers/git_push'
21
23
  require 'dpl/providers/gleis'
22
24
  require 'dpl/providers/hackage'
23
25
  require 'dpl/providers/hephy'
@@ -26,6 +28,7 @@ require 'dpl/providers/lambda'
26
28
  require 'dpl/providers/launchpad'
27
29
  require 'dpl/providers/netlify'
28
30
  require 'dpl/providers/npm'
31
+ require 'dpl/providers/nuget'
29
32
  require 'dpl/providers/openshift'
30
33
  require 'dpl/providers/opsworks'
31
34
  require 'dpl/providers/packagecloud'
@@ -0,0 +1,21 @@
1
+ class String
2
+ def whitelist
3
+ @is_whitelisted = true
4
+
5
+ self
6
+ end
7
+
8
+ def whitelisted?
9
+ @is_whitelisted
10
+ end
11
+
12
+ def blacklist
13
+ @is_whitelisted = false
14
+
15
+ self
16
+ end
17
+
18
+ def blacklisted?
19
+ @is_whitelisted.nil? ? false : !@is_whitelisted
20
+ end
21
+ end
data/lib/dpl/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Dpl
2
- VERSION = '2.0.0.beta.2'
2
+ VERSION = '2.0.3.beta.2'
3
3
  end
data/lib/dpl.rb CHANGED
@@ -2,6 +2,7 @@ require 'dpl/cli'
2
2
  require 'dpl/ctx'
3
3
  require 'dpl/provider'
4
4
  require 'dpl/version'
5
+ require 'dpl/string_ext'
5
6
 
6
7
  module Dpl
7
8
  class Error < StandardError