tomo 0.7.0 → 0.8.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 +4 -4
- data/README.md +11 -8
- data/lib/tomo.rb +1 -0
- data/lib/tomo/configuration.rb +4 -4
- data/lib/tomo/plugin/core.rb +15 -14
- data/lib/tomo/plugin/core/helpers.rb +9 -1
- data/lib/tomo/remote.rb +2 -13
- data/lib/tomo/runtime.rb +1 -0
- data/lib/tomo/runtime/template_not_found_error.rb +11 -0
- data/lib/tomo/task_api.rb +59 -0
- data/lib/tomo/task_library.rb +1 -37
- data/lib/tomo/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9fc9bfe01816992c55105b084e6c9ed40c9f7aa9070e833feebfe4084a66194
|
4
|
+
data.tar.gz: be42304890a78153df0cd9589f4c7e01afbbfe1f8fa077ab2d3c879893eab2fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e34a45b62184a909bfb6d6825110aa56924249acb263f5469e7c470b0393255e73b8a7e40b8aec88a09af8d722edfa4a5fc2d8db49e488039f9f1df541cfa09
|
7
|
+
data.tar.gz: cfb514fc60e188e17d81acf2c465608a9b8fce474918a0513f021a1ec02d8817fc997bcb2379bd0a916fabe7baed526737cb0b028d73fa468a7facc67eca7dac
|
data/README.md
CHANGED
@@ -19,6 +19,7 @@ Tomo is a friendly command-line tool for deploying Rails apps. It is a new alter
|
|
19
19
|
|
20
20
|
- [Quick start](#quick-start)
|
21
21
|
- [Usage](#usage)
|
22
|
+
- [Tutorials](#tutorials)
|
22
23
|
- [Reference documentation](#reference-documentation)
|
23
24
|
- [FAQ](#faq)
|
24
25
|
- [Support](#support)
|
@@ -94,7 +95,7 @@ Tomo gives you easy-to-use commands for three common use cases:
|
|
94
95
|
2. `tomo deploy` performs a deployment
|
95
96
|
3. `tomo run` lets you invoke one-off tasks
|
96
97
|
|
97
|
-
|
98
|
+
### Setup
|
98
99
|
|
99
100
|
`tomo setup` prepares the remote host for its first deploy by sequentially running the
|
100
101
|
[setup](https://tomo-deploy.com/configuration#setupblock) list of tasks specified in `.tomo/config.rb`. These tasks typically create directories, initialize data stores, install prerequisite tools, and perform other one-time actions that are necessary before a deploy can take place.
|
@@ -106,7 +107,7 @@ Out of the box, tomo will:
|
|
106
107
|
- Create all necessary deployment directories
|
107
108
|
- Create the Rails database, load the schema, and insert seed data
|
108
109
|
|
109
|
-
|
110
|
+
### Deploy
|
110
111
|
|
111
112
|
Whereas `tomo setup` is typically run once, you can use `tomo deploy` every time you want to deploy a new version of your app. The deploy command will sequentially run the [deploy](https://tomo-deploy.com/configuration#deployblock) list of tasks specified in `.tomo/config.rb`. You can customize this list to meet the needs of your app. By default, tomo runs these tasks:
|
112
113
|
|
@@ -117,7 +118,7 @@ Whereas `tomo setup` is typically run once, you can use `tomo deploy` every time
|
|
117
118
|
5. Restart the app to use the new current release (e.g. [puma:restart](https://tomo-deploy.com/plugins/puma#pumarestart))
|
118
119
|
6. Perform any cleanup (e.g. [bundler:clean](https://tomo-deploy.com/plugins/bundler#bundlerclean))
|
119
120
|
|
120
|
-
|
121
|
+
### Run
|
121
122
|
|
122
123
|
Tomo can also `run` individual remote tasks on demand. You can use the `tasks` command to see the list of tasks tomo knows about.
|
123
124
|
|
@@ -127,7 +128,7 @@ One of the built-in Rails tasks is `rails:console`, which brings up a fully-inte
|
|
127
128
|
|
128
129
|

|
129
130
|
|
130
|
-
|
131
|
+
### Extending tomo
|
131
132
|
|
132
133
|
Tomo has many plugins built-in, but you can easily add your own to extend tomo with custom tasks. By convention, custom plugins are stored in `.tomo/plugins/`. These plugins can define tasks as plain ruby methods. For example:
|
133
134
|
|
@@ -155,6 +156,12 @@ And run it!
|
|
155
156
|
|
156
157
|
Read the [Writing Custom Tasks](https://tomo-deploy.com/tutorials/writing-custom-tasks/) tutorial for an in-depth guide to extending tomo.
|
157
158
|
|
159
|
+
## Tutorials
|
160
|
+
|
161
|
+
- [Deploying Rails From Scratch](https://tomo-deploy.com/tutorials/deploying-rails-from-scratch/)
|
162
|
+
- [Writing Custom Tasks](https://tomo-deploy.com/tutorials/writing-custom-tasks/)
|
163
|
+
- [Publishing a Plugin](https://tomo-deploy.com/tutorials/publishing-a-plugin/) [TODO]
|
164
|
+
|
158
165
|
## Reference documentation
|
159
166
|
|
160
167
|
- [Configuration](https://tomo-deploy.com/configuration/)
|
@@ -173,10 +180,6 @@ Read the [Writing Custom Tasks](https://tomo-deploy.com/tutorials/writing-custom
|
|
173
180
|
- [puma](https://tomo-deploy.com/plugins/puma/)
|
174
181
|
- [rails](https://tomo-deploy.com/plugins/rails/)
|
175
182
|
- [rbenv](https://tomo-deploy.com/plugins/rbenv/)
|
176
|
-
- Tutorials
|
177
|
-
- [Deploying Rails From Scratch](https://tomo-deploy.com/tutorials/deploying-rails-from-scratch/)
|
178
|
-
- [Writing Custom Tasks](https://tomo-deploy.com/tutorials/writing-custom-tasks/)
|
179
|
-
- [Publishing a Plugin](https://tomo-deploy.com/tutorials/publishing-a-plugin/) [TODO]
|
180
183
|
- API
|
181
184
|
- [Host](https://tomo-deploy.com/api/Host/)
|
182
185
|
- [Logger](https://tomo-deploy.com/api/Logger/)
|
data/lib/tomo.rb
CHANGED
data/lib/tomo/configuration.rb
CHANGED
@@ -20,7 +20,7 @@ module Tomo
|
|
20
20
|
config_rb = IO.read(path)
|
21
21
|
|
22
22
|
new.tap do |config|
|
23
|
-
config.
|
23
|
+
config.path = File.expand_path(path)
|
24
24
|
DSL::ConfigFile.new(config).instance_eval(config_rb, path.to_s, 1)
|
25
25
|
end
|
26
26
|
rescue StandardError, SyntaxError => e
|
@@ -28,7 +28,7 @@ module Tomo
|
|
28
28
|
end
|
29
29
|
|
30
30
|
attr_accessor :environments, :deploy_tasks, :setup_tasks, :hosts, :plugins,
|
31
|
-
:settings, :task_filter, :
|
31
|
+
:settings, :task_filter, :path
|
32
32
|
|
33
33
|
def initialize
|
34
34
|
@environments = {}
|
@@ -59,7 +59,7 @@ module Tomo
|
|
59
59
|
setup_tasks: setup_tasks,
|
60
60
|
plugins_registry: plugins_registry,
|
61
61
|
hosts: add_log_prefixes(hosts),
|
62
|
-
settings: settings,
|
62
|
+
settings: { tomo_config_file_path: path }.merge(settings),
|
63
63
|
task_filter: task_filter
|
64
64
|
)
|
65
65
|
end
|
@@ -95,7 +95,7 @@ module Tomo
|
|
95
95
|
|
96
96
|
(["core"] + plugins.uniq).each do |plug|
|
97
97
|
if %w[. /].include?(plug[0])
|
98
|
-
plug = File.expand_path(plug,
|
98
|
+
plug = File.expand_path(plug, File.dirname(path)) unless path.nil?
|
99
99
|
plugins_registry.load_plugin_from_path(plug)
|
100
100
|
else
|
101
101
|
plugins_registry.load_plugin_by_name(plug)
|
data/lib/tomo/plugin/core.rb
CHANGED
@@ -9,20 +9,21 @@ module Tomo::Plugin
|
|
9
9
|
tasks Tomo::Plugin::Core::Tasks
|
10
10
|
|
11
11
|
defaults Tomo::SSH::Options::DEFAULTS.merge(
|
12
|
-
application:
|
13
|
-
concurrency:
|
14
|
-
current_path:
|
15
|
-
deploy_to:
|
16
|
-
keep_releases:
|
17
|
-
linked_dirs:
|
18
|
-
linked_files:
|
19
|
-
local_user:
|
20
|
-
release_json_path:
|
21
|
-
releases_path:
|
22
|
-
revision_log_path:
|
23
|
-
shared_path:
|
24
|
-
tmp_path:
|
25
|
-
|
12
|
+
application: "default",
|
13
|
+
concurrency: 10,
|
14
|
+
current_path: "%<deploy_to>/current",
|
15
|
+
deploy_to: "/var/www/%<application>",
|
16
|
+
keep_releases: 10,
|
17
|
+
linked_dirs: [],
|
18
|
+
linked_files: [],
|
19
|
+
local_user: nil, # determined at runtime
|
20
|
+
release_json_path: "%<release_path>/.tomo_release.json",
|
21
|
+
releases_path: "%<deploy_to>/releases",
|
22
|
+
revision_log_path: "%<deploy_to>/revisions.log",
|
23
|
+
shared_path: "%<deploy_to>/shared",
|
24
|
+
tmp_path: "/tmp/tomo",
|
25
|
+
tomo_config_file_path: nil, # determined at runtime
|
26
|
+
run_args: [] # determined at runtime
|
26
27
|
)
|
27
28
|
end
|
28
29
|
end
|
@@ -12,7 +12,9 @@ module Tomo::Plugin::Core
|
|
12
12
|
result.success?
|
13
13
|
end
|
14
14
|
|
15
|
-
def write(text
|
15
|
+
def write(text: nil, template: nil, to:, append: false, **run_opts)
|
16
|
+
assert_text_or_template_required!(text, template)
|
17
|
+
text = merge_template(template) unless template.nil?
|
16
18
|
message = "Writing #{text.bytesize} bytes to #{to}"
|
17
19
|
run(
|
18
20
|
"echo -n #{text.shellescape} #{append ? '>>' : '>'} #{to.shellescape}",
|
@@ -61,5 +63,11 @@ module Tomo::Plugin::Core
|
|
61
63
|
def flag?(flag, path, **run_opts)
|
62
64
|
run?("[ #{flag} #{path.to_s.shellescape} ]", **run_opts)
|
63
65
|
end
|
66
|
+
|
67
|
+
def assert_text_or_template_required!(text, template)
|
68
|
+
return if text.nil? ^ template.nil?
|
69
|
+
|
70
|
+
raise ArgumentError, "specify text: or template:"
|
71
|
+
end
|
64
72
|
end
|
65
73
|
end
|
data/lib/tomo/remote.rb
CHANGED
@@ -2,6 +2,8 @@ require "forwardable"
|
|
2
2
|
|
3
3
|
module Tomo
|
4
4
|
class Remote
|
5
|
+
include TaskAPI
|
6
|
+
|
5
7
|
extend Forwardable
|
6
8
|
def_delegators :ssh, :close, :host
|
7
9
|
def_delegators :shell_builder, :chdir, :env, :prepend, :umask
|
@@ -33,21 +35,8 @@ module Tomo
|
|
33
35
|
|
34
36
|
private
|
35
37
|
|
36
|
-
def_delegators :context, :paths, :settings
|
37
38
|
attr_reader :context, :ssh, :shell_builder
|
38
39
|
|
39
|
-
def dry_run?
|
40
|
-
Tomo.dry_run?
|
41
|
-
end
|
42
|
-
|
43
|
-
def logger
|
44
|
-
Tomo.logger
|
45
|
-
end
|
46
|
-
|
47
|
-
def raw(str)
|
48
|
-
ShellBuilder.raw(str)
|
49
|
-
end
|
50
|
-
|
51
40
|
def remote
|
52
41
|
self
|
53
42
|
end
|
data/lib/tomo/runtime.rb
CHANGED
@@ -16,6 +16,7 @@ module Tomo
|
|
16
16
|
autoload :SettingsRequiredError, "tomo/runtime/settings_required_error"
|
17
17
|
autoload :TaskAbortedError, "tomo/runtime/task_aborted_error"
|
18
18
|
autoload :TaskRunner, "tomo/runtime/task_runner"
|
19
|
+
autoload :TemplateNotFoundError, "tomo/runtime/template_not_found_error"
|
19
20
|
autoload :UnknownTaskError, "tomo/runtime/unknown_task_error"
|
20
21
|
|
21
22
|
def self.local_user
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require "erb"
|
2
|
+
|
3
|
+
module Tomo
|
4
|
+
module TaskAPI
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def_delegators :context, :paths, :settings
|
10
|
+
|
11
|
+
def die(reason)
|
12
|
+
Runtime::TaskAbortedError.raise_with(
|
13
|
+
reason,
|
14
|
+
task: context.current_task,
|
15
|
+
host: remote.host
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def dry_run?
|
20
|
+
Tomo.dry_run?
|
21
|
+
end
|
22
|
+
|
23
|
+
def logger
|
24
|
+
Tomo.logger
|
25
|
+
end
|
26
|
+
|
27
|
+
def merge_template(path)
|
28
|
+
working_path = paths.tomo_config_file&.dirname
|
29
|
+
if working_path && path.start_with?(".")
|
30
|
+
path = File.expand_path(path, working_path)
|
31
|
+
end
|
32
|
+
|
33
|
+
unless File.file?(path)
|
34
|
+
Runtime::TemplateNotFoundError.raise_with(path: path)
|
35
|
+
end
|
36
|
+
template = IO.read(path)
|
37
|
+
ERB.new(template).result(binding)
|
38
|
+
end
|
39
|
+
|
40
|
+
def raw(string)
|
41
|
+
ShellBuilder.raw(string)
|
42
|
+
end
|
43
|
+
|
44
|
+
def remote
|
45
|
+
context.current_remote
|
46
|
+
end
|
47
|
+
|
48
|
+
def require_setting(*names)
|
49
|
+
missing = names.flatten.select { |sett| settings[sett].nil? }
|
50
|
+
return if missing.empty?
|
51
|
+
|
52
|
+
Runtime::SettingsRequiredError.raise_with(
|
53
|
+
settings: missing,
|
54
|
+
task: context.current_task
|
55
|
+
)
|
56
|
+
end
|
57
|
+
alias require_settings require_setting
|
58
|
+
end
|
59
|
+
end
|
data/lib/tomo/task_library.rb
CHANGED
@@ -2,7 +2,7 @@ require "forwardable"
|
|
2
2
|
|
3
3
|
module Tomo
|
4
4
|
class TaskLibrary
|
5
|
-
|
5
|
+
include TaskAPI
|
6
6
|
|
7
7
|
def initialize(context)
|
8
8
|
@context = context
|
@@ -10,42 +10,6 @@ module Tomo
|
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
def_delegators :context, :paths, :settings
|
14
13
|
attr_reader :context
|
15
|
-
|
16
|
-
def die(reason)
|
17
|
-
Runtime::TaskAbortedError.raise_with(
|
18
|
-
reason,
|
19
|
-
task: context.current_task,
|
20
|
-
host: remote.host
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
def dry_run?
|
25
|
-
Tomo.dry_run?
|
26
|
-
end
|
27
|
-
|
28
|
-
def logger
|
29
|
-
Tomo.logger
|
30
|
-
end
|
31
|
-
|
32
|
-
def raw(string)
|
33
|
-
ShellBuilder.raw(string)
|
34
|
-
end
|
35
|
-
|
36
|
-
def remote
|
37
|
-
context.current_remote
|
38
|
-
end
|
39
|
-
|
40
|
-
def require_setting(*names)
|
41
|
-
missing = names.flatten.select { |sett| settings[sett].nil? }
|
42
|
-
return if missing.empty?
|
43
|
-
|
44
|
-
Runtime::SettingsRequiredError.raise_with(
|
45
|
-
settings: missing,
|
46
|
-
task: context.current_task
|
47
|
-
)
|
48
|
-
end
|
49
|
-
alias require_settings require_setting
|
50
14
|
end
|
51
15
|
end
|
data/lib/tomo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tomo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Brictson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -245,6 +245,7 @@ files:
|
|
245
245
|
- lib/tomo/runtime/settings_required_error.rb
|
246
246
|
- lib/tomo/runtime/task_aborted_error.rb
|
247
247
|
- lib/tomo/runtime/task_runner.rb
|
248
|
+
- lib/tomo/runtime/template_not_found_error.rb
|
248
249
|
- lib/tomo/runtime/unknown_task_error.rb
|
249
250
|
- lib/tomo/script.rb
|
250
251
|
- lib/tomo/shell_builder.rb
|
@@ -260,6 +261,7 @@ files:
|
|
260
261
|
- lib/tomo/ssh/script_error.rb
|
261
262
|
- lib/tomo/ssh/unknown_error.rb
|
262
263
|
- lib/tomo/ssh/unsupported_version_error.rb
|
264
|
+
- lib/tomo/task_api.rb
|
263
265
|
- lib/tomo/task_library.rb
|
264
266
|
- lib/tomo/templates/config.rb.erb
|
265
267
|
- lib/tomo/testing.rb
|