Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 704ff79

Browse files
committed
🆕 ECS deploy CLI setup
1 parent 3efb6f5 commit 704ff79

29 files changed

+731
-319
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
*.gem
22
/Gemfile.lock
3+
/.ruby-version

README.md

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ Simply add the gem to your Gemfile
1414
gem 'ecs-deploy-cli', github: 'monade/ecs-deploy-cli'
1515
```
1616

17+
Or install it globally to use it as a cli:
18+
```bash
19+
$ gem install ecs-deploy-cli
20+
```
21+
1722
## Usage
1823

1924
First, define a ECSFile in your project, to design your ECS cluster.
@@ -102,19 +107,26 @@ cron :scheduled_emails do
102107
end
103108
```
104109

105-
Now create your deploy script:
110+
Now you can run the commands from the CLI.
111+
112+
For instance, you can deploy all services:
113+
```bash
114+
$ ecs-deploy deploy-services
115+
```
116+
117+
You can also use it as an API:
106118
```ruby
107119
require 'ecs_deploy_cli'
108120

109-
configuration = EcsDeployCli::FileParser.load('ECSFile')
121+
parser = EcsDeployCli::DSL::Parser.load('ECSFile')
110122
# This will update all your services and tasks to fit the new configuration
111-
configuration.apply!
123+
runner = EcsDeployCli::Runner.new(parser)
124+
runner.update_services!
112125
```
113126

114127
### TODOs
115128

116129
- Scheduled tasks implementation
130+
- SSH to ec2 instances
117131
- More configuration options
118132
- Create the service if not present
119-
- An actual CLI using Thor
120-
- Specs

bin/ecs-deploy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env ruby
2+
3+
require 'ecs_deploy_cli'
4+
5+
EcsDeployCli::CLI.start(ARGV)

ecs-deploy-cli.gemspec

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,18 @@ Gem::Specification.new do |s|
77
s.name = 'ecs_deploy_cli'
88
s.version = EcsDeployCli::VERSION
99
s.date = '2021-03-31'
10-
s.summary = "A Command line interface to make ECS deploys more simple"
11-
s.description = "A Command line interface to make ECS deploys more simple"
12-
s.authors = ['Mònade']
10+
s.summary = "A command line interface to make ECS deployments easier"
11+
s.description = "Declare your cluster structure in a ECSFile and use the CLI to run deploys and monitor its status."
12+
s.authors = ['Mònade', 'ProGM']
1313
s.email = 'team@monade.io'
1414
s.files = Dir['lib/**/*']
1515
s.test_files = Dir['spec/**/*']
1616
s.required_ruby_version = '>= 2.5.0'
1717
s.homepage = 'https://rubygems.org/gems/ecs_deploy_cli'
1818
s.license = 'MIT'
19+
s.executables << 'ecs-deploy'
1920
s.add_dependency 'activesupport', ['>= 5', '< 7']
21+
s.add_dependency 'thor'
2022
s.add_dependency 'aws-sdk-ecs'
2123
s.add_development_dependency 'rspec', '~> 3'
2224
s.add_development_dependency 'rubocop'

lib/ecs_deploy_cli.rb

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,31 @@
11
require 'yaml'
2+
require 'logger'
3+
require 'thor'
24
require 'aws-sdk-ecs'
35

6+
module EcsDeployCli
7+
def self.logger
8+
@logger ||= begin
9+
logger = Logger.new(STDOUT)
10+
logger.formatter = proc { |severity, datetime, progname, msg|
11+
"#{msg}\n"
12+
}
13+
logger.level = Logger::INFO
14+
logger
15+
end
16+
end
17+
18+
def self.logger=(value)
19+
@logger = value
20+
end
21+
end
22+
423
require 'ecs_deploy_cli/version'
5-
require 'ecs_deploy_cli/auto_options'
6-
require 'ecs_deploy_cli/container'
7-
require 'ecs_deploy_cli/task'
8-
require 'ecs_deploy_cli/cron'
9-
require 'ecs_deploy_cli/service'
10-
require 'ecs_deploy_cli/file_parser'
24+
require 'ecs_deploy_cli/dsl/auto_options'
25+
require 'ecs_deploy_cli/dsl/container'
26+
require 'ecs_deploy_cli/dsl/task'
27+
require 'ecs_deploy_cli/dsl/cron'
28+
require 'ecs_deploy_cli/dsl/service'
29+
require 'ecs_deploy_cli/dsl/parser'
30+
require 'ecs_deploy_cli/runner'
31+
require 'ecs_deploy_cli/cli'

lib/ecs_deploy_cli/auto_options.rb

Lines changed: 0 additions & 15 deletions
This file was deleted.

lib/ecs_deploy_cli/cli.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
module EcsDeployCli
2+
class CLI < Thor
3+
desc "validate", "Validates your ECSFile"
4+
option :file, default: 'ECSFile'
5+
def validate
6+
@parser = load(options[:file])
7+
@parser.validate!
8+
puts "Your ECSFile looks fine! 🎉"
9+
end
10+
11+
desc "version", "Updates all services defined in your ECSFile"
12+
def version
13+
puts "ECS Deploy CLI Version #{EcsDeployCli::VERSION}."
14+
end
15+
16+
desc "deploy-services", "Updates all services defined in your ECSFile"
17+
option :file, default: 'ECSFile'
18+
option :timeout, type: :numeric, default: 500
19+
def deploy_services
20+
@parser = load(options[:file])
21+
runner.update_services! timeout: options[:timeout]
22+
end
23+
24+
desc "deploy-service", "Updates a single service defined in your ECSFile"
25+
option :file, default: 'ECSFile'
26+
option :timeout, type: :numeric, default: 500
27+
def deploy_service(name)
28+
@parser = load(options[:file])
29+
runner.update_services! service: name, timeout: options[:timeout]
30+
end
31+
32+
desc "deploy-scheduled-tasks", "Updates all scheduled tasks defined in your ECSFile"
33+
option :file, default: 'ECSFile'
34+
def deploy_scheduled_tasks
35+
@parser = load(options[:file])
36+
runner.update_crons!
37+
end
38+
39+
desc "ssh", "Connects to ECS instance via SSH"
40+
option :file, default: 'ECSFile'
41+
def ssh
42+
@parser = load(options[:file])
43+
runner.ssh
44+
end
45+
46+
private
47+
48+
def load(file)
49+
EcsDeployCli::DSL::Parser.load(file)
50+
end
51+
52+
def runner
53+
@runner ||= EcsDeployCli::Runner.new(@parser)
54+
end
55+
end
56+
end

lib/ecs_deploy_cli/container.rb

Lines changed: 0 additions & 57 deletions
This file was deleted.

lib/ecs_deploy_cli/cron.rb

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module EcsDeployCli
2+
module DSL
3+
module AutoOptions
4+
def method_missing(name, *args, &block)
5+
if args.count == 1 && !block
6+
_options[name.to_sym] = args.first
7+
else
8+
super
9+
end
10+
end
11+
12+
def _options
13+
@_options ||= {}
14+
end
15+
end
16+
end
17+
end

0 commit comments

Comments
 (0)