capistrano-net_storage-s3 0.3.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65abb23d537b71704d92ba0d0ef36cbe59089bafe8aecda6a81bb531af567fc6
4
- data.tar.gz: b6374a14eb145e0e3e702cf416c2ff794a1333ce6dd88ffc6fe4ad24210f6fca
3
+ metadata.gz: 70af8342361107fa073b2c1dcb2ab36ef8e95b12d16730efdfd19e1490872b98
4
+ data.tar.gz: 3689224a25a2bd3a9ef29d5cd7947f5c6c53e1d0f5ac753b3d97117248496e1b
5
5
  SHA512:
6
- metadata.gz: f39bbcbf009c681222d26ca87981a8117ee52dd46195054b80587ae0aa66335fccf37a2c67583cd60742dec5e2abf6b9361295efbb834c82b3bcc2775ecb65a6
7
- data.tar.gz: 0f1c56c231fb8f176d380bd28216efe8030a6c6aeb881c9022f7d583469871f89c7a091109cab6c94fcbd951931df212bdfeb2535d7e3aa418c323250e798873
6
+ metadata.gz: 35deda7d822adbfe5b8982736399a83a9360022d00366bf12c6441ceb6be9eb8d20ca38f056b94eb70442bf339ffcc6b473550a340b04fd4da28f7118db6e0b2
7
+ data.tar.gz: 7d0d46015d5a8c848458c0aebea094113ca52a1222a15aee04e23dbc724412c80e2f09d8993e05dc790b6174a3dc467c9cb2d6aa3f54b10d74eb1bd10107d328
@@ -0,0 +1,30 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - master
7
+
8
+ pull_request:
9
+
10
+ jobs:
11
+ test:
12
+ runs-on: ubuntu-latest
13
+ name: Ruby ${{ matrix.ruby }}
14
+ strategy:
15
+ matrix:
16
+ ruby:
17
+ - '2.7'
18
+ - '3.0'
19
+ - '3.1'
20
+ - '3.2'
21
+
22
+ steps:
23
+ - uses: actions/checkout@v3
24
+ - name: Set up Ruby
25
+ uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: ${{ matrix.ruby }}
28
+ bundler-cache: true
29
+ - name: Run the default task
30
+ run: bundle exec rake
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## 1.0.0 (2023/08/07)
2
+
3
+ Major Update by @aeroastro
4
+
5
+ Improvement:
6
+
7
+ * `--no-progress` option is passed to `aws cp` to keep console quiet (#7)
8
+ * README.md has been changed not to `require 'capistrano-net_storage-s3` by bundler (#8)
9
+ * Major improvement for `Capistrano::NetStorage` version 1.0.0 (#9, #10, #11)
10
+ * GitHub Actions has been introduced (#12)
11
+
1
12
  ## 0.2.3 (2017/5/10)
2
13
 
3
14
  Enhancement:
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/capistrano-net_storage-s3.svg)](https://badge.fury.io/rb/capistrano-net_storage-s3)
2
- [![Build Status](https://travis-ci.org/DeNADev/capistrano-net_storage-s3.svg?branch=master)](https://travis-ci.org/DeNADev/capistrano-net_storage-s3)
2
+ [![Test](https://github.com/DeNADev/capistrano-net_storage-s3/actions/workflows/test.yml/badge.svg)](https://github.com/DeNADev/capistrano-net_storage-s3/actions/workflows/test.yml?query=branch%3Amaster)
3
3
  # Capistrano::NetStorage::S3
4
4
 
5
5
  **Capistrano::NetStorage::S3** is a transport plugin of
6
6
  [Capistrano::NetStorage](https://github.com/DeNADev/capistrano-net_storage) to deploy application
7
- via [Amazon S3](https://aws.amazon.com/s3/).
7
+ via [Amazon S3](https://aws.amazon.com/s3/).
8
8
  And Capistrano::NetStorage is a plugin of [Capistrano](http://capistranorb.com/).
9
9
 
10
10
  ## Installation
@@ -12,7 +12,7 @@ And Capistrano::NetStorage is a plugin of [Capistrano](http://capistranorb.com/)
12
12
  Add this line to your application's Gemfile:
13
13
 
14
14
  ```ruby
15
- gem 'capistrano-net_storage-s3'
15
+ gem 'capistrano-net_storage-s3', require: false
16
16
  ```
17
17
 
18
18
  And then execute:
@@ -27,21 +27,32 @@ Or install it yourself as:
27
27
 
28
28
  Set Capistrano variables by `set name, value`.
29
29
 
30
+ #### General Settings
31
+
32
+ Name | Default | Description
33
+ ------|---------|------------
34
+ `:net_storage_transport` | NO DEFAULT | Set `Capistrano::NetStorage::S3::Transport`
35
+ `:net_storage_s3_bucket` | NO DEFAULT | S3 bucket name (e.g. `"your-bucket-name"` )
36
+ `:net_storage_s3_archives_directory` | `"/"` | Directory for application archives in S3 bucket
37
+
38
+ #### Settings for AWS
39
+
30
40
  Name | Default | Description
31
41
  ------|---------|------------
32
- `:scm` | `nil` | Set `:net_storage` for capistrano before v3.7
33
- `:net_storage_transport` | `nil` | Set `Capistrano::NetStorage::S3::Transport`
34
- `:net_storage_s3_broker` | `:aws_cli` | Type of transportation broker
35
42
  `:net_storage_s3_aws_access_key_id` | `ENV['AWS_ACCESS_KEY_ID']` | AWS Access Key ID
36
43
  `:net_storage_s3_aws_secret_access_key` | `ENV['AWS_SECRET_ACCESS_KEY']` | AWS Secret Access Key
37
44
  `:net_storage_s3_aws_session_token` | `ENV['AWS_SESSION_TOKEN']` | AWS Session Token
38
45
  `:net_storage_s3_aws_region` | `ENV['AWS_DEFAULT_REGION']` | AWS Region
39
46
  `:net_storage_s3_aws_profile` | `ENV['AWS_DEFAULT_PROFILE']` | AWS Profile
40
47
  `:net_storage_s3_aws_config_file` | `ENV['AWS_CONFIG_FILE']` | AWS Config File
41
- `:net_storage_s3_bucket` | `nil` | S3 bucket name
42
- `:net_storage_s3_archives_directory` | `nil` | Directory for application archives in S3 bucket
43
- `:net_storage_s3_keep_releases` | `:keep_releases` | Number to keep archives in S3
44
- `:net_storage_s3_max_retry` | `3` | Max retry times for S3 operations
48
+
49
+ #### Other Settings
50
+
51
+ **NOTE: We strongly recommend the defaults for integrity and performance. Change at your own risk.**
52
+
53
+ Name | Default | Description
54
+ ------|---------|------------
55
+ `:net_storage_s3_max_retry` | `3` | Max retry to download from S3 to each servers
45
56
 
46
57
  See also
47
58
  [the configuration section of Capistrano::NetStorage](https://github.com/DeNADev/capistrano-net_storage#configuration).
@@ -58,12 +69,8 @@ require 'capistrano/setup'
58
69
  require 'capistrano/deploy'
59
70
 
60
71
  # Includes tasks from other gems included in your Gemfile
61
- if Gem::Version.new(Capistrano::VERSION) < Gem::Version.new('3.7.0')
62
- require 'capistrano/net_storage'
63
- else
64
- require "capistrano/net_storage/plugin"
65
- install_plugin Capistrano::NetStorage::Plugin
66
- end
72
+ require "capistrano/net_storage/plugin"
73
+ install_plugin Capistrano::NetStorage::Plugin
67
74
 
68
75
  # Load transport plugin for Capistrano::NetStorage
69
76
  require 'capistrano/net_storage/s3'
@@ -72,21 +79,16 @@ require 'capistrano/net_storage/s3'
72
79
  Edit your `config/deploy.rb`:
73
80
 
74
81
  ```ruby
75
- if Gem::Version.new(Capistrano::VERSION) < Gem::Version.new('3.7.0')
76
- set :scm, :net_storage
77
- end
78
82
  set :net_storage_transport, Capistrano::NetStorage::S3::Transport
79
- # set :net_storage_config_files, [your_config_files]
80
- # set :net_storage_with_bundle, true
81
- # set :net_storage_archiver, Capistrano::NetStorage::Archiver::TarGzip
82
- set :net_storage_s3_bucket, 'example-bucket'
83
- # set :net_storage_s3_archives_directory, your_favorite_directory_path
84
- ```
83
+ set :net_storage_config_files, Pathname('path/to/config').glob('*.yml')
85
84
 
86
- ## Example
85
+ # These settings upload archives to s3://bucket-for-deployment/api/#{sha1_hash}.tar.gz
86
+ set :net_storage_s3_bucket, 'bucket-for-deployment'
87
+ set :net_storage_s3_archives_directory 'api'
87
88
 
88
- You can see typical usage of this library by
89
- [capistrano-net_storage_demo](https://github.com/DeNADev/capistrano-net_storage_demo/tree/net_storage-s3).
89
+ set :net_storage_s3_aws_config_file, '~/.aws/config'
90
+ # set :net_storage_s3_aws_profile, 'some-name' # If you are using multiple profiles
91
+ ```
90
92
 
91
93
  ## License
92
94
 
@@ -1,132 +1,67 @@
1
1
  require 'uri'
2
2
 
3
- require 'capistrano/net_storage/s3/base'
4
- require 'capistrano/net_storage/s3/error'
5
- require 'capistrano/net_storage/s3/broker/aws_cli'
6
-
7
3
  class Capistrano::NetStorage::S3
8
4
  class Config
9
- # Broker object for transport operations
10
- # @return [Capistrano::NetStorage::S3::Broker::Base]
11
- def broker
12
- @broker ||= begin
13
- case fetch(:net_storage_s3_broker, :aws_cli)
14
- when :aws_cli
15
- Broker::AwsCLI.new
16
- else
17
- raise Capistrano::NetStorage::S3::Error, "No broker defined! #{fetch(:net_storage_s3_broker)}"
18
- end
19
- end
5
+ def aws_environments
6
+ {
7
+ aws_config_file: aws_config_file,
8
+ aws_default_profile: aws_profile,
9
+ aws_default_region: aws_region,
10
+ aws_access_key_id: aws_access_key_id,
11
+ aws_secret_access_key: aws_secret_access_key,
12
+ aws_session_token: aws_session_token,
13
+ }.compact
20
14
  end
21
15
 
22
- # AWS configurations
23
-
24
- # @return [String] AWS Access Key ID
25
- def aws_access_key_id
26
- @aws_access_key_id ||= fetch(:net_storage_s3_aws_access_key_id, ENV['AWS_ACCESS_KEY_ID'])
16
+ def bucket
17
+ fetch(:net_storage_s3_bucket, -> { raise ArgumentError, ':net_storage_s3_bucket is not configured!' })
27
18
  end
28
19
 
29
- # @return [String] AWS Secret Access Key
30
- def aws_secret_access_key
31
- @aws_secret_access_key ||= fetch(:net_storage_s3_aws_secret_access_key)
32
- @aws_secret_access_key ||= ENV['AWS_SECRET_ACCESS_KEY']
20
+ def archives_url
21
+ URI.parse("s3://#{bucket}") + archives_directory
33
22
  end
34
23
 
35
- # @return [String] AWS Session Token
36
- def aws_session_token
37
- @aws_session_token ||= fetch(:net_storage_s3_aws_session_token, ENV['AWS_SESSION_TOKEN'])
38
- end
24
+ def archive_url
25
+ revision = fetch(:current_revision)
26
+ raise ArgumentError, ':current_revision is not set! Your deployment flow might be buggy.' unless revision
39
27
 
40
- # @return [String] AWS Region
41
- def aws_region
42
- @aws_region ||= fetch(:net_storage_s3_aws_region, ENV['AWS_DEFAULT_REGION'])
28
+ archives_url + "#{revision}.#{Capistrano::NetStorage.config.archive_file_extension}"
43
29
  end
44
30
 
45
- # @return [String] AWS Profile
46
- def aws_profile
47
- @aws_profile ||= fetch(:net_storage_s3_aws_profile, ENV['AWS_DEFAULT_PROFILE'])
48
- end
31
+ private
49
32
 
50
- # AWS Config File
51
- def aws_config_file
52
- @aws_config_file ||= fetch(:net_storage_s3_aws_config_file, ENV['AWS_CONFIG_FILE'])
53
- end
33
+ def archives_directory
34
+ directory = fetch(:net_storage_s3_archives_directory, '/')
54
35
 
55
- # @return [Hash] AWS environment variables
56
- def aws_environments
57
- @aws_environments ||= begin
58
- environments = {}
59
- environments[:aws_config_file] = aws_config_file if aws_config_file
60
- environments[:aws_default_profile] = aws_profile if aws_profile
61
- environments[:aws_default_region] = aws_region if aws_region
62
- environments[:aws_access_key_id] = aws_access_key_id if aws_access_key_id
63
- environments[:aws_secret_access_key] = aws_secret_access_key if aws_secret_access_key
64
- environments[:aws_session_token] = aws_session_token if aws_session_token
65
- environments
66
- end
67
- end
36
+ # Make it absolute directory path from root
37
+ directory = "#{directory}/" unless directory.end_with?('/')
38
+ directory = "/#{directory}" unless directory.start_with?('/')
68
39
 
69
- # S3 bucket name via which one transports application archives
70
- # @return [String]
71
- def bucket
72
- @bucket ||= begin
73
- unless bucket = fetch(:net_storage_s3_bucket)
74
- raise Capistrano::NetStorage::S3::Error, ':net_storage_s3_bucket is not configured!'
75
- end
76
- bucket
77
- end
40
+ directory
78
41
  end
79
42
 
80
- # S3 bucket URL via which one transports application archives
81
- # @return [URI::Generic]
82
- def bucket_url
83
- @bucket_url ||= URI.parse("s3://#{bucket}")
43
+ def aws_access_key_id
44
+ fetch(:net_storage_s3_aws_access_key_id, ENV['AWS_ACCESS_KEY_ID'])
84
45
  end
85
46
 
86
- # Directory path on S3 bucket for application archives
87
- # @return [String]
88
- def archives_directory
89
- # append '/' in case missing
90
- @archives_directory ||= begin
91
- dir = fetch(:net_storage_s3_archives_directory)
92
- dir.sub(%r{[^/]\Z}, '\&/') if dir
93
- end
47
+ def aws_secret_access_key
48
+ fetch(:net_storage_s3_aws_secret_access_key, ENV['AWS_SECRET_ACCESS_KEY'])
94
49
  end
95
50
 
96
- # S3 URL which contains application archives
97
- # @return [URI::Generic]
98
- def archives_url
99
- @archives_url ||= begin
100
- if archives_directory
101
- bucket_url + archives_directory
102
- else
103
- bucket_url
104
- end
105
- end
51
+ def aws_session_token
52
+ fetch(:net_storage_s3_aws_session_token, ENV['AWS_SESSION_TOKEN'])
106
53
  end
107
54
 
108
- # S3 URL of the application archive for current deployment
109
- # @return [URI::Generic]
110
- def archive_url
111
- @archive_url ||= begin
112
- unless revision = fetch(:current_revision)
113
- raise Capistrano::NetStorage::Error, ':current_revision is not set!'
114
- end
115
- archive_file = "#{revision}.#{Capistrano::NetStorage.config.archive_suffix}"
116
- archives_url + archive_file
117
- end
55
+ def aws_region
56
+ fetch(:net_storage_s3_aws_region, ENV['AWS_DEFAULT_REGION'])
118
57
  end
119
58
 
120
- # Max retrial number for S3 operations
121
- # @return [Fixnum]
122
- def max_retry
123
- @max_retry ||= fetch(:net_storage_s3_max_retry, 3)
59
+ def aws_profile
60
+ fetch(:net_storage_s3_aws_profile, ENV['AWS_DEFAULT_PROFILE'])
124
61
  end
125
62
 
126
- # Number to keep archives on S3
127
- # @return [Fixnum]
128
- def s3_keep_releases
129
- @s3_keep_releases ||= fetch(:net_storage_s3_keep_releases, fetch(:keep_releases, 5))
63
+ def aws_config_file
64
+ fetch(:net_storage_s3_aws_config_file, ENV['AWS_CONFIG_FILE'])
130
65
  end
131
66
  end
132
67
  end
@@ -2,16 +2,98 @@ require 'forwardable'
2
2
 
3
3
  require 'capistrano/net_storage/transport/base'
4
4
 
5
- require 'capistrano/net_storage/s3/base'
6
- require 'capistrano/net_storage/s3/config'
5
+ require 'capistrano/net_storage/s3'
7
6
 
8
- class Capistrano::NetStorage::S3::Transport < Capistrano::NetStorage::Transport::Base
9
- extend Forwardable
10
- def_delegators :broker, :check, :find_uploaded, :upload, :download, :cleanup
7
+ module Capistrano
8
+ module NetStorage
9
+ class S3
10
+ class Transport < Capistrano::NetStorage::Transport::Base
11
+ # These values are intentionally separated from config and fixed.
12
+ # If you have trouble with these defaults for 10^2 ~ 10^3 servers, please contact us on GitHub.
13
+ JITTER_DURATION_TO_DOWNLOAD = 4.0
14
+ MAX_RETRY = 3 # TODO: We need to rewrite this for large-scale AWS S3 stability
15
+ KEEP_FILE = '.keep'
11
16
 
12
- private
17
+ def check
18
+ config = Capistrano::NetStorage::S3.config
13
19
 
14
- def broker
15
- Capistrano::NetStorage::S3.broker
20
+ # We check both read and write permissions with aws s3 command
21
+ run_locally_with_aws_env do
22
+ unless test :aws, 's3', 'ls', config.archives_url
23
+ keep = Tempfile.create.path
24
+ execute :aws, 's3', 'cp', keep, config.archives_url + KEEP_FILE
25
+ end
26
+ end
27
+ end
28
+
29
+ def archive_exists?
30
+ config = Capistrano::NetStorage::S3.config
31
+
32
+ run_locally_with_aws_env do
33
+ test :aws, 's3', 'ls', config.archive_url
34
+ end
35
+ end
36
+
37
+ def upload
38
+ config = Capistrano::NetStorage::S3.config
39
+ ns_config = Capistrano::NetStorage.config
40
+
41
+ run_locally_with_aws_env do
42
+ execute :aws, 's3', 'cp', '--no-progress', ns_config.local_archive_path, config.archive_url
43
+ end
44
+ end
45
+
46
+ def download
47
+ config = Capistrano::NetStorage::S3.config
48
+ ns_config = Capistrano::NetStorage.config
49
+
50
+ on release_roles(:all), in: :groups, limit: ns_config.max_parallels do
51
+ Retryable.retryable(tries: MAX_RETRY, sleep: 0.1) do
52
+ within releases_path do
53
+ with(config.aws_environments) do
54
+ sleep Random.rand(JITTER_DURATION_TO_DOWNLOAD)
55
+ execute :aws, 's3', 'cp', '--no-progress', config.archive_url, ns_config.archive_path
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ def cleanup
63
+ config = Capistrano::NetStorage::S3.config
64
+ ns_config = Capistrano::NetStorage.config
65
+
66
+ files = run_locally_with_aws_env do
67
+ capture :aws, 's3', 'ls', config.archives_url
68
+ end.lines.sort.map { |line| line.chomp.split(' ').last }
69
+ releases = files - [KEEP_FILE]
70
+
71
+ if releases.count > ns_config.keep_remote_archives
72
+ run_locally_with_aws_env do
73
+ info "Keeping #{ns_config.keep_remote_archives} of #{releases.count} in #{config.archives_url}"
74
+ (releases - releases.last(ns_config.keep_remote_archives)).each do |release|
75
+ execute :aws, 's3', 'rm', config.archives_url + release
76
+ end
77
+ end
78
+ else
79
+ run_locally do
80
+ info "No old archives (keeping newest #{ns_config.keep_remote_archives}) in #{config.archives_url}"
81
+ end
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ def run_locally_with_aws_env(&block)
88
+ config = Capistrano::NetStorage::S3.config
89
+
90
+ run_locally do
91
+ with(config.aws_environments) do
92
+ instance_eval(&block)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
16
98
  end
17
99
  end
@@ -1,5 +1,7 @@
1
- require 'capistrano/net_storage/s3/base'
2
-
3
- class Capistrano::NetStorage::S3
4
- VERSION = '0.3.0'
1
+ module Capistrano
2
+ module NetStorage
3
+ class S3
4
+ VERSION = '1.0.0'
5
+ end
6
+ end
5
7
  end
@@ -1,8 +1,18 @@
1
- require 'capistrano/net_storage/s3/base'
2
- require 'capistrano/net_storage/s3/error'
3
1
  require 'capistrano/net_storage/s3/config'
4
- require 'capistrano/net_storage/s3/broker/aws_cli'
5
2
  require 'capistrano/net_storage/s3/transport'
6
- require 'capistrano/net_storage/s3/version'
3
+
4
+ module Capistrano
5
+ module NetStorage
6
+ class S3
7
+ class << self
8
+ attr_reader :config
9
+
10
+ def setup!(config:)
11
+ @config = config
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
7
17
 
8
18
  Capistrano::NetStorage::S3.setup!(config: Capistrano::NetStorage::S3::Config.new)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano-net_storage-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - progrhyme
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-06-17 00:00:00.000000000 Z
11
+ date: 2023-08-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capistrano-net_storage
@@ -88,9 +88,9 @@ extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
90
  - ".github/PULL_REQUEST_TEMPLATE.md"
91
+ - ".github/workflows/test.yml"
91
92
  - ".gitignore"
92
93
  - ".rspec"
93
- - ".travis.yml"
94
94
  - CHANGELOG.md
95
95
  - Gemfile
96
96
  - LICENSE.txt
@@ -99,11 +99,7 @@ files:
99
99
  - capistrano-net_storage-s3.gemspec
100
100
  - lib/capistrano-net_storage-s3.rb
101
101
  - lib/capistrano/net_storage/s3.rb
102
- - lib/capistrano/net_storage/s3/base.rb
103
- - lib/capistrano/net_storage/s3/broker/aws_cli.rb
104
- - lib/capistrano/net_storage/s3/broker/base.rb
105
102
  - lib/capistrano/net_storage/s3/config.rb
106
- - lib/capistrano/net_storage/s3/error.rb
107
103
  - lib/capistrano/net_storage/s3/transport.rb
108
104
  - lib/capistrano/net_storage/s3/version.rb
109
105
  homepage: https://github.com/DeNADev/capistrano-net_storage-s3
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.6.3
5
- - 2.5.5
6
- - 2.4.6
7
- before_install: gem install bundler
8
- install: bundle install
9
- script: bundle exec rake spec
10
- notifications:
11
- slack:
12
- secure: WFEsKPeewkV6n/LmpsvLbu17nT5AWxVr1yglUjhCEe8OGIukTOpTbdsnhv9ticj0vXNdKZZRQEe4B0BhC8Fn+iPbFLyi1Z4is7dmABVU+b1qSOKIQlCCoPqa8RzYuVPYzMcVs9E1ldVdrQfLXKYoVeFAFeFSzcrf4mmTDrJbHhOXFIp1GYfYnhCIf01R72pcc2sHfWrzL3croIAqVYFiYJlimjQgduqQGVnyQjCeFmERCnnJU4t4VUlDU1gxTi3VYLfUtyUFyo5Kp+msRMbjr7LVuXyv/JplnNX3skG7VYN2nyhL6VuuOMAfCDpDCeCpH5mJcB1xLagide+GgDVYPJMJG419Ao7vCNI+1cl4VojT8aZKOs6vR7AMBSCP6gittrDIWOCuD61fc5HLFBSzL5dD5u2b2AxAUuODohNKigKwY59tE5CePuMycS/wVaFBtZjAKwDJDKU95m8JCtqJGzHQ0mEMKrXKICal9O7GWwEuEV+EnU+yzk+ZqWM6AHpGJ48DSm3pMnlnoPy3SBs4W8tFH+IS18cKBJ795Nj2vdwZFEYUEo0UwZrch/STY0/rPHayts9/7vgzZOIur168kxIw5bDNisPqzMTeNiYECnNLYWBSa0Xqn8mKPu52GVJYW6L0Wa8LRxln6BcNv2DkS+JFjyUC04T5wAdD4ADnQd4=
@@ -1,18 +0,0 @@
1
- require 'forwardable'
2
-
3
- module Capistrano
4
- module NetStorage
5
- class S3
6
- class << self
7
- attr_reader :config
8
-
9
- extend Forwardable
10
- def_delegator :config, :broker
11
- end
12
-
13
- def self.setup!(params)
14
- @config = params[:config]
15
- end
16
- end
17
- end
18
- end
@@ -1,104 +0,0 @@
1
- require 'json'
2
- require 'time'
3
- require 'retryable'
4
-
5
- require 'capistrano/net_storage/s3/base'
6
- require 'capistrano/net_storage/s3/broker/base'
7
-
8
- class Capistrano::NetStorage::S3::Broker::AwsCLI < Capistrano::NetStorage::S3::Broker::Base
9
- def check
10
- execute_aws_s3('ls', config.bucket_url)
11
- end
12
-
13
- def find_uploaded
14
- if capture_aws_s3('ls', config.archive_url)
15
- set :net_storage_uploaded_archive, true
16
- end
17
- rescue SSHKit::StandardError
18
- c = config
19
- run_locally do
20
- info "Archive is not found as #{c.archive_url}"
21
- end
22
- end
23
-
24
- def upload
25
- c = config
26
- ns = net_storage
27
- Retryable.retryable(tries: c.max_retry, sleep: 0.1) do
28
- execute_aws_s3('cp', '--no-progress', ns.local_archive_path, c.archive_url)
29
- end
30
- end
31
-
32
- def download
33
- c = config
34
- ns = net_storage
35
- on ns.servers, in: :groups, limit: ns.max_parallels do
36
- Retryable.retryable(tries: c.max_retry, sleep: 0.1) do
37
- within releases_path do
38
- with(c.aws_environments) do
39
- execute :aws, 's3', 'cp', '--no-progress', c.archive_url, ns.archive_path
40
- end
41
- end
42
- end
43
- end
44
- end
45
-
46
- def cleanup
47
- c = config
48
- list_args = %W(--bucket #{c.bucket} --output json)
49
- if c.archives_directory
50
- list_args += %W(--prefix #{c.archives_directory})
51
- end
52
- output = capture_aws_s3api('list-objects', list_args)
53
- return if output.empty?
54
-
55
- objects = JSON.parse(output)['Contents']
56
- sorted = objects.sort_by { |obj| Time.parse(obj['LastModified']) }
57
- c.s3_keep_releases.times do
58
- break if sorted.empty?
59
- sorted.pop
60
- end
61
- sorted.each do |obj|
62
- delete_args = %W(--bucket #{c.bucket} --key #{obj['Key']})
63
- execute_aws_s3api('delete-object', *delete_args)
64
- end
65
- end
66
-
67
- private
68
-
69
- def execute_aws_s3(cmd, *args)
70
- c = config
71
- run_locally do
72
- with(c.aws_environments) do
73
- execute :aws, 's3', cmd, *args
74
- end
75
- end
76
- end
77
-
78
- def capture_aws_s3(cmd, *args)
79
- c = config
80
- run_locally do
81
- with(c.aws_environments) do
82
- capture :aws, 's3', cmd, *args
83
- end
84
- end
85
- end
86
-
87
- def execute_aws_s3api(cmd, *args)
88
- c = config
89
- run_locally do
90
- with(c.aws_environments) do
91
- execute :aws, 's3api', cmd, *args
92
- end
93
- end
94
- end
95
-
96
- def capture_aws_s3api(cmd, *args)
97
- c = config
98
- run_locally do
99
- with(c.aws_environments) do
100
- capture :aws, 's3api', cmd, *args
101
- end
102
- end
103
- end
104
- end
@@ -1,38 +0,0 @@
1
- require 'capistrano/net_storage/s3/base'
2
-
3
- class Capistrano::NetStorage::S3
4
- module Broker
5
- # @abstract
6
- class Base
7
- # @abstract
8
- def check
9
- raise NotImplementedError
10
- end
11
-
12
- # @abstract
13
- def find_uploaded
14
- raise NotImplementedError
15
- end
16
-
17
- # @abstract
18
- def upload
19
- raise NotImplementedError
20
- end
21
-
22
- # @abstract
23
- def download
24
- raise NotImplementedError
25
- end
26
-
27
- private
28
-
29
- def config
30
- Capistrano::NetStorage::S3.config
31
- end
32
-
33
- def net_storage
34
- Capistrano::NetStorage.config
35
- end
36
- end
37
- end
38
- end
@@ -1,6 +0,0 @@
1
- require 'capistrano/net_storage/s3/base'
2
-
3
- class Capistrano::NetStorage::S3
4
- class Error < StandardError
5
- end
6
- end