skypager 0.0.6 → 0.0.8
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/bin/bootstrap.sh +29 -0
- data/lib/skypager/cli/commands/build.rb +16 -0
- data/lib/skypager/cli/commands/deploy.rb +12 -3
- data/lib/skypager/cli/commands/setup.rb +65 -49
- data/lib/skypager/cli/commands/sync.rb +3 -1
- data/lib/skypager/extension.rb +13 -3
- data/lib/skypager/site.rb +15 -3
- data/lib/skypager/sync/folder.rb +33 -6
- data/lib/skypager/version.rb +1 -1
- data/skypager.gemspec +1 -2
- metadata +6 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 549d7187a816f502b9db66fa489f87e2c4bcff72
|
4
|
+
data.tar.gz: d6c2388c6c5565f73a86eb0be6c16294f92b7a0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 633189ac4c391ebf5048cd4e597ce94c1c518f23136e3cf0193a06f41b39215f7f42bfe10b66465fe28cb06fe304f94df253441484b26e0f71d932f66dfef587
|
7
|
+
data.tar.gz: 9d589905c390eede65e3dccde8fc36575d83b93cd381afd7109827a8e84204e7fdd2fe27dee744e8d92d541d852aec98bbba4538ace4bda55621b3c7acfd9ace
|
data/bin/bootstrap.sh
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
set -eo pipefail
|
4
|
+
export DEBIAN_FRONTEND=noninteractive
|
5
|
+
export SKYPAGER_REPO=${SKYPAGER_REPO:-"https://github.com/architects/skypager.git"}
|
6
|
+
|
7
|
+
if ! command -v apt-get &>/dev/null
|
8
|
+
then
|
9
|
+
echo "This installation script requires apt-get. For manual installation instructions, consult https://github.com/progrium/dokku ."
|
10
|
+
exit 1
|
11
|
+
fi
|
12
|
+
|
13
|
+
apt-get update
|
14
|
+
apt-get install -qq -y git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties
|
15
|
+
apt-get install -qq -y git make curl software-properties-common man-db
|
16
|
+
|
17
|
+
cd ~
|
18
|
+
git clone git://github.com/sstephenson/rbenv.git .rbenv
|
19
|
+
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
|
20
|
+
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
|
21
|
+
exec $SHELL
|
22
|
+
|
23
|
+
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
|
24
|
+
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
|
25
|
+
exec $SHELL
|
26
|
+
|
27
|
+
rbenv install 2.1.3
|
28
|
+
rbenv global 2.1.3
|
29
|
+
ruby -v
|
@@ -8,6 +8,8 @@ command 'build' do |c|
|
|
8
8
|
|
9
9
|
c.option "--force", nil, 'Whether or not we should force a build'
|
10
10
|
|
11
|
+
$enable_skypager_sync_from_command = true
|
12
|
+
|
11
13
|
c.action do |args, options|
|
12
14
|
require 'rack/test'
|
13
15
|
require 'skypager/builder'
|
@@ -46,3 +48,17 @@ command 'run build server' do |c|
|
|
46
48
|
|
47
49
|
end
|
48
50
|
end
|
51
|
+
|
52
|
+
command 'generate builder crontab' do |c|
|
53
|
+
c.syntax = 'skypager generate builder crontab'
|
54
|
+
c.description = 'generates a crontab which will build sites that are marked to be built'
|
55
|
+
|
56
|
+
c.action do |args, options|
|
57
|
+
lines = Skypager::Site.sites.map do |site|
|
58
|
+
"*/5 * * * * cd #{ site.root } && bundle exec skypager build"
|
59
|
+
end
|
60
|
+
|
61
|
+
puts "== run 'crontab -e' as root and add the following content:\n\n\n"
|
62
|
+
puts lines.join("\n")
|
63
|
+
end
|
64
|
+
end
|
@@ -3,11 +3,16 @@ command 'deploy' do |c|
|
|
3
3
|
c.description = 'deploy this site'
|
4
4
|
|
5
5
|
c.option '--verbose', nil, 'Display verbose status information'
|
6
|
+
c.option '--full', nil, 'Ignore the build manifest, deploy everything'
|
6
7
|
|
7
8
|
c.action do |args, options|
|
8
9
|
app = Skypager.app
|
9
10
|
site = app.site
|
10
11
|
|
12
|
+
if options.full.present?
|
13
|
+
site.remove_build_manifest
|
14
|
+
end
|
15
|
+
|
11
16
|
site.deploy(app.build_path)
|
12
17
|
|
13
18
|
if site.use_cdn?
|
@@ -19,9 +24,13 @@ command 'deploy' do |c|
|
|
19
24
|
|
20
25
|
begin
|
21
26
|
service = cdn.service
|
22
|
-
|
23
|
-
puts
|
24
|
-
|
27
|
+
|
28
|
+
puts "== Posting CDN Invalidations"
|
29
|
+
paths.each do |path|
|
30
|
+
puts "==== #{ path }"
|
31
|
+
end
|
32
|
+
|
33
|
+
service.post_invalidation cdn.id, paths
|
25
34
|
rescue => e
|
26
35
|
puts "Error invalidating the CDN: #{ e.message }"
|
27
36
|
end
|
@@ -14,6 +14,13 @@ command 'setup' do |c|
|
|
14
14
|
|
15
15
|
require 'dnsimple'
|
16
16
|
Skypager.dns.setup unless options.skip_dns || Skypager.config.dnsimple_setup?
|
17
|
+
|
18
|
+
want_to_setup_deployment = agree("Want to setup deployment right now? This will make your site available in the clouds. type yes/no")
|
19
|
+
|
20
|
+
if want_to_setup_deployment
|
21
|
+
puts "== This might take a minute."
|
22
|
+
Skypager::DeploymentSetup.run(options)
|
23
|
+
end
|
17
24
|
end
|
18
25
|
end
|
19
26
|
|
@@ -45,55 +52,7 @@ command 'setup deployment' do |c|
|
|
45
52
|
secret_access_key: options.secret_access_key)
|
46
53
|
|
47
54
|
|
48
|
-
|
49
|
-
|
50
|
-
if !Skypager.config.dnsimple_setup?
|
51
|
-
if agree("Do you want to setup DNSimple integration?")
|
52
|
-
Skypager.dns.setup()
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
custom_domain = app.deploy_options[:custom_domain] || options.custom_domain || ask("Enter a custom domain name to deploy to. Leave blank if you don't want to use this.")
|
57
|
-
|
58
|
-
if custom_domain.to_s.length > 0
|
59
|
-
app.site.set :custom_domain, custom_domain
|
60
|
-
app.site.set :use_cdn, true
|
61
|
-
@custom_domain = custom_domain
|
62
|
-
end
|
63
|
-
|
64
|
-
unless @custom_domain || app.deploy_options[:use_cdn] == true
|
65
|
-
if agree("Do you want to use a CDN? Answer yes if you want to use a custom domain, or SSL for this site")
|
66
|
-
app.site.set :use_cdn, true
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
bucket_name = app.deploy_options[:bucket_name] || options.create_bucket || ask("Enter a name for this bucket. Leave blank to use #{ app.site.name }.#{ Skypager.config.domain}")
|
71
|
-
bucket_name = app.site_name + "." + Skypager.config.domain if bucket_name.to_s.length == 0
|
72
|
-
|
73
|
-
if bucket_name
|
74
|
-
if bucket = Skypager.amazon.find_or_create_bucket(bucket_name)
|
75
|
-
app.site.set :bucket_key, bucket.key
|
76
|
-
app.site.set :bucket_name, bucket.key
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
config_path = Pathname(app.root).join("config.rb")
|
81
|
-
config_text = config_path.read rescue ""
|
82
|
-
|
83
|
-
app.site.after_setup
|
84
|
-
|
85
|
-
unless config_text.match(/deploy_to\(\:amazon/)
|
86
|
-
puts "Adding the following to your config.rb:\n\n\t#{ line = app.site.deploy_options_config_string }"
|
87
|
-
config_path.open("a+") {|fh| fh.write(line) }
|
88
|
-
end
|
89
|
-
|
90
|
-
site = app.site
|
91
|
-
|
92
|
-
puts "Site Info:"
|
93
|
-
puts "Bucket Name: #{ site.bucket_name }"
|
94
|
-
puts "Bucket URL: #{ site.bucket_url }"
|
95
|
-
puts "CDN URL: #{ site.cname_value }" if site.has_cdn?
|
96
|
-
puts "Custom Domain: #{ site.custom_domain }" if site.custom_domain?
|
55
|
+
Skypager::DeploymentSetup.run(options)
|
97
56
|
end
|
98
57
|
end
|
99
58
|
|
@@ -135,3 +94,60 @@ command 'setup github' do |c|
|
|
135
94
|
end
|
136
95
|
|
137
96
|
|
97
|
+
module Skypager
|
98
|
+
class DeploymentSetup
|
99
|
+
def self.run(options)
|
100
|
+
app = Skypager.app
|
101
|
+
|
102
|
+
if !Skypager.config.dnsimple_setup?
|
103
|
+
if agree("Do you want to setup DNSimple integration?")
|
104
|
+
Skypager.dns.setup()
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
custom_domain = app.deploy_options[:custom_domain] || options.custom_domain || ask("Enter a custom domain name to deploy to. Leave blank if you don't want to use this.")
|
109
|
+
|
110
|
+
if custom_domain.to_s.length > 0
|
111
|
+
app.site.set :custom_domain, custom_domain
|
112
|
+
app.site.set :use_cdn, true
|
113
|
+
@custom_domain = custom_domain
|
114
|
+
end
|
115
|
+
|
116
|
+
unless @custom_domain || app.deploy_options[:use_cdn] == true
|
117
|
+
if agree("Do you want to use a CDN? Answer yes if you want to use a custom domain, or SSL for this site")
|
118
|
+
app.site.set :use_cdn, true
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
bucket_name = app.deploy_options[:bucket_name] || options.create_bucket || ask("Enter a name for this bucket. Leave blank to use #{ app.site.name }.#{ Skypager.config.domain}")
|
123
|
+
bucket_name = app.site_name + "." + Skypager.config.domain if bucket_name.to_s.length == 0
|
124
|
+
|
125
|
+
if bucket_name
|
126
|
+
if bucket = Skypager.amazon.find_or_create_bucket(bucket_name)
|
127
|
+
app.site.set :bucket_key, bucket.key
|
128
|
+
app.site.set :bucket_name, bucket.key
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
config_path = Pathname(app.root).join("config.rb")
|
133
|
+
config_text = config_path.read rescue ""
|
134
|
+
|
135
|
+
app.site.after_setup
|
136
|
+
|
137
|
+
unless config_text.match(/deploy_to\(\:amazon/)
|
138
|
+
puts "Adding the following to your config.rb:\n\n\t#{ line = app.site.deploy_options_config_string }"
|
139
|
+
config_path.open("a+") {|fh| fh.write(line) }
|
140
|
+
end
|
141
|
+
|
142
|
+
site = app.site
|
143
|
+
|
144
|
+
puts "Site Info:"
|
145
|
+
puts "Bucket Name: #{ site.bucket_name }"
|
146
|
+
puts "Bucket URL: #{ site.bucket_url }"
|
147
|
+
puts "CDN URL: #{ site.cname_value }" if site.has_cdn?
|
148
|
+
puts "Custom Domain: #{ site.custom_domain }" if site.custom_domain?
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
|
@@ -1,11 +1,13 @@
|
|
1
1
|
command 'sync' do |c|
|
2
2
|
c.action do |args, options|
|
3
|
+
$enable_skypager_sync_from_command = true
|
4
|
+
|
3
5
|
app = ::Middleman::Application.server.inst do
|
4
6
|
set :environment, 'development'
|
5
7
|
end
|
6
8
|
|
7
9
|
app.synced_folders.each do |name, folder|
|
8
|
-
puts "Syncing #{ name }"
|
10
|
+
puts "== Syncing #{ name }"
|
9
11
|
folder.sync()
|
10
12
|
end
|
11
13
|
|
data/lib/skypager/extension.rb
CHANGED
@@ -26,7 +26,7 @@ module Skypager
|
|
26
26
|
app.set(key, value)
|
27
27
|
end
|
28
28
|
|
29
|
-
unless $skypager_command || ENV['DISABLE_SKYPAGER_SYNC']
|
29
|
+
unless ($skypager_command || ENV['DISABLE_SKYPAGER_SYNC']) && !$enable_skypager_sync_from_command
|
30
30
|
app.ready do
|
31
31
|
sync_folders()
|
32
32
|
load_stores()
|
@@ -36,15 +36,25 @@ module Skypager
|
|
36
36
|
# In development, we will try to refresh remote data stores (e.g. google spreadsheets)
|
37
37
|
# before every request once every minute or so
|
38
38
|
app.before do
|
39
|
+
if !Skypager.config.dropbox_setup? && !Skypager.config.google_setup? && !Skypager.config.amazon_setup?
|
40
|
+
puts "\n\n== Use Skypager's one time setup script to automate huge parts of your workflow!"
|
41
|
+
puts "Run 'skypager setup' now"
|
42
|
+
puts "\n\n\n"
|
43
|
+
raise 'Run skypager setup first'
|
44
|
+
end
|
45
|
+
|
39
46
|
data_sources.values.each do |data_source|
|
40
47
|
data_source.refresh_if_stale?
|
41
48
|
end if development?
|
42
49
|
end
|
43
50
|
end
|
44
51
|
|
52
|
+
app.before_configuration do
|
53
|
+
end
|
54
|
+
|
45
55
|
app.after_build do
|
46
|
-
|
47
|
-
|
56
|
+
site.requires_build!(false)
|
57
|
+
deploy! if auto_deploy?
|
48
58
|
end
|
49
59
|
|
50
60
|
app.after_configuration do
|
data/lib/skypager/site.rb
CHANGED
@@ -192,6 +192,12 @@ module Skypager
|
|
192
192
|
def deploy(build_dir)
|
193
193
|
target = bucket || Skypager.amazon.s3_bucket
|
194
194
|
|
195
|
+
if target.to_s.match(/there is no bucket named/i)
|
196
|
+
puts "== The S3 Bucket is not setup for this site."
|
197
|
+
puts "==== Please run 'bundle exec skypager setup deployment' to begin this process"
|
198
|
+
return
|
199
|
+
end
|
200
|
+
|
195
201
|
payload = prepare_deploy(build_dir)
|
196
202
|
|
197
203
|
if payload.empty?
|
@@ -199,9 +205,11 @@ module Skypager
|
|
199
205
|
end
|
200
206
|
|
201
207
|
payload.each do |hash|
|
202
|
-
|
208
|
+
body = hash[:node].read
|
209
|
+
|
210
|
+
if target.files.create(key: hash[:key], body: body, public: true)
|
203
211
|
rel = hash[:key]
|
204
|
-
puts "== Deployed #{rel}"
|
212
|
+
puts "== Deployed #{ body.length } bytes to #{rel}"
|
205
213
|
build_manifest[rel] = hash[:digest]
|
206
214
|
end
|
207
215
|
end
|
@@ -211,7 +219,11 @@ module Skypager
|
|
211
219
|
end
|
212
220
|
|
213
221
|
def use_cdn?
|
214
|
-
get(:use_cdn) == true || get(:use_cdn) == "yes" || get(:use_cdn) == "true"
|
222
|
+
deploy_options.fetch(:custom_domain).to_s.length > 0 || (get(:use_cdn) == true || get(:use_cdn) == "yes" || get(:use_cdn) == "true")
|
223
|
+
end
|
224
|
+
|
225
|
+
def remove_build_manifest
|
226
|
+
set(:build_manifest, @build_manifest = {})
|
215
227
|
end
|
216
228
|
|
217
229
|
# TODO
|
data/lib/skypager/sync/folder.rb
CHANGED
@@ -56,8 +56,12 @@ module Skypager
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def sync
|
59
|
-
|
60
|
-
|
59
|
+
if dropbox?
|
60
|
+
dropbox_pull
|
61
|
+
dropbox_push_sync
|
62
|
+
elsif google?
|
63
|
+
google_sync
|
64
|
+
end
|
61
65
|
end
|
62
66
|
|
63
67
|
def dropbox_pull
|
@@ -67,15 +71,15 @@ module Skypager
|
|
67
71
|
local = matching_local_path_for(entry.path)
|
68
72
|
|
69
73
|
if entry.is_deleted
|
70
|
-
puts "Removing #{ local }"
|
74
|
+
puts "== Removing #{ local }"
|
71
75
|
local.rmtree if local.exist?
|
72
76
|
elsif entry.is_dir == true
|
73
77
|
unless local.exist?
|
74
|
-
puts "Creating #{ local } directory"
|
78
|
+
puts "== Creating #{ local } directory"
|
75
79
|
local.mkdir
|
76
80
|
end
|
77
81
|
elsif entry.is_dir == false || entry.is_dir == nil
|
78
|
-
puts "Downloading #{
|
82
|
+
puts "== Downloading #{ local }"
|
79
83
|
local.open('wb+') do |fh|
|
80
84
|
fh.write(entry.download)
|
81
85
|
end
|
@@ -90,6 +94,24 @@ module Skypager
|
|
90
94
|
# Implement google drive folder cloning
|
91
95
|
end
|
92
96
|
|
97
|
+
def files_map
|
98
|
+
remotes = all_remote_files
|
99
|
+
|
100
|
+
fmap = {}
|
101
|
+
|
102
|
+
if dropbox?
|
103
|
+
all_local_files.each do |e|
|
104
|
+
remote = remotes.find do |x|
|
105
|
+
"#{x[:path]}".match(/#{ e[:path] }$/)
|
106
|
+
end
|
107
|
+
|
108
|
+
fmap[e[:path]] = {local: e, remote: remote}
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
fmap
|
113
|
+
end
|
114
|
+
|
93
115
|
def newer_local_files
|
94
116
|
remotes = all_remote_files
|
95
117
|
|
@@ -189,7 +211,12 @@ module Skypager
|
|
189
211
|
newer_local_files.each do |entry|
|
190
212
|
target = "#{ path_prefix }/#{ entry[:path] }"
|
191
213
|
target = target.gsub(/^\//,'')
|
192
|
-
|
214
|
+
|
215
|
+
puts "== Attempting to sync #{ entry[:realpath] } to #{ target }"
|
216
|
+
|
217
|
+
if entry[:realpath].file?
|
218
|
+
api.upload(target, entry[:realpath].read, overwrite: true)
|
219
|
+
end
|
193
220
|
end
|
194
221
|
end
|
195
222
|
|
data/lib/skypager/version.rb
CHANGED
data/skypager.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency 'hashie'
|
22
22
|
spec.add_dependency 'commander'
|
23
23
|
spec.add_dependency 'fog'
|
24
|
-
spec.add_dependency 'dropbox-api'
|
24
|
+
spec.add_dependency 'dropbox-api', '>= 0.4.3'
|
25
25
|
spec.add_dependency 'google_drive'
|
26
26
|
spec.add_dependency 'middleman'
|
27
27
|
spec.add_dependency 'rack-contrib'
|
@@ -32,7 +32,6 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_dependency 'dnsimple-ruby'
|
33
33
|
spec.add_dependency 'rack-proxy'
|
34
34
|
spec.add_dependency 'octokit', '>= 3.0.0'
|
35
|
-
spec.add_dependency 'whenever'
|
36
35
|
|
37
36
|
# If I ever wanted to try and bundle up the build server
|
38
37
|
# sweep utility, instead of making it an external cron job
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skypager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Soeder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.4.3
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.4.3
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: google_drive
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -206,20 +206,6 @@ dependencies:
|
|
206
206
|
- - ">="
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: 3.0.0
|
209
|
-
- !ruby/object:Gem::Dependency
|
210
|
-
name: whenever
|
211
|
-
requirement: !ruby/object:Gem::Requirement
|
212
|
-
requirements:
|
213
|
-
- - ">="
|
214
|
-
- !ruby/object:Gem::Version
|
215
|
-
version: '0'
|
216
|
-
type: :runtime
|
217
|
-
prerelease: false
|
218
|
-
version_requirements: !ruby/object:Gem::Requirement
|
219
|
-
requirements:
|
220
|
-
- - ">="
|
221
|
-
- !ruby/object:Gem::Version
|
222
|
-
version: '0'
|
223
209
|
- !ruby/object:Gem::Dependency
|
224
210
|
name: aws-sdk-core
|
225
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -322,6 +308,7 @@ description: Skypager is for launching your websites
|
|
322
308
|
email:
|
323
309
|
- jonathan.soeder@gmail.com
|
324
310
|
executables:
|
311
|
+
- bootstrap.sh
|
325
312
|
- skypager
|
326
313
|
extensions: []
|
327
314
|
extra_rdoc_files: []
|
@@ -335,6 +322,7 @@ files:
|
|
335
322
|
- README.md
|
336
323
|
- Rakefile
|
337
324
|
- VISION.md
|
325
|
+
- bin/bootstrap.sh
|
338
326
|
- bin/skypager
|
339
327
|
- examples/.gitignore
|
340
328
|
- examples/blog-site/.gitignore
|