fastlane-plugin-queue 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: cdacfd6b25670d732c568e5dc5241b3a13e8fe61
4
- data.tar.gz: cad53d3beab7cd475c7e8ef71856783d7ac15e8f
3
+ metadata.gz: c36627e6703a57cc76bb125bd462e447f224423c
4
+ data.tar.gz: 4c378df9a8f633ee3dcd1886a09d7741b2cc044f
5
5
  SHA512:
6
- metadata.gz: f78af491b790c137cdeb17e3f6cd1423309113bc4e09143c02a0bd9df17a23ac54523bb1938aedb2f98f780585dea8295ac41bac128b2d89bc1b32d55a32a567
7
- data.tar.gz: 99cbe8c10c7cd7e2920b58ab3a6338e96f64dde1af8f15230834b05bfea8e576ef42b2ba2721dda188425252bedb5b42e6490f5ae9f42e7c5e0001c1ac2e077c
6
+ metadata.gz: 69772ce2bb0382c246cc4468d521d041c652acf25407bab25d3830b07102c15976e66e347d68bbe9ca36003e26994eec101e0456f9e3459865b185c6985b2f13
7
+ data.tar.gz: 1d6f6b2e7fe2fa98e4236639a56d7af0598e6595344ba831db852203fa68d8c13e5df2f9418264741091345b533178f03de4f6ab043de680ba5fd303a9a48106
data/README.md CHANGED
@@ -11,13 +11,14 @@ Easily queue up `fastlane` jobs using [Resque](https://github.com/resque/resque)
11
11
  - Manage queue using `resque`'s web interface
12
12
  - View queued, running, and failed jobs
13
13
  - Retry failed jobs
14
+ - Custom web interface for starting `fastlane` jobs
14
15
 
15
16
  ### Planned Features
16
17
  - Configure any `resque` settings
17
18
  - Ex: port, redis connection settings, plugins
18
- - Custom web interface for starting `fastlane` jobs
19
19
  - Allow different `dotenv` settings per job
20
20
 
21
+ ![Screenshot - Overview](screenshots/screenshot_app.png)
21
22
  ![Screenshot - Overview](screenshots/screenshot_overview.png)
22
23
 
23
24
  ## Getting Started
@@ -10,7 +10,13 @@ module Fastlane
10
10
  Process.fork do
11
11
  require 'vegas'
12
12
  require 'resque/server'
13
- Vegas::Runner.new(Resque::Server, 'fastlane-plugin-queue-resque-web')
13
+ Vegas::Runner.new(Resque::Server, 'fastlane-plugin-queue-resque-web', {port: 5678, skip_launch: true})
14
+ end
15
+
16
+ Process.fork do
17
+ require 'vegas'
18
+ require 'resque/server'
19
+ Vegas::Runner.new(App, 'fastlane-plugin-queue-app', {port: 5679})
14
20
  end
15
21
 
16
22
  # Starts a blocking worker
@@ -23,13 +23,30 @@ module Fastlane
23
23
  end
24
24
 
25
25
  # Shut down our web server
26
- begin
27
- require 'vegas'
28
- require 'resque/server'
29
- Vegas::Runner.new(Resque::Server, 'fastlane-plugin-queue-resque-web', {}, ["--kill"])
30
- rescue StandardError
31
- UI.warning("Nothing to stop")
26
+ Process.fork do
27
+ begin
28
+ require 'vegas'
29
+ require 'resque/server'
30
+ Vegas::Runner.new(Resque::Server, 'fastlane-plugin-queue-resque-web', {}, ["--kill"])
31
+ puts "killed resque"
32
+ rescue StandardError
33
+ UI.warning("Nothing to stop")
34
+ end
35
+ end
36
+
37
+ Process.fork do
38
+ begin
39
+ require 'vegas'
40
+ require 'resque/server'
41
+ Vegas::Runner.new(App, 'fastlane-plugin-queue-app', {}, ["--kill"])
42
+ puts "killed app"
43
+ rescue StandardError
44
+ UI.warning("Nothing to stop")
45
+ end
32
46
  end
47
+
48
+ # Sleeping because we need time to kill these proceses ^ :-|
49
+ sleep 5
33
50
  end
34
51
 
35
52
  def self.description
@@ -0,0 +1,115 @@
1
+ require 'sinatra/base'
2
+ require 'resque'
3
+
4
+ STYLESHEET = <<-STYLESHEET
5
+ <style>
6
+ p {
7
+ text-align: center;
8
+ font-family: arial, sans-serif;
9
+ font-size: 18px;
10
+ }
11
+ a {
12
+ font-family: arial, sans-serif;
13
+ font-size: 22px;
14
+ color: #000000;
15
+ }
16
+ a:hover {
17
+ color: #999999;
18
+ }
19
+ textarea {
20
+ width: 100%;
21
+ font-family: arial, sans-serif;
22
+ font-size: 22px;
23
+ padding: 10px;
24
+ }
25
+ form {
26
+ text-align: center;
27
+ }
28
+ input[type="submit"] {
29
+ margin-top: 20px;
30
+
31
+ -webkit-border-radius: 28;
32
+ -moz-border-radius: 28;
33
+ border-radius: 28px;
34
+ font-family: Arial;
35
+ color: #ffffff;
36
+ font-size: 20px;
37
+ background: #34b2d9;
38
+ padding: 10px 20px 10px 20px;
39
+ text-decoration: none;
40
+ border-width: 1px;
41
+ border-style: solid;
42
+ }
43
+ input[type="submit"]:hover {
44
+ background: #3cb0fd;
45
+ background-image: -webkit-linear-gradient(top, #3cb0fd, #3498db);
46
+ background-image: -moz-linear-gradient(top, #3cb0fd, #3498db);
47
+ background-image: -ms-linear-gradient(top, #3cb0fd, #3498db);
48
+ background-image: -o-linear-gradient(top, #3cb0fd, #3498db);
49
+ background-image: linear-gradient(to bottom, #3cb0fd, #3498db);
50
+ text-decoration: none;
51
+ }
52
+ #main {
53
+ max-width: 600px;
54
+ margin: auto;
55
+ text-align: center;
56
+ }
57
+ #instructions-title {
58
+ font-size: 22px;
59
+ font-weight: bold;
60
+ margin-bottom: 10px;
61
+ }
62
+ #instructions {
63
+ font-size: 16px;
64
+ color: #999999;
65
+ margin-top: 0px;
66
+ padding-top: 0px;
67
+ }
68
+ </style>
69
+ STYLESHEET
70
+
71
+ FASTLANE_IMAGE = ""
72
+
73
+ class App < Sinatra::Base
74
+ get '/' do
75
+ info = Resque.info
76
+ out = "<html><head><title>Resque Demo</title>#{STYLESHEET}</head><body>"
77
+
78
+ out << '<div id="main">'
79
+ out << '<img src="data:image/png;base64,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" />'
80
+ out << "<p>"
81
+ out << "There are #{info[:pending]} pending and "
82
+ out << "#{info[:processed]} processed jobs across #{info[:queues]} queue(s)"
83
+ out << "</p>"
84
+ out << "<p>"
85
+ out << '<a id="view-rescue" target="_blank">Manage Queue</a>'
86
+ out << "</p>"
87
+ out << '<form method="POST">'
88
+ out << '<textarea rows="10" name="runs" placeholder="fastlane ios build"></textarea>'
89
+ out << '<input type="submit" value="Queue Job(s)"/>'
90
+ out << '</form>'
91
+ out << '<p id="instructions-title">'
92
+ out << 'Instructions'
93
+ out << '</p>'
94
+ out << '<p id="instructions">'
95
+ out << 'Enter one fastlane command per line<br/>'
96
+ out << 'Example: "fastlane ios build environment:staging"<br/>'
97
+ out << '</p>'
98
+ out << '</div>'
99
+
100
+ out << "</body>"
101
+ out << "<script>"
102
+ out << 'document.getElementById("view-rescue").href = window.location.protocol + "//" + window.location.hostname + ":5678";'
103
+ out << "</script>"
104
+ out << "</html>"
105
+ out
106
+ end
107
+
108
+ post '/' do
109
+ runs = params[:runs]
110
+ runs.split("\n").each do |run|
111
+ Resque.enqueue(Job, {run: run})
112
+ end
113
+ redirect "/"
114
+ end
115
+ end
@@ -14,6 +14,11 @@ class Job
14
14
 
15
15
  if run
16
16
  args = run.split(' ')
17
+
18
+ if args.first == "fastlane"
19
+ args.shift
20
+ end
21
+
17
22
  Fastlane::CommandLineHandler.handle(args, MockOptions.new)
18
23
  else
19
24
  platform = nil if platform.to_s.size == 0
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module Queue
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-queue
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Holtz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-29 00:00:00.000000000 Z
11
+ date: 2017-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: resque
@@ -137,7 +137,7 @@ dependencies:
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  description:
140
- email: josh@rokkincat.com
140
+ email: me@joshholtz.com
141
141
  executables: []
142
142
  extensions: []
143
143
  extra_rdoc_files: []
@@ -148,11 +148,12 @@ files:
148
148
  - lib/fastlane/plugin/queue/actions/queue_action.rb
149
149
  - lib/fastlane/plugin/queue/actions/queue_start_action.rb
150
150
  - lib/fastlane/plugin/queue/actions/queue_stop_action.rb
151
+ - lib/fastlane/plugin/queue/helper/app.rb
151
152
  - lib/fastlane/plugin/queue/helper/job.rb
152
153
  - lib/fastlane/plugin/queue/helper/queue_helper.rb
153
154
  - lib/fastlane/plugin/queue/version.rb
154
155
  - lib/tasks/resque.rake
155
- homepage:
156
+ homepage: https://github.com/joshdholtz/fastlane-plugin-queue
156
157
  licenses:
157
158
  - MIT
158
159
  metadata: {}