oye 0.1.7 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72649c178dd1644eb71bdb4f72f804ab8c4c190c6106736da15d876607adb285
4
- data.tar.gz: 70c2d64e214075672aa155e2dff7629198bbb23fe30f51efcfabae643f67ab13
3
+ metadata.gz: a0f6ff207c4fac96695688a50e1b59a630d00d0da82f2b467d8e887a4a4f147c
4
+ data.tar.gz: '043181a7f859c284c01e8f37c9ca55f447e21a256e7e0b3f6c6d6bc1f4736e28'
5
5
  SHA512:
6
- metadata.gz: d678648a0024307aa4695bbea4ae47ae82833637b8faabd8be2ec0ba67240ca4137b005619bdfdfdab7de8f67c70b572ea9e0a5dda14760bc90a8297af6cad6d
7
- data.tar.gz: 47767c6ee7bb5fda3fe58aef52c015c971e611de65cf140623d48b8b19350b77adbb3f252d5a1d7abcbf6552352b05239aeb7cc83dda981540869a22c79c5f12
6
+ metadata.gz: 7bba790ca065eb5b4ea379a28490ac02e80a63e3998582c0037733a31ad3b0496ef073e695f66d5157e452448526a72da44be0ec5f9ff6def5e1d91a4fa6d7f0
7
+ data.tar.gz: 4a4914bd17c72fb35875230f3e651b4db0109b07a9a21a781660ec7769012577794170792d225e12d24cc142fe19d52d30705a40e3b6dd4e4621d6c65b4667c6
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- oye (0.1.7)
4
+ oye (0.1.12)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -41,4 +41,4 @@ DEPENDENCIES
41
41
  ruby-prof
42
42
 
43
43
  BUNDLED WITH
44
- 2.1.2
44
+ 2.1.4
data/README.md CHANGED
@@ -10,4 +10,22 @@ A continuous monitoring tool that does a few things:
10
10
  [ ] run rails tests inside Oye.monitor
11
11
  [ ] check for irregularities in @repos, e.g two repeated cloned repos
12
12
  [ ] give warning if port is not open by using `port_open?` method
13
+ - fix possible port conflicts. for example `oye -p 3000` will add that port to the list of ports (or sockets) already specified in the app's config file (unicorn.rb). but you print an error if there are port conflicts
13
14
  [ ] why is the trap with `FileUtils.rm_f(oye_pidfile)` not removing the PID file
15
+ [ ] make a website for 'oye' where you provide better documentation. e.g.
16
+ - how to set up oye.yml
17
+ [ ] create a git brach called 'oye' and pull from that one instead of 'origin'.
18
+ [ ] suport remote branches via 'ssh'. e.g. you can use `Net::SSH` as i use in '~/.ruby/req'
19
+ [ ] support for webrick app server
20
+ [ ] support for apps that dont use an app server (e.g. oye.dance and sergioro.mx run in nginx alone)
21
+ [ ] support 'jekyll serve' for people that dont want to use a web server for jekyll
22
+ [ ] split the file. use Oye::Actions as a namespace for update, restart, start, stop methods
23
+ [ ] read environment for each app from oye.yml. e.g. user cn specify 'production' for one app and 'development' for another. The '-e' option is the default environment to be used if none is specified in oye.yml
24
+ [ ] change %x() to system() to prevent undesired prints to console (e.g. if you stop 'oye' while it is running '%x(bundler)' it will dump bundler errors to the console.)
25
+ [ ] give specific help for each command like jekyl does `jekyll [cmd] -h`
26
+ - e.g. with `oye port -h`
27
+ [ ] there might be a hard-to-find-bug if `oye` is executing a `git pull` while the origin repo is receiving data from a `git push`.
28
+ [ ] in 'oye.yml' you could pass an aditional parameter to specify what type of app it is. in this way you dont need to use `is_rails?`. e.g.
29
+ /git/pete.land.git:
30
+ - /var/www/html/pete.land:
31
+ type: jekyll
data/lib/oye.rb CHANGED
@@ -2,9 +2,9 @@ $LOAD_PATH.unshift __dir__
2
2
 
3
3
  require "oye/version"
4
4
  require 'fileutils'
5
- require 'yaml'
6
5
  require 'socket'
7
6
  require 'timeout'
7
+ require 'yaml'
8
8
 
9
9
  module Oye
10
10
  class Error < StandardError; end
@@ -17,9 +17,13 @@ module Oye
17
17
  def start(args)
18
18
  help if(args.include?('-h') or args.include?('--help'))
19
19
  version if(args.include?('-v') or args.include?('--version'))
20
- stop if(args.include?('-s') or args.include?('--stop'))
21
- restart if(args.include?('-r') or args.include?('--restart'))
22
- config if(args.include?('-c') or args.include?('--config'))
20
+ restart_oye if(args.include?('-r') or args.include?('--restart'))
21
+ config_oye if(args.include?('-c') or args.include?('--config'))
22
+
23
+ if(args.include?('-s') or args.include?('--stop'))
24
+ stop_oye
25
+ exit
26
+ end
23
27
 
24
28
  FileUtils.mkdir_p(oyedir)
25
29
 
@@ -66,9 +70,9 @@ module Oye
66
70
  end
67
71
  end
68
72
 
69
- @unicorn_default_options = "-E #{@environment} -D"
70
-
71
- @unicorn_default_options << " -l #{@port}" if @port
73
+ @default_unicorn_options = "-E #{@environment} -D"
74
+ @default_unicorn_options << " -l #{@port}" if @port
75
+ @default_jekyll_options = "-B"
72
76
 
73
77
  monitor
74
78
  end
@@ -95,45 +99,38 @@ module Oye
95
99
  exit
96
100
  end
97
101
 
102
+ # main method
98
103
  def monitor
99
104
  %w(TERM INT).each do |signal|
100
105
  trap(signal) do
101
106
  stop_oye
102
- FileUtils.rm_f(oye_pidfile)
103
107
  exit
104
108
  end
105
109
  end
106
110
 
111
+ # get change-times of origin repos
107
112
  @repos.keys.filter_map do |origin|
108
113
  next unless File.exists?(origin)
109
-
110
114
  @repos[origin]['stat'] = File.stat(origin).ctime
111
115
  end
112
116
 
113
117
  pid = fork do
114
118
  begin
115
- # initialize apps if they are not running
116
- # TODO i dont like this loop
119
+ # initial build and start of apps
117
120
  @repos.values.flatten.each do |app|
118
121
  app['clones'].each do |clone|
119
-
120
122
  if !File.exists?(clone)
121
123
  log(clone, status: :warn, message: "Could not find repo")
122
124
  next
123
- elsif !File.exists?(app_pid_dir(clone))
124
- log(clone, status: :warn, message: "Could not find pids directory")
125
- next
126
- elsif File.exists?(app_pid_file(clone))
127
- # if pid fle exists, the app should be running and there's no need to be initialize it
128
- next
129
125
  end
130
126
 
131
- initialize_clone(clone)
127
+ build_app(clone)
132
128
 
133
- rescue Errno::ESRCH
129
+ start_app(clone)
134
130
  end
135
131
  end
136
132
 
133
+ # loop that watches for changes in origin repos
137
134
  loop do
138
135
  repos_dup = @repos
139
136
  repos_dup.keys.each do |origin|
@@ -150,17 +147,15 @@ module Oye
150
147
 
151
148
  unless @repos[origin]['stat'] == File.stat(origin).ctime
152
149
  @repos[origin]['stat'] = File.stat(origin).ctime
153
- stop_clone(clone) if File.exists?(app_pid_file(clone))
154
- update_clone(clone)
155
- initialize_clone(clone)
150
+ update_app(clone)
151
+ build_app(clone)
152
+ restart_app(clone)
156
153
  end
157
154
  end
158
155
  end
159
156
  sleep @interval
160
157
  end
161
158
  end
162
- rescue => e
163
- abort "Fatal system error while initializing oye: #{e.message}, #{caller}"
164
159
  end
165
160
 
166
161
  File.open(oye_pidfile, 'w') { |f| f.puts pid }
@@ -181,31 +176,61 @@ module Oye
181
176
  end
182
177
  end
183
178
 
184
- def initialize_clone(dir)
179
+ def build_app(dir)
185
180
  Dir.chdir(dir) do
186
181
  %x(bundle)
187
182
 
188
- %x(RAILS_ENV=#{@environment} rails db:migrate)
183
+ if rails_app?(dir)
184
+ %x(RAILS_ENV=#{@environment} rails db:migrate)
189
185
 
190
- if @environment == 'production'
191
- %x(RAILS_ENV=production rails assets:{clean,precompile})
186
+ if @environment == 'production'
187
+ %x(RAILS_ENV=production rails assets:{clean,precompile})
188
+ end
189
+ elsif jekyll_app?(dir)
190
+ %x{jekyll build}
192
191
  end
193
192
  end
194
193
 
195
- unicorn_options = @unicorn_default_options << " -c #{unicorn_file(dir)}"
196
-
197
- %x{unicorn_rails #{unicorn_options}}
194
+ log(dir, status: :info, message: "Built app")
195
+ rescue => e
196
+ log(dir, status: :warn, message: "#{__method__.to_s} (#{e.message})")
197
+ end
198
198
 
199
- log(dir, status: :info, message: "Started app server")
199
+ def stop_app(dir)
200
+ if rails_app?(dir)
201
+ if File.exists?(app_pid_file(dir))
202
+ Process.kill 'TERM', app_pid(dir)
203
+ end
204
+ elsif jekyll_app?(dir)
205
+ if @environment == 'development'
206
+ %x(pkill -f jekyll)
207
+ end
208
+ end
200
209
  rescue => e
201
210
  log(dir, status: :warn, message: "#{__method__.to_s} (#{e.message})")
202
211
  end
203
212
 
204
- def stop_clone(dir)
205
- Process.kill 'TERM', app_pid(dir)
213
+ def start_app(dir)
214
+ Dir.chdir(dir) do
215
+ if rails_app?(dir)
216
+ unicorn_options = @default_unicorn_options << " -c #{unicorn_file(dir)}"
217
+
218
+ system("unicorn_rails #{unicorn_options}", [:out, :err] => File::NULL)
219
+ elsif jekyll_app?(dir)
220
+ if @environment == 'development'
221
+ jekyll_options = @default_jekyll_options << " -s #{dir} -d #{dir}/_site"
222
+
223
+ system("jekyll serve #{jekyll_options}", [:out, :err] => File::NULL)
224
+ end
225
+ end
226
+ end
227
+
228
+ log(dir, status: :info, message: "Started app")
229
+ rescue => e
230
+ log(dir, status: :warn, message: "#{__method__.to_s} (#{e.message})")
206
231
  end
207
232
 
208
- def update_clone(dir)
233
+ def update_app(dir)
209
234
  system("git -C #{dir} pull", [:out, :err] => File::NULL)
210
235
 
211
236
  log(dir, status: :info, message: "Pulled from origin")
@@ -221,13 +246,15 @@ module Oye
221
246
  exit
222
247
  end
223
248
 
224
- def config
249
+ # print oye config files
250
+ def config_oye
225
251
  puts "Config file: #{oye_config}"
226
252
  puts "Log file: #{oye_logfile}"
227
253
  puts "PID file: #{oye_pidfile}"
228
254
  exit
229
255
  end
230
256
 
257
+ # print watched repos
231
258
  def info
232
259
  not_found = []
233
260
  @repos.keys.each do |repo|
@@ -265,14 +292,39 @@ module Oye
265
292
 
266
293
  def stop_oye
267
294
  Process.kill 'TERM', oye_pid
295
+ FileUtils.rm_f(oye_pidfile)
296
+ log(oye_pidfile, status: :info, message: "Stopped oye")
297
+ rescue Errno::ENOENT
268
298
  end
269
299
 
270
300
  # TODO implement
271
- def restart
301
+ def restart_oye
302
+ end
303
+
304
+ def restart_app(clone)
305
+ stop_app(clone)
306
+ start_app(clone)
272
307
  end
273
308
 
274
309
  private
275
310
 
311
+ # determine type of application
312
+ # #rails_
313
+ %w(rails jekyll).each do |app_type|
314
+ define_method("#{app_type}_app?") do |dir|
315
+ if File.exist?(gemfile(dir)) && File.read(gemfile(dir)).match?(/^\s*#{app_type}\b/)
316
+ true
317
+ else
318
+ false
319
+ end
320
+ end
321
+ end
322
+
323
+ def gemfile(dir)
324
+ File.join(dir, "Gemfile.lock")
325
+ end
326
+
327
+ # return +true+ if the port is open else +false+
276
328
  def port_open?(port)
277
329
  begin
278
330
  Timeout::timeout(1) do
@@ -298,10 +350,12 @@ module Oye
298
350
  "#{oyedir}/oye.yml"
299
351
  end
300
352
 
353
+ # log +oye+ actions
301
354
  def oye_logfile
302
355
  "#{oyedir}/oye.log"
303
356
  end
304
357
 
358
+ # :stopdoc:
305
359
  def oye_pidfile
306
360
  "#{oyedir}/oye.pid"
307
361
  end
@@ -310,7 +364,6 @@ module Oye
310
364
  File.read(oye_pidfile).to_i
311
365
  end
312
366
 
313
-
314
367
  def unicorn_file(dir)
315
368
  File.join(dir, "config/unicorn.rb")
316
369
  end
@@ -1,3 +1,3 @@
1
1
  module Oye
2
- VERSION = "0.1.7"
2
+ VERSION = "0.1.12"
3
3
  end
@@ -8,6 +8,7 @@ Gem::Specification.new do |spec|
8
8
 
9
9
  spec.summary = %q{Continuous monitoring tool}
10
10
  spec.description = %q{Continuous monitoring tool}
11
+ spec.homepage = "https://oye.dance"
11
12
  spec.license = "MIT"
12
13
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
13
14
 
@@ -27,5 +28,5 @@ Gem::Specification.new do |spec|
27
28
  spec.add_development_dependency "ronn", "~> 0.7"
28
29
  spec.add_development_dependency "ruby-prof", ">= 0"
29
30
 
30
- #spec.add_runtime_dependency "SOME_GEM", "~> VERSION"
31
+ #spec.add_runtime_dependency "bundler", "~> 2.1.2"
31
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oye
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - sergioro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-22 00:00:00.000000000 Z
11
+ date: 2020-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -129,7 +129,7 @@ files:
129
129
  - lib/oye.rb
130
130
  - lib/oye/version.rb
131
131
  - oye.gemspec
132
- homepage:
132
+ homepage: https://oye.dance
133
133
  licenses:
134
134
  - MIT
135
135
  metadata: {}