faastruby 0.5.8 → 0.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/faastruby/cli/commands/function/deploy_to.rb +6 -6
- data/lib/faastruby/local.rb +1 -0
- data/lib/faastruby/local/functions/function.rb +11 -12
- data/lib/faastruby/local/functions/ruby.rb +10 -0
- data/lib/faastruby/local/listeners/listener.rb +7 -1
- data/lib/faastruby/local/processors/function.rb +24 -2
- data/lib/faastruby/local/static_files/static_file.rb +11 -8
- data/lib/faastruby/server/app.rb +1 -0
- data/lib/faastruby/version.rb +1 -1
- metadata +2 -3
- data/lib/faastruby/server/sentinel.rb +0 -496
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad8d16f69c2faa2730dde9c389f3d2485bbbba81b348ae20bd5f4e6074cd4477
|
4
|
+
data.tar.gz: 0b156a957b0cb34b436353cf0e89f192232b8f01239ec4f41c5ef9e3bb52c97d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3292a49454d2a445d032653569ef201f2365c676ffa7b82c907ba4e3edda2e62043c58e2b2493c0747c96131df94eef1a2d58ae0acbff791c2abdd77881cb981
|
7
|
+
data.tar.gz: b78fdfb6a57e1666579f8ab0330bb4c2cce3872dd18ec1ff41ee69e9f43c09c3ecfe936151bacd15eecae42293c21fca3b03f1c60056b140d2b64a818c617dbe
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.5.9 - Mar 11 2019
|
4
|
+
- Add Gemfile support to Watchdog. When a `Gemfile` is added to a function, Watchdog will initialize it if the file is empty and run `bundle install` every time you modify it.
|
5
|
+
- Watchdog will stream the output of commands instead of printing everything once it's done.
|
6
|
+
- Disable caching for static files on Local
|
7
|
+
|
3
8
|
## 0.5.8 - Mar 11 2019
|
4
9
|
- Bump dependency faastruby-rpc to v0.2.3
|
5
10
|
- Use CSS gradient instead of background picture on Local Web template
|
@@ -42,7 +42,7 @@ module FaaStRuby
|
|
42
42
|
create_or_use_workspace
|
43
43
|
if @yaml_config['serve_static']
|
44
44
|
package_file_name = build_package
|
45
|
-
spinner = say("[#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
|
45
|
+
spinner = say("* [#{@function_name}] Deploying static files '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
|
46
46
|
workspace = FaaStRuby::Workspace.new(name: @workspace_name).deploy(package_file_name)
|
47
47
|
else
|
48
48
|
if ruby_runtime?
|
@@ -53,7 +53,7 @@ module FaaStRuby
|
|
53
53
|
end
|
54
54
|
FaaStRuby::CLI.error("[#{@function_name}] Deploy aborted because 'test_command' exited non-zero.") unless run_tests
|
55
55
|
package_file_name = build_package
|
56
|
-
spinner = say("[#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
|
56
|
+
spinner = say("* [#{@function_name}] Deploying #{runtime_name} function '#{@function_name}' to workspace '#{@workspace_name}'...", quiet: @options['quiet'])
|
57
57
|
workspace = FaaStRuby::Workspace.new(name: @workspace_name).deploy(package_file_name, root_to: @options['root_to'], catch_all: @options['catch_all'], context: @options['context'])
|
58
58
|
end
|
59
59
|
if workspace.errors.any?
|
@@ -107,14 +107,14 @@ module FaaStRuby
|
|
107
107
|
|
108
108
|
def shards_install
|
109
109
|
return true unless File.file?('shard.yml')
|
110
|
-
puts "[#{@function_name}]
|
111
|
-
system('shards check') || system('shards install')
|
110
|
+
puts "[#{@function_name}] Verifying dependencies"
|
111
|
+
system('shards check > /dev/null') || system('shards install')
|
112
112
|
end
|
113
113
|
|
114
114
|
def bundle_install
|
115
115
|
return true unless File.file?('Gemfile')
|
116
|
-
puts "[#{@function_name}]
|
117
|
-
system('bundle check') || system('bundle install')
|
116
|
+
puts "* [#{@function_name}] Verifying dependencies"
|
117
|
+
system('bundle check >/dev/null') || system('bundle install')
|
118
118
|
end
|
119
119
|
|
120
120
|
def missing_args
|
data/lib/faastruby/local.rb
CHANGED
@@ -63,18 +63,17 @@ module FaaStRuby
|
|
63
63
|
def deploy
|
64
64
|
debug "deploy"
|
65
65
|
deploy_cmd, deploy_cmd_print = generate_deploy_command
|
66
|
-
puts "Running: #{deploy_cmd_print.join(' ')}"
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
else
|
74
|
-
puts "* [#{name}] Deploy Failed:"
|
75
|
-
STDERR.puts output
|
66
|
+
puts "Running: #{deploy_cmd_print.join(' ')}".yellow
|
67
|
+
i, oe, thr = Open3.popen2(deploy_cmd.join(' '))
|
68
|
+
i.close
|
69
|
+
oe.each_line do |line|
|
70
|
+
next if line.chomp == '' || line.chomp == '---'
|
71
|
+
STDOUT.puts "#{Time.now} | #{line}"
|
72
|
+
STDOUT.puts "---"
|
76
73
|
end
|
77
|
-
|
74
|
+
thr.join
|
75
|
+
oe.close
|
76
|
+
status = thr.value
|
78
77
|
end
|
79
78
|
|
80
79
|
def language
|
@@ -89,7 +88,7 @@ module FaaStRuby
|
|
89
88
|
def generate_deploy_command
|
90
89
|
debug "generate_deploy_command"
|
91
90
|
project_config = Local.project_config
|
92
|
-
deploy_cmd = ['faastruby', 'deploy-to', Local.workspace, '-f', @absolute_folder, '--dont-create-workspace']
|
91
|
+
deploy_cmd = ['faastruby', 'deploy-to', Local.workspace, '-f', @absolute_folder, '--dont-create-workspace', '--quiet']
|
93
92
|
deploy_cmd << '--set-root' if Local.root_to == @name
|
94
93
|
deploy_cmd << '--set-catch-all' if Local.catch_all == @name
|
95
94
|
secrets_json = Oj.dump(Local.secrets_for_function(@name)) rescue nil
|
@@ -3,6 +3,16 @@ module FaaStRuby
|
|
3
3
|
class RubyFunction < Function
|
4
4
|
include Local::Logger
|
5
5
|
|
6
|
+
def self.default_gemfile
|
7
|
+
faastruby_rpc_version = Gem::DependencyList.from_specs.select{|d| d.name == 'faastruby-rpc'}[0]&.version || '0.2.3'
|
8
|
+
%(source 'https://rubygems.org'
|
9
|
+
|
10
|
+
group :test do
|
11
|
+
gem 'rspec'
|
12
|
+
end
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
6
16
|
def yaml_hash
|
7
17
|
debug "yaml_hash"
|
8
18
|
hash = {
|
@@ -45,12 +45,13 @@ module FaaStRuby
|
|
45
45
|
|
46
46
|
class ListenerEvent
|
47
47
|
include Local::Logger
|
48
|
-
attr_accessor :type, :filename, :full_path, :relative_path, :listened_directory, :dirname
|
48
|
+
attr_accessor :type, :filename, :full_path, :relative_path, :relative_path_dirname, :listened_directory, :dirname
|
49
49
|
def initialize(type:, full_path:, listened_directory:)
|
50
50
|
debug "initialize(type: #{type.inspect}, full_path: #{full_path.inspect}, listened_directory: #{listened_directory.inspect})"
|
51
51
|
@listened_directory = listened_directory
|
52
52
|
@full_path = full_path
|
53
53
|
@relative_path = relative_path_for(@full_path.dup)
|
54
|
+
@relative_path_dirname = File.dirname(@relative_path)
|
54
55
|
@filename = File.basename(@full_path)
|
55
56
|
@dirname = File.dirname(@full_path)
|
56
57
|
@type = type
|
@@ -64,6 +65,11 @@ module FaaStRuby
|
|
64
65
|
added? && filename.match(/^handler\.(rb|cr)$/)
|
65
66
|
end
|
66
67
|
|
68
|
+
def file_is_a_gemfile?
|
69
|
+
debug __method__
|
70
|
+
filename == 'Gemfile'
|
71
|
+
end
|
72
|
+
|
67
73
|
def file_is_a_handler?
|
68
74
|
debug __method__
|
69
75
|
filename.match(/^handler\.(rb|cr)$/)
|
@@ -12,6 +12,7 @@ module FaaStRuby
|
|
12
12
|
debug "ignoring #{event.filename}"
|
13
13
|
return true
|
14
14
|
end
|
15
|
+
return true if event.filename == 'Gemfile.lock'
|
15
16
|
return false
|
16
17
|
end
|
17
18
|
|
@@ -34,7 +35,8 @@ module FaaStRuby
|
|
34
35
|
debug "added: a handler file was added"
|
35
36
|
return new_function(event)
|
36
37
|
end
|
37
|
-
|
38
|
+
init_gemfile(event) if event.file_is_a_gemfile?
|
39
|
+
unless event.file_is_a_function_config? && event.file_is_a_gemfile?
|
38
40
|
debug "added: a file was added"
|
39
41
|
deploy(event)
|
40
42
|
end
|
@@ -45,6 +47,7 @@ module FaaStRuby
|
|
45
47
|
# This should trigger
|
46
48
|
# - Compile
|
47
49
|
# - Deploy
|
50
|
+
bundle_install(event) if event.file_is_a_gemfile?
|
48
51
|
compile_function(event)
|
49
52
|
deploy(event)
|
50
53
|
end
|
@@ -96,7 +99,7 @@ module FaaStRuby
|
|
96
99
|
object = function_object_for_handler(event.filename)
|
97
100
|
function = object.new(
|
98
101
|
absolute_folder: event.dirname,
|
99
|
-
name:
|
102
|
+
name: event.relative_path_dirname,
|
100
103
|
)
|
101
104
|
run(function.name, 'new_function') do
|
102
105
|
debug "+ IGNORE #{event.dirname}"
|
@@ -146,6 +149,25 @@ module FaaStRuby
|
|
146
149
|
run(function.name, 'remove_from_workspace') {function.remove_from_workspace}
|
147
150
|
end
|
148
151
|
|
152
|
+
def bundle_install(event)
|
153
|
+
puts "Running: cd #{event.relative_path_dirname} && bundle install"
|
154
|
+
if system("cd #{event.dirname} && bundle install")
|
155
|
+
STDOUT.puts '---'.yellow
|
156
|
+
puts "Gems from Gemfile '#{event.relative_path}' installed."
|
157
|
+
else
|
158
|
+
STDOUT.puts '---'.red
|
159
|
+
STDOUT.puts "#{Time.now} | Error installing gems for Gemfile '#{event.relative_path}'.".red
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def init_gemfile(event)
|
164
|
+
unless File.size(event.full_path) > 0
|
165
|
+
puts "Initializing Gemfile '#{event.relative_path}'"
|
166
|
+
sleep 0.2
|
167
|
+
File.write(event.full_path, Local::RubyFunction.default_gemfile)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
149
171
|
end
|
150
172
|
end
|
151
173
|
end
|
@@ -29,15 +29,18 @@ module FaaStRuby
|
|
29
29
|
path = "public/#{@relative_path}"
|
30
30
|
cmd = "faastruby cp '#{path}' '#{Local.workspace}:/#{@relative_path}'"
|
31
31
|
puts "Running: #{cmd}"
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
puts "
|
38
|
-
|
32
|
+
i, oe, thr = Open3.popen2(cmd)
|
33
|
+
i.close
|
34
|
+
STDOUT.puts "#{Time.now} | * [#{path}] Uploading file to workspace '#{Local.workspace}'"
|
35
|
+
oe.each_line do |line|
|
36
|
+
next if line.chomp == '' || line.chomp == '---'
|
37
|
+
STDOUT.puts "#{Time.now} | #{line}"
|
38
|
+
STDOUT.puts "---"
|
39
39
|
end
|
40
|
-
|
40
|
+
thr.join
|
41
|
+
oe.close
|
42
|
+
status = thr.value
|
43
|
+
puts "* [#{path}] Error uploading static file '#{path}' to cloud workspace '#{Local.workspace}':" if status.exitstatus != 0
|
41
44
|
end
|
42
45
|
|
43
46
|
def remove_from_workspace
|
data/lib/faastruby/server/app.rb
CHANGED
@@ -14,6 +14,7 @@ module FaaStRuby
|
|
14
14
|
set :root, SERVER_ROOT
|
15
15
|
set :public_folder, FaaStRuby::ProjectConfig.public_dir
|
16
16
|
set :static, true
|
17
|
+
set :static_cache_control, [:must_revalidate, :proxy_revalidate, :max_age => 0]
|
17
18
|
register Sinatra::MultiRoute
|
18
19
|
before do
|
19
20
|
cache_control :must_revalidate, :proxy_revalidate, :max_age => 0
|
data/lib/faastruby/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faastruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paulo Arruda
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -339,7 +339,6 @@ files:
|
|
339
339
|
- lib/faastruby/server/response.rb
|
340
340
|
- lib/faastruby/server/runner.rb
|
341
341
|
- lib/faastruby/server/runner_methods.rb
|
342
|
-
- lib/faastruby/server/sentinel.rb
|
343
342
|
- lib/faastruby/server/subscriber.rb
|
344
343
|
- lib/faastruby/spec_helper.rb
|
345
344
|
- lib/faastruby/supported_runtimes.rb
|
@@ -1,496 +0,0 @@
|
|
1
|
-
# # Here 'function_folder' is the function folder.
|
2
|
-
# require 'open3'
|
3
|
-
# require 'tempfile'
|
4
|
-
# require 'pathname'
|
5
|
-
# require 'yaml'
|
6
|
-
# require 'listen'
|
7
|
-
# require 'colorize'
|
8
|
-
# require 'securerandom'
|
9
|
-
|
10
|
-
# module FaaStRuby
|
11
|
-
# module Sentinel
|
12
|
-
# extend FaaStRuby::Logger::System
|
13
|
-
# STATIC_FILES_SYNC_ENABLED = SYNC_ENABLED && FaaStRuby::ProjectConfig.public_dir?
|
14
|
-
# STOPPER_QUEUE = Queue.new
|
15
|
-
# @@threads = {}
|
16
|
-
# MUTEX = Mutex.new
|
17
|
-
# def self.quit
|
18
|
-
# Process.kill("HUP", FaaStRuby.sentinel_pid)
|
19
|
-
# end
|
20
|
-
|
21
|
-
# def self.add_thread(function_folder, key, value)
|
22
|
-
# MUTEX.synchronize do
|
23
|
-
# @@threads[function_folder] ||= {}
|
24
|
-
# @@threads[function_folder][key] = value
|
25
|
-
# end
|
26
|
-
# end
|
27
|
-
# def self.get_thread(function_folder, key)
|
28
|
-
# MUTEX.synchronize do
|
29
|
-
# return nil if @@threads[function_folder].nil?
|
30
|
-
# @@threads[function_folder][key]
|
31
|
-
# end
|
32
|
-
# end
|
33
|
-
|
34
|
-
# def self.get_threads
|
35
|
-
# MUTEX.synchronize do
|
36
|
-
# @@threads
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
|
40
|
-
# def self.tag
|
41
|
-
# '(Sentinel)'
|
42
|
-
# end
|
43
|
-
|
44
|
-
# def self.try_workspace
|
45
|
-
# puts "#{tag} Connecting to workspace '#{WORKSPACE_NAME}'..."
|
46
|
-
# try_to_create = Proc.new {system("faastruby create-workspace #{WORKSPACE_NAME}")}
|
47
|
-
# has_credentials = system("faastruby list-workspace #{WORKSPACE_NAME} > /dev/null 2>&1")
|
48
|
-
# continue = has_credentials || try_to_create.call
|
49
|
-
# unless continue
|
50
|
-
# puts "[FATAL] Unable to setup project workspace '#{WORKSPACE_NAME}'. Make sure you have the credentials, or try a different environment name.\nExample: faastruby local --sync --deploy-env #{DEPLOY_ENVIRONMENT}-#{(rand * 100).to_i}".red
|
51
|
-
# exit 1
|
52
|
-
# end
|
53
|
-
# true
|
54
|
-
# end
|
55
|
-
|
56
|
-
# def self.watch_for_live_compile(functions)
|
57
|
-
# functions.each do |path|
|
58
|
-
# # puts "Starting live compile for #{path}"
|
59
|
-
# watch_function_for_live_compile(path)
|
60
|
-
# end
|
61
|
-
# end
|
62
|
-
|
63
|
-
# def self.watch_function_for_live_compile(path)
|
64
|
-
# function_folder = File.expand_path path
|
65
|
-
# # FileUtils.rm_f("#{function_folder}/handler")
|
66
|
-
# # FileUtils.rm_f("#{function_folder}/handler.dwarf")
|
67
|
-
# add_thread(function_folder, 'watcher', start_watcher_for(function_folder))
|
68
|
-
# # This will force compile when the server starts
|
69
|
-
# trigger("#{function_folder}/faastruby.yml")
|
70
|
-
# end
|
71
|
-
|
72
|
-
# def self.start_watcher_for(function_folder)
|
73
|
-
# function_name = get_function_name(function_folder)
|
74
|
-
# puts "#{tag} Live compiling enabled for '#{function_name}'."
|
75
|
-
# exclude_from_watcher = [
|
76
|
-
# "#{function_folder}/handler",
|
77
|
-
# "#{function_folder}/handler.dwarf",
|
78
|
-
# "#{function_folder}/.package.zip"
|
79
|
-
# ]
|
80
|
-
# new_watcher_thread(function_folder, exclude_from_watcher, function_name)
|
81
|
-
# end
|
82
|
-
|
83
|
-
# def self.stop_watcher(listener, function_name)
|
84
|
-
# STOPPER_QUEUE << [listener, function_name]
|
85
|
-
# end
|
86
|
-
|
87
|
-
# def self.new_watcher_thread(function_folder, exclude_from_watcher, function_name)
|
88
|
-
# handler_path = get_handler_path_in(function_folder)
|
89
|
-
# listener = Listen.to(function_folder) do |modified, added, removed|
|
90
|
-
# full_path, relative_path, event = translate(modified, added, removed)
|
91
|
-
# next if exclude_from_watcher.include?(full_path)
|
92
|
-
# file_name = File.basename(full_path)
|
93
|
-
# puts "#{tag} Previous Job for '#{function_name}' aborted" if kill_thread_if_alive(function_folder, 'running', function_name)
|
94
|
-
# # puts "#{tag} Event: #{full_path}, #{event}"
|
95
|
-
# if event == :removed && is_a_function?(full_path, function_folder)
|
96
|
-
# puts "#{tag} Disabling watcher for function '#{function_name}'."
|
97
|
-
# stop_watcher(get_thread(function_folder, 'watcher'), function_name)
|
98
|
-
# # listener = get_thread(function_folder, 'watcher')
|
99
|
-
# # listener.stop
|
100
|
-
# # # Thread.current.exit
|
101
|
-
# next
|
102
|
-
# end
|
103
|
-
# add_thread(function_folder, 'running', Thread.new {CrystalBuild.new(function_folder, handler_path, run_before_build: true).start})
|
104
|
-
# end
|
105
|
-
# listener.start
|
106
|
-
# listener
|
107
|
-
# end
|
108
|
-
|
109
|
-
# def self.detect_new_functions(target, language)
|
110
|
-
# puts "#{tag} Watching for new #{language} functions..."
|
111
|
-
# only = /\/handler.rb$/ if language == 'Ruby'
|
112
|
-
# only = /\/handler.cr$/ if language == 'Crystal'
|
113
|
-
# listener = Listen.to(target, only: only) do |modified, added, removed|
|
114
|
-
# full_path, relative_path, event = translate(modified, added, removed)
|
115
|
-
# # Filewatcher.new(target).watch do |full_path, event|
|
116
|
-
# next unless event == :added
|
117
|
-
# file_name = File.basename(full_path)
|
118
|
-
# function_folder = File.dirname(full_path)
|
119
|
-
# function_name = get_function_name(function_folder)
|
120
|
-
# yield(function_folder, file_name, full_path, function_name)
|
121
|
-
# enable_sync_for(function_folder, delay: 1) if SYNC_ENABLED
|
122
|
-
# end
|
123
|
-
# listener.start
|
124
|
-
# listener
|
125
|
-
# end
|
126
|
-
|
127
|
-
# def self.start_crystal(functions)
|
128
|
-
# puts "#{tag} Crystal functions: #{functions}"
|
129
|
-
# enable_sync(functions, delay: 1) if SYNC_ENABLED
|
130
|
-
# watch_for_live_compile(functions) unless SYNC_ENABLED
|
131
|
-
# detect_new_functions(Dir.pwd, 'Crystal') do |function_folder, file, full_path, function_name|
|
132
|
-
# function_folder = normalize_crystal_folder(function_folder)
|
133
|
-
# add_configuration(function_folder, file, full_path)
|
134
|
-
# puts "#{tag} New Crystal function detected at '#{function_name}'."
|
135
|
-
# write_handler(full_path, 'crystal') unless File.size(full_path) > 0
|
136
|
-
# add_thread(function_folder, 'watcher', start_watcher_for(function_folder))
|
137
|
-
# # trigger(full_path)
|
138
|
-
# end
|
139
|
-
# end
|
140
|
-
|
141
|
-
# def self.start_ruby(functions)
|
142
|
-
# puts "#{tag} Ruby functions: #{functions}"
|
143
|
-
# enable_sync(functions) if SYNC_ENABLED
|
144
|
-
# listener = detect_new_functions(Dir.pwd, 'Ruby') do |function_folder, file, full_path, function_name|
|
145
|
-
# add_configuration(function_folder, file, full_path)
|
146
|
-
# puts "#{tag} New Ruby function detected at '#{function_name}'."
|
147
|
-
# write_handler(full_path, 'ruby') unless File.size(full_path) > 0
|
148
|
-
# end
|
149
|
-
# end
|
150
|
-
|
151
|
-
# def self.start_public
|
152
|
-
# puts "#{tag} Watching public folder '#{File.basename(FaaStRuby::ProjectConfig.public_dir)}'..."
|
153
|
-
# add_thread(FaaStRuby::ProjectConfig.public_dir, 'sync', start_public_sync)
|
154
|
-
# end
|
155
|
-
|
156
|
-
# ########################
|
157
|
-
|
158
|
-
# def self.start_public_sync(delay: nil)
|
159
|
-
# sleep delay if delay
|
160
|
-
# public_dir = FaaStRuby::ProjectConfig.public_dir
|
161
|
-
# listener = Listen.to(public_dir) do |modified, added, removed|
|
162
|
-
# full_path, relative_path, event = translate(modified, added, removed)
|
163
|
-
# # puts "FULL_PATH: #{full_path}"
|
164
|
-
# # puts "RELATIVE_PATH: #{relative_path}"
|
165
|
-
# # puts "EVENT: #{event}"
|
166
|
-
# # next if File.directory?(full_path)
|
167
|
-
# file_name = File.basename(full_path)
|
168
|
-
# puts "#{tag} Previous upload of '#{FaaStRuby::ProjectConfig.public_dir(absolute: false)}/#{relative_path}' aborted" if kill_thread_if_alive(full_path, 'deploying', full_path)
|
169
|
-
|
170
|
-
# if event == :removed
|
171
|
-
# cmd = "faastruby rm #{WORKSPACE_NAME}:/#{relative_path}"
|
172
|
-
# puts "#{tag} Running: #{cmd}"
|
173
|
-
# system(cmd)
|
174
|
-
# add_thread(full_path, 'deployed', nil)
|
175
|
-
# next
|
176
|
-
# end
|
177
|
-
# # deploy_cmd, deploy_cmd_print = faastruby_cp(filename)
|
178
|
-
# cmd = "faastruby cp #{full_path} #{WORKSPACE_NAME}:/#{relative_path}"
|
179
|
-
# puts "#{tag} Running: #{cmd}"
|
180
|
-
# add_thread(full_path, 'deploying', Thread.new {system("cd #{SERVER_ROOT} && #{cmd}")})
|
181
|
-
# add_thread(full_path, 'deployed', true)
|
182
|
-
# end
|
183
|
-
# listener.start
|
184
|
-
# listener
|
185
|
-
# end
|
186
|
-
|
187
|
-
# def self.translate(modified, added, removed)
|
188
|
-
# return [modified[0], relative_path_for(modified[0].dup), :modified] if modified.any?
|
189
|
-
# return [added[0], relative_path_for(added[0].dup), :added] if added.any?
|
190
|
-
# return [removed[0], relative_path_for(removed[0].dup), :removed] if removed.any?
|
191
|
-
# end
|
192
|
-
|
193
|
-
# # def self.final_path_and_subject(full_path)
|
194
|
-
# # relative_path = relative_path_for(full_path)
|
195
|
-
# # prefix = relative_path.slice!(/^(public|functions)\//)
|
196
|
-
# # subject = :static if File.expand_path(prefix) == "#{FaaStRuby::ProjectConfig.public_dir}"
|
197
|
-
# # subject = :function if File.expand_path(prefix) == "#{FaaStRuby::ProjectConfig.functions_dir}"
|
198
|
-
# # [relative_path_for(full_path), subject]
|
199
|
-
# # end
|
200
|
-
|
201
|
-
# def self.relative_path_for(full_path)
|
202
|
-
# full_path.slice!("#{SERVER_ROOT}/#{FaaStRuby::ProjectConfig.public_dir(absolute: false)}/")
|
203
|
-
# full_path
|
204
|
-
# end
|
205
|
-
|
206
|
-
# ####################
|
207
|
-
|
208
|
-
# def self.enable_sync(functions, delay: nil)
|
209
|
-
# functions.each do |path|
|
210
|
-
# function_folder = File.expand_path path
|
211
|
-
# enable_sync_for(function_folder, delay: delay)
|
212
|
-
# end
|
213
|
-
# end
|
214
|
-
|
215
|
-
# def self.enable_sync_for(function_folder, delay: nil)
|
216
|
-
# add_thread(function_folder, 'sync', start_sync_for(function_folder, delay: delay))
|
217
|
-
# end
|
218
|
-
|
219
|
-
# def self.start_listener_monitor
|
220
|
-
# Thread.new do
|
221
|
-
# loop do
|
222
|
-
# listener, function_name = STOPPER_QUEUE.pop
|
223
|
-
# listener.stop
|
224
|
-
# puts "#{tag} Watcher for function '#{function_name}' was stopped."
|
225
|
-
# end
|
226
|
-
# end
|
227
|
-
# end
|
228
|
-
|
229
|
-
# def self.start!
|
230
|
-
# Dir.chdir FaaStRuby::ProjectConfig.functions_dir
|
231
|
-
# start_listener_monitor
|
232
|
-
# functions = find_functions
|
233
|
-
# listeners = {}
|
234
|
-
# puts "#{tag} Sync mode enabled. Your functions will be auto-deployed to the workspace '#{WORKSPACE_NAME}'." if SYNC_ENABLED
|
235
|
-
# listeners['ruby'] = start_ruby(functions['ruby']) if RUBY_ENABLED
|
236
|
-
# listeners['crystal'] = start_crystal(functions['crystal']) if CRYSTAL_ENABLED
|
237
|
-
# # aaa # gotta finish configure public sync
|
238
|
-
# listeners['public'] = start_public if STATIC_FILES_SYNC_ENABLED
|
239
|
-
# function_listeners = listeners['crystal'].merge(listeners['ruby'])
|
240
|
-
# function_listeners.each do
|
241
|
-
# sleep
|
242
|
-
# ensure
|
243
|
-
# listeners.each {|language, listener| listener.stop}
|
244
|
-
# end
|
245
|
-
|
246
|
-
# def self.normalize_crystal_folder(function_folder)
|
247
|
-
# if function_folder.match(/src$/) && File.file?("#{function_folder}/../faastruby.yml") && File.file?("#{function_folder}/handler.cr")
|
248
|
-
# function_folder.sub!(/\/src$/, '')
|
249
|
-
# end
|
250
|
-
# function_folder
|
251
|
-
# end
|
252
|
-
|
253
|
-
# def self.write_handler(filename, runtime)
|
254
|
-
# content = "def handler(event)\n # Write code here\n \nend" if runtime == 'ruby'
|
255
|
-
# content = "def handler(event : FaaStRuby::Event) : FaaStRuby::Response\n # Write code here\n \nend" if runtime == 'crystal'
|
256
|
-
# File.write(filename, content)
|
257
|
-
# end
|
258
|
-
|
259
|
-
# def self.get_function_name(function_folder)
|
260
|
-
# # f_dir = FaaStRuby::ProjectConfig.functions_dir.dup
|
261
|
-
# # f_dir.slice!(function_folder)
|
262
|
-
# # f_dir
|
263
|
-
# (function_folder.split('/') - FaaStRuby::ProjectConfig.functions_dir.split('/')).join('/')
|
264
|
-
# end
|
265
|
-
|
266
|
-
# def self.add_configuration(function_folder, file, filename)
|
267
|
-
# if File.file?("#{function_folder}/faastruby.yml")
|
268
|
-
# merge_yaml(function_folder, runtime: default_runtime(file))
|
269
|
-
# else
|
270
|
-
# write_yaml(function_folder, runtime: default_runtime(file))
|
271
|
-
# end
|
272
|
-
# end
|
273
|
-
|
274
|
-
# def self.default_runtime(handler)
|
275
|
-
# case handler
|
276
|
-
# when 'handler.rb'
|
277
|
-
# return DEFAULT_RUBY_RUNTIME
|
278
|
-
# when 'handler.cr'
|
279
|
-
# return DEFAULT_CRYSTAL_RUNTIME
|
280
|
-
# end
|
281
|
-
# end
|
282
|
-
|
283
|
-
# def self.trigger(file)
|
284
|
-
# Thread.new do
|
285
|
-
# sleep 0.5
|
286
|
-
# FileUtils.touch(file)
|
287
|
-
# Thread.exit
|
288
|
-
# end
|
289
|
-
# end
|
290
|
-
|
291
|
-
# def self.merge_yaml(function_folder, runtime:)
|
292
|
-
# yaml = YAML.load(File.read("#{function_folder}/faastruby.yml"))
|
293
|
-
# write_yaml(function_folder, runtime: runtime, original: yaml)
|
294
|
-
# end
|
295
|
-
|
296
|
-
# def self.write_yaml(function_folder, runtime:, original: nil)
|
297
|
-
# function_name = get_function_name(function_folder)
|
298
|
-
# hash = {
|
299
|
-
# 'cli_version' => FaaStRuby::VERSION,
|
300
|
-
# 'name' => function_name,
|
301
|
-
# 'runtime' => runtime
|
302
|
-
# }
|
303
|
-
# hash = original.merge(hash) if original
|
304
|
-
# File.write("#{function_folder}/faastruby.yml", hash.to_yaml)
|
305
|
-
# # unless original
|
306
|
-
# File.open("#{function_folder}/faastruby.yml", 'a') do |f|
|
307
|
-
# f.write yaml_comments
|
308
|
-
# end
|
309
|
-
# # end
|
310
|
-
# puts "#{tag} File created: '#{function_name}/faastruby.yml'"
|
311
|
-
# end
|
312
|
-
|
313
|
-
# def self.yaml_comments
|
314
|
-
# [
|
315
|
-
# '## You can add commands to run locally before building the deployment package.',
|
316
|
-
# "## Some use cases are:",
|
317
|
-
# "## * minifying Javascript/CSS",
|
318
|
-
# "## * downloading a file to be included in the package.",
|
319
|
-
# "# before_build:",
|
320
|
-
# "# - curl https://some.url --output some.file",
|
321
|
-
# "# - uglifyjs your.js -c -m -o your.min.js",
|
322
|
-
# '',
|
323
|
-
# '## To schedule periodic runs, follow the example below:',
|
324
|
-
# '# schedule:',
|
325
|
-
# '# job1:',
|
326
|
-
# '# when: every 2 hours',
|
327
|
-
# '# body: {"foo": "bar"}',
|
328
|
-
# '# method: POST',
|
329
|
-
# '# query_params: {"param": "value"}',
|
330
|
-
# '# headers: {"Content-Type": "application/json"}',
|
331
|
-
# '# job2: ...'
|
332
|
-
# ].join("\n")
|
333
|
-
# end
|
334
|
-
|
335
|
-
# def self.start_sync_for(function_folder, delay: nil)
|
336
|
-
# # function_name = get_function_name(function_folder)
|
337
|
-
# # puts "#{tag} Sync activated for function '#{function_name}'."
|
338
|
-
# Thread.new do
|
339
|
-
# start_sync(function_folder, delay: delay)
|
340
|
-
# end
|
341
|
-
# end
|
342
|
-
|
343
|
-
# def self.remove_from_cloud(function_name, function_folder)
|
344
|
-
# remove_cmd = ["faastruby", "remove-from", WORKSPACE_NAME, "-y", "-f", function_name]
|
345
|
-
# removed = system(*remove_cmd)
|
346
|
-
# add_thread(function_folder, 'deployed', nil)
|
347
|
-
# if removed
|
348
|
-
# puts "#{tag} Function '#{function_name}' was removed from the cloud."
|
349
|
-
# else
|
350
|
-
# puts "#{tag} The workspace '#{WORKSPACE_NAME}' had no function named '#{function_name}', please ignore the message in red."
|
351
|
-
# end
|
352
|
-
# end
|
353
|
-
|
354
|
-
# def self.kill_thread_if_alive(function_folder, kind, function_name)
|
355
|
-
# thr = get_thread(function_folder, kind)
|
356
|
-
# if thr&.alive?
|
357
|
-
# Thread.kill(thr)
|
358
|
-
# return true
|
359
|
-
# end
|
360
|
-
# return false
|
361
|
-
# end
|
362
|
-
|
363
|
-
# def self.start_sync(function_folder, delay: nil)
|
364
|
-
# sleep delay if delay
|
365
|
-
# function_name = get_function_name(function_folder)
|
366
|
-
# exclude_from_watcher = [
|
367
|
-
# "#{function_folder}/handler",
|
368
|
-
# "#{function_folder}/handler.dwarf",
|
369
|
-
# "#{function_folder}/.package.zip"
|
370
|
-
# ]
|
371
|
-
# listener = Listen.to(function_folder) do |modified, added, removed|
|
372
|
-
# full_path, relative_path, event = translate(modified, added, removed)
|
373
|
-
# next if exclude_from_watcher.include?(full_path)
|
374
|
-
# puts "#{tag} Previous Deploy for '#{function_name}' aborted" if kill_thread_if_alive(function_folder, 'deploying', function_name)
|
375
|
-
# if event == :removed && is_a_function?(full_path, function_folder)
|
376
|
-
# remove_from_project(function_folder, function_name)
|
377
|
-
# next
|
378
|
-
# end
|
379
|
-
# deploy_cmd, deploy_cmd_print = generate_deploy_command(function_name, function_folder)
|
380
|
-
# puts "#{tag} Running: #{deploy_cmd_print.join(' ')}"
|
381
|
-
# deploy(function_folder, deploy_cmd)
|
382
|
-
# end
|
383
|
-
# listener.start
|
384
|
-
# listener
|
385
|
-
# end
|
386
|
-
|
387
|
-
# def self.is_a_function?(filename, function_folder)
|
388
|
-
# filename == function_folder || filename.match(/#{function_folder}\/(handler\.(rb|cr)|faastruby.yml)/)
|
389
|
-
# end
|
390
|
-
|
391
|
-
# def self.remove_from_project(function_folder, function_name)
|
392
|
-
# Thread.kill(get_thread(function_folder, 'sync'))
|
393
|
-
# add_thread(function_folder, 'sync', nil)
|
394
|
-
# puts "#{tag} Function '#{function_name}' was removed from the project."
|
395
|
-
# remove_from_cloud(function_name, function_folder)# if get_thread(function_folder, 'deployed')
|
396
|
-
# end
|
397
|
-
|
398
|
-
# def self.deploy(function_folder, deploy_cmd)
|
399
|
-
# add_thread(function_folder, 'deploying', Thread.new {system(*deploy_cmd)})
|
400
|
-
# add_thread(function_folder, 'deployed', true)
|
401
|
-
# end
|
402
|
-
|
403
|
-
# def self.generate_deploy_command(function_name, function_folder)
|
404
|
-
# project_config = FaaStRuby::ProjectConfig.project_config
|
405
|
-
# deploy_cmd = ['faastruby', 'deploy-to', WORKSPACE_NAME, '-f', function_name]
|
406
|
-
# deploy_cmd << '--set-root' if FaaStRuby::ProjectConfig.root_to == function_name
|
407
|
-
# deploy_cmd << '--set-catch-all' if FaaStRuby::ProjectConfig.catch_all == function_name
|
408
|
-
# secrets_json = Oj.dump(FaaStRuby::ProjectConfig.secrets_for_function(function_name)) rescue nil
|
409
|
-
# deploy_cmd_print = deploy_cmd
|
410
|
-
# if secrets_json
|
411
|
-
# deploy_cmd += ["--context", secrets_json]
|
412
|
-
# deploy_cmd_print += ["--context", '*REDACTED*']
|
413
|
-
# end
|
414
|
-
# [deploy_cmd, deploy_cmd_print]
|
415
|
-
# end
|
416
|
-
|
417
|
-
# def self.get_handler_path_in(function_folder)
|
418
|
-
# if File.file?("#{function_folder}/handler.cr")
|
419
|
-
# "#{function_folder}/handler"
|
420
|
-
# else
|
421
|
-
# "#{function_folder}/src/handler"
|
422
|
-
# end
|
423
|
-
# end
|
424
|
-
|
425
|
-
# def self.check_for_yaml_file(function_folder, handler_file)
|
426
|
-
# yaml_file = "#{function_folder}/faastruby.yml"
|
427
|
-
# unless File.file?(yaml_file)
|
428
|
-
# puts "#{tag} Function '#{function_folder}' did not have a YML configuration file."
|
429
|
-
# write_yaml(function_folder, runtime: default_runtime(File.basename(handler_file)), original: nil)
|
430
|
-
# end
|
431
|
-
# YAML.load(File.read yaml_file)
|
432
|
-
# end
|
433
|
-
|
434
|
-
# def self.find_functions
|
435
|
-
# crystal_functions = []
|
436
|
-
# ruby_functions = []
|
437
|
-
# Dir.glob(["**/handler.rb", "**/handler.cr"]).each do |handler_file|
|
438
|
-
# function_folder = File.dirname(handler_file)
|
439
|
-
# function_folder.sub!(/\/src$/, '') if handler_file.match(/src\/handler\.cr$/)
|
440
|
-
# yaml = check_for_yaml_file(function_folder, handler_file)
|
441
|
-
# case yaml['runtime']
|
442
|
-
# when /^crystal:/
|
443
|
-
# crystal_functions << function_folder
|
444
|
-
# when /^ruby:/
|
445
|
-
# ruby_functions << function_folder
|
446
|
-
# end
|
447
|
-
# end
|
448
|
-
# {'crystal' => crystal_functions, 'ruby' => ruby_functions}
|
449
|
-
# end
|
450
|
-
# end
|
451
|
-
|
452
|
-
# class CrystalBuild
|
453
|
-
# include FaaStRuby::Logger::System
|
454
|
-
# def initialize(directory, handler_path, run_before_build: false)
|
455
|
-
# @directory = directory
|
456
|
-
# @function_name = Sentinel.get_function_name(directory)
|
457
|
-
# @runtime_path = Pathname.new "#{Gem::Specification.find_by_name("faastruby").gem_dir}/lib/faastruby/server/crystal_runtime.cr"
|
458
|
-
# h_path = Pathname.new(handler_path)
|
459
|
-
# @handler_path = h_path.relative_path_from @runtime_path
|
460
|
-
# @env = {'HANDLER_PATH' => @handler_path.to_s}
|
461
|
-
# @run_before_build = run_before_build
|
462
|
-
# @crystal_build = "cd #{@directory} && crystal build #{@runtime_path} -o handler"
|
463
|
-
# end
|
464
|
-
|
465
|
-
# def pre_compile_list
|
466
|
-
# return [] unless @run_before_build
|
467
|
-
# YAML.load(File.read("#{@directory}/faastruby.yml"))["before_build"] || []
|
468
|
-
# end
|
469
|
-
|
470
|
-
# def precompile
|
471
|
-
# pre_compile_list.each do |cmd|
|
472
|
-
# cmd = "cd #{@directory} && #{cmd}"
|
473
|
-
# puts "#{tag} Job ID=\"#{job_id}\" running before_build: '#{cmd}'"
|
474
|
-
# output, status = Open3.capture2e(cmd)
|
475
|
-
# success = status.exitstatus == 0
|
476
|
-
# unless success
|
477
|
-
# puts "#{tag} Job ID=\"#{job_id}\": #{output}"
|
478
|
-
# puts "#{tag} Job ID=\"#{job_id}\" failed: #{status}"
|
479
|
-
# return false
|
480
|
-
# end
|
481
|
-
# end
|
482
|
-
# return true
|
483
|
-
# end
|
484
|
-
|
485
|
-
# def start
|
486
|
-
# Thread.report_on_exception = false
|
487
|
-
# job_id = SecureRandom.uuid
|
488
|
-
# puts "#{tag} Job ID=\"#{job_id}\" started: Compiling function '#{@function_name}'"
|
489
|
-
# return false unless precompile
|
490
|
-
# output, status = Open3.capture2e(@env, @crystal_build)
|
491
|
-
# success = status.exitstatus == 0
|
492
|
-
# puts "#{tag} Job ID=\"#{job_id}\": #{output}" unless success
|
493
|
-
# puts "#{tag} Job ID=\"#{job_id}\" #{success ? 'completed' : 'failed'}: #{status}"
|
494
|
-
# end
|
495
|
-
# end
|
496
|
-
# end
|