odania-static-pages 0.1.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +5 -0
  4. data/CODE_OF_CONDUCT.md +74 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +44 -0
  8. data/Rakefile +10 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +8 -0
  11. data/cf-templates/s3-http.yml +50 -0
  12. data/cf-templates/s3-logging.yml +21 -0
  13. data/cf-templates/s3-state.yml +21 -0
  14. data/exe/odania-static-pages +5 -0
  15. data/lib/odania_static_pages/cli/deploy_cli.rb +17 -0
  16. data/lib/odania_static_pages/cli/generator_cli.rb +17 -0
  17. data/lib/odania_static_pages/cli.rb +30 -0
  18. data/lib/odania_static_pages/config/docker_compose.rb +24 -0
  19. data/lib/odania_static_pages/config/generator/jekyll.rb +126 -0
  20. data/lib/odania_static_pages/config/rsync.rb +24 -0
  21. data/lib/odania_static_pages/config/s3.rb +41 -0
  22. data/lib/odania_static_pages/config.rb +127 -0
  23. data/lib/odania_static_pages/deploy/docker_compose.rb +148 -0
  24. data/lib/odania_static_pages/deploy/rsync.rb +73 -0
  25. data/lib/odania_static_pages/deploy/s3.rb +165 -0
  26. data/lib/odania_static_pages/generator/jekyll.rb +112 -0
  27. data/lib/odania_static_pages/server/nginx.rb +7 -0
  28. data/lib/odania_static_pages/version.rb +3 -0
  29. data/lib/odania_static_pages.rb +28 -0
  30. data/odania-static-pages.gemspec +33 -0
  31. data/odania-static-pages.iml +15 -0
  32. data/templates/docker-compose/docker-compose.yml.erb +68 -0
  33. data/templates/jekyll/Gemfile.erb +44 -0
  34. data/templates/jekyll/example_config.yml +19 -0
  35. data/templates/nginx/default-live-vhost.conf +13 -0
  36. data/templates/nginx/default-vhost.conf +21 -0
  37. data/templates/nginx/index.html.erb +14 -0
  38. data/templates/nginx/nginx.conf +41 -0
  39. data/templates/nginx/vhost-redirects.conf.erb +14 -0
  40. data/templates/nginx/vhost.conf.erb +22 -0
  41. metadata +196 -0
@@ -0,0 +1,127 @@
1
+ require_relative 'config/docker_compose'
2
+ require_relative 'config/generator/jekyll'
3
+ require_relative 'config/rsync'
4
+ require_relative 'config/s3'
5
+
6
+ module OdaniaStaticPages
7
+ class Config
8
+ attr_accessor :environment
9
+ attr_reader :project_dir, :base_dir, :output_sites_path, :output_nginx_path, :environments,
10
+ :generator_type, :generator
11
+
12
+ def initialize(path=nil)
13
+ @base_dir = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..'))
14
+ @project_dir = path.nil? ? Dir.getwd : path
15
+ @output_sites_path = 'sites'
16
+ @output_nginx_path = 'nginx'
17
+ @generator_type = 'Jekyll'
18
+ @environments = {
19
+ develop: Environment.new('_develop', 'DockerCompose'),
20
+ live: Environment.new('_live', 'Rsync')
21
+ }
22
+ @generator = Generator::Jekyll.new(@project_dir, {})
23
+ end
24
+
25
+ def load!
26
+ if File.exist? config_file
27
+ config = YAML.load_file(config_file).stringify_keys!
28
+ @output_sites_path = config['output_sites_path'] unless config['output_sites_path'].nil?
29
+ @output_nginx_path = config['output_nginx_path'] unless config['output_nginx_path'].nil?
30
+ @generator_type = config['generator_type'] unless config['generator_type'].nil?
31
+
32
+ unless config['environments'].nil?
33
+ @environments = {}
34
+ config['environments'].each_pair do |name, data|
35
+ @environments[name] = Environment.from_hash data
36
+ end
37
+ end
38
+
39
+ @deploy = Deploy.from_hash(config['deploy']) unless config['deploy'].nil?
40
+
41
+ unless config['generator'].nil?
42
+ generator_config_module = "OdaniaStaticPages::Config::Generator::#{@generator_type}".constantize
43
+ @generator = generator_config_module.from_hash @project_dir, config['generator']
44
+ end
45
+ end
46
+
47
+ self
48
+ end
49
+
50
+ def config_file
51
+ File.join(@project_dir, '_config.yml')
52
+ end
53
+
54
+ def output_site_path
55
+ File.join @project_dir, current_environment.output_path, @output_sites_path
56
+ end
57
+
58
+ def output_path
59
+ File.join @project_dir, current_environment.output_path
60
+ end
61
+
62
+ def pages_path
63
+ File.join @project_dir, 'pages'
64
+ end
65
+
66
+ def current_environment
67
+ @environments[@environment]
68
+ end
69
+
70
+ def save!
71
+ puts "Writing config file #{config_file}"
72
+ File.write config_file, YAML.dump(to_h)
73
+ end
74
+
75
+ private
76
+
77
+ def to_h
78
+ environment_hash = {}
79
+ @environments.each_pair do |name, environment|
80
+ environment_hash[name.to_s] = environment.to_h
81
+ end
82
+
83
+ config = {
84
+ output_sites_path: @output_sites_path,
85
+ output_nginx_path: @output_nginx_path,
86
+ generator_type: @generator_type,
87
+ generator: @generator.to_h,
88
+ environments: environment_hash
89
+ }
90
+
91
+ config.stringify_keys!
92
+ end
93
+
94
+ class Environment
95
+ attr_reader :output_path, :deploy_type, :deploy_module, :notify
96
+
97
+ def initialize(output_path, deploy_type, deploy_module_config={}, notify='echo Switched from OLD-COLOR to NEW-COLOR!')
98
+ @output_path = output_path
99
+ @deploy_type = deploy_type
100
+ @notify = notify
101
+ clazz_name = "OdaniaStaticPages::Config::Deploy::#{deploy_type}"
102
+ @deploy_module = clazz_name.constantize.new deploy_module_config.symbolize_keys!
103
+ end
104
+
105
+ def to_h
106
+ {
107
+ output_path: @output_path,
108
+ deploy_type: @deploy_type,
109
+ notify: @notify,
110
+ deploy_config: @deploy_module.to_h
111
+ }.stringify_keys!
112
+ end
113
+
114
+ def self.from_hash(data)
115
+ Environment.new data['output_path'], data['deploy_type'], data['deploy_config'], data['notify']
116
+ end
117
+
118
+ def do_notify(new_color, old_color)
119
+ unless @notify.nil?
120
+ replaced_notify = @notify.gsub('NEW-COLOR', new_color).gsub('OLD-COLOR', old_color)
121
+ puts "Ececuting notify: #{replaced_notify}"
122
+ puts `#{replaced_notify}`
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,148 @@
1
+ module OdaniaStaticPages
2
+ module Deploy
3
+ class DockerCompose
4
+ def initialize
5
+ @config = OdaniaStaticPages.config
6
+ @environment = @config.current_environment
7
+ @deploy_config = @environment.deploy_module
8
+ @generator_config = @config.generator
9
+ @nginx_dir = File.join(@config.output_path, 'nginx')
10
+ @nginx_conf_dir = File.join(@nginx_dir, 'conf.d')
11
+ end
12
+
13
+ def prepare
14
+ puts 'Preparing docker-compose state'
15
+ load_state
16
+ state_path = File.dirname(@deploy_config.state_file)
17
+ FileUtils.mkdir_p state_path unless File.exist? state_path
18
+ save_state
19
+ end
20
+
21
+ def publish(color, do_rebuild)
22
+ puts 'docker-compose'
23
+ load_state
24
+ color = color.nil? ? @state[:color] : color
25
+ new_color = 'green'.eql?(color) ? 'blue' : 'green'
26
+ puts " -> Current color: #{color}"
27
+ @site_path = @config.output_site_path
28
+ puts " -> Deploying to color: #{new_color} [Path: #{@site_path}]"
29
+
30
+ generate_compose_config
31
+ generate_nginx_config(do_rebuild)
32
+ prepare_varnish
33
+
34
+ @config.current_environment.do_notify new_color, color
35
+ puts
36
+ puts "Finished deploying color #{new_color}"
37
+ end
38
+
39
+ private
40
+
41
+ def load_state
42
+ @state = {color: 'blue'}
43
+ @state = YAML.load_file(@deploy_config.state_file).symbolize_keys! if File.exist? @deploy_config.state_file
44
+
45
+ @state
46
+ end
47
+
48
+ def save_state
49
+ File.write @deploy_config.state_file, YAML.dump(@state)
50
+ end
51
+
52
+ def generate_compose_config
53
+ puts 'Generating docker-compose.yml'
54
+ environment = @config.current_environment
55
+ compose_file = File.join(@config.project_dir, environment.output_path, 'docker-compose.yml')
56
+
57
+ puts "Writing docker compose to #{compose_file}"
58
+ docker_compose_generator = DockerComposeGenerator.new @config, environment
59
+ docker_compose_generator.write compose_file
60
+ end
61
+
62
+ def generate_nginx_config(do_rebuild)
63
+ vhost_renderer = ERB.new(File.read(File.join(@config.base_dir, 'templates', 'nginx', 'vhost.conf.erb')))
64
+ sites = {}
65
+ grouped_domains.each_pair do |site_name, page_config|
66
+ full_site_name = "#{site_name}.lvh.me"
67
+ puts "Writing vhost for: #{full_site_name}"
68
+ expires = @deploy_config.expires
69
+ File.write File.join(@nginx_conf_dir, "#{site_name}.conf"), vhost_renderer.result(binding)
70
+
71
+ sites[site_name] = "#{site_name}.lvh.me:8080"
72
+
73
+ page_config.each do |config|
74
+ sites["#{site_name}#{config[:baseurl]}"] = "#{site_name}.lvh.me:8080#{config[:baseurl]}"
75
+ end if page_config.count > 1
76
+ end
77
+
78
+ puts 'Generating index.html'
79
+ renderer = ERB.new(File.read(File.join(@config.base_dir, 'templates', 'nginx', 'index.html.erb')))
80
+ File.write File.join(@config.output_site_path, 'index.html'), renderer.result(binding)
81
+
82
+ puts 'Copy default vhost'
83
+ FileUtils.cp File.join(@config.base_dir, 'templates', 'nginx', 'default-vhost.conf'), File.join(@nginx_conf_dir, 'default.conf')
84
+ end
85
+
86
+ def prepare_varnish
87
+ docker_folder = File.join(@config.project_dir, 'docker')
88
+ FileUtils.mkdir_p docker_folder
89
+ puts "Checkout repositories in #{docker_folder}"
90
+
91
+ if File.exist? "#{docker_folder}/varnish"
92
+ cmd = "cd #{docker_folder}/varnish && git pull"
93
+ else
94
+ cmd = "git clone -q -b develop https://github.com/Odania-IT/odania-varnish.git #{docker_folder}/varnish"
95
+ end
96
+ puts " -> Executing #{cmd}"
97
+ puts `#{cmd}`
98
+ exit 1 unless $?.success?
99
+
100
+ if File.exist? "#{docker_folder}/varnish-generator"
101
+ cmd = "cd #{docker_folder}/varnish-generator && git pull"
102
+ else
103
+ cmd = "git clone -q https://github.com/Odania-IT/odania-varnish-generator.git #{docker_folder}/varnish-generator"
104
+ end
105
+ puts " -> Executing #{cmd}"
106
+ puts `#{cmd}`
107
+ exit 1 unless $?.success?
108
+
109
+ puts 'Prepare varnish secret'
110
+ File.write File.join(docker_folder, 'varnish', 'varnish-secret'), @deploy_config.varnish_secret
111
+ File.write File.join(docker_folder, 'varnish-generator', 'varnish-secret'), @deploy_config.varnish_secret
112
+ end
113
+
114
+ def grouped_domains
115
+ result = Hash.new { |k, v| k[v] = [] }
116
+
117
+ @generator_config.jekyll_config['pages'].each do |page|
118
+ uri = URI.parse(page['url'])
119
+ host = uri.host
120
+ result[host] << {baseurl: page['baseurl'], relative_path: @generator_config.page_path(page)}
121
+ end
122
+
123
+ puts result.inspect
124
+ result
125
+ end
126
+
127
+ class DockerComposeGenerator
128
+ attr_reader :nginx_volume_html, :nginx_volume_conf_d, :nginx_volume_nginx_conf, :compose_images
129
+
130
+ def initialize(config, environment)
131
+ @nginx_volume_html = "#{config.output_site_path}:/srv:ro"
132
+ @nginx_volume_conf_d = "#{@nginx_conf_dir}:/etc/nginx/conf.d:ro"
133
+ @nginx_volume_nginx_conf = "#{File.join(config.output_path, 'nginx', 'nginx.conf')}:/etc/nginx/nginx.conf"
134
+ @compose_images = environment.deploy_module.compose_images
135
+ @erb_template = File.join(config.base_dir, 'templates', 'docker-compose', 'docker-compose.yml.erb')
136
+ end
137
+
138
+ def render
139
+ ERB.new(File.read(@erb_template)).result(binding)
140
+ end
141
+
142
+ def write(out_dir)
143
+ File.write out_dir, render
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,73 @@
1
+ module OdaniaStaticPages
2
+ module Deploy
3
+ class Rsync
4
+ def initialize
5
+ @config = OdaniaStaticPages.config
6
+ @deploy_config = @config.current_environment.deploy_module
7
+ @local_state = '_local_state.yml'
8
+ end
9
+
10
+ def prepare
11
+ puts 'Preparing rsync state'
12
+ load_state
13
+ save_state
14
+ end
15
+
16
+ def publish(color, do_rebuild)
17
+ puts 'Rsync website'
18
+ load_state
19
+ color = color.nil? ? @state[:color] : color
20
+ new_color = 'green'.eql?(color) ? 'blue' : 'green'
21
+ puts " -> Current color: #{color}"
22
+ @site_path = @config.output_site_path
23
+ puts " -> Deploying to color: #{new_color} [Path: #{@site_path}]"
24
+
25
+ @deploy_config.targets[new_color].each do |target|
26
+ puts
27
+ puts
28
+ puts "Syncing target #{target} " + '-' * 50
29
+
30
+ cmd = "cd #{@site_path} && rsync #{@deploy_config.rsync_options} . #{target}"
31
+ puts "Executing: #{cmd}"
32
+ puts `#{cmd}`.split("\n").join("\n ")
33
+
34
+ unless $?.success?
35
+ puts 'Error during rsync!!'
36
+ exit 1
37
+ end
38
+ end
39
+
40
+ @state[:color] = new_color
41
+ save_state
42
+
43
+ @config.current_environment.do_notify new_color, color
44
+ puts
45
+ puts "Finished deploying color #{new_color}"
46
+ end
47
+
48
+ private
49
+
50
+ def load_state
51
+ @state = {color: 'blue'}
52
+ cmd = "rsync #{@deploy_config.state_file} #{@local_state}"
53
+ puts "Syncing state: #{cmd}"
54
+ puts `#{cmd}`
55
+
56
+ @state = YAML.load_file(@local_state).symbolize_keys! if $?.success?
57
+ @state
58
+ end
59
+
60
+ def save_state
61
+ File.write @local_state, YAML.dump(@state)
62
+ cmd = "rsync #{@local_state} #{@deploy_config.state_file}"
63
+ puts "Syncing state: #{cmd}"
64
+ puts `#{cmd}`
65
+
66
+ unless $?.success?
67
+ puts 'Error saving state!!'
68
+ exit 1
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,165 @@
1
+ module OdaniaStaticPages
2
+ module Deploy
3
+ class S3
4
+ def initialize
5
+ @config = OdaniaStaticPages.config
6
+ @s3_config = @config.current_environment.deploy_module
7
+ params = {
8
+ region: @s3_config.region
9
+ }
10
+ params[:profile] = @s3_config.profile unless @s3_config.profile.nil?
11
+
12
+ puts "Configuring AWS with params: #{params}"
13
+ Aws.config.update(params)
14
+ end
15
+
16
+ def prepare
17
+ tags = @s3_config.tags
18
+ logging_stack_name = 'odania-logging'
19
+ params = {
20
+ BucketName: @s3_config.logging_bucket
21
+ }
22
+ Stacker.create_or_update_stack(logging_stack_name, File.join(@config.base_dir, 'cf-templates', 's3-logging.yml'), params, nil, nil, tags)
23
+
24
+ params = {
25
+ BucketName: @s3_config.state_bucket
26
+ }
27
+ Stacker.create_or_update_stack('odania-state', File.join(@config.base_dir, 'cf-templates', 's3-state.yml'), params, nil, nil, tags)
28
+
29
+ params = {
30
+ BucketNameGreen: @s3_config.bucket_name_green,
31
+ BucketNameBlue: @s3_config.bucket_name_blue,
32
+ LoggingStackName: logging_stack_name
33
+ }
34
+ Stacker.create_or_update_stack('odania-static-http', File.join(@config.base_dir, 'cf-templates', 's3-http.yml'), params, logging_stack_name, nil, tags)
35
+ end
36
+
37
+ def publish(color)
38
+ puts 'Publishing website to s3'
39
+ load_state
40
+ color = color.nil? ? @state[:color] : color
41
+ new_color = 'green'.eql?(color) ? 'blue' : 'green'
42
+ puts " -> Current color: #{color}"
43
+ @site_path = @config.output_site_path
44
+ puts " -> Deploying to color: #{new_color} [Path: #{@site_path}]"
45
+
46
+ @uploaded_files = []
47
+ bucket_name = 'green'.eql?(new_color) ? @s3_config.bucket_name_green : @s3_config.bucket_name_blue
48
+ recursive_file_upload bucket_name, @site_path
49
+ delete_not_uploaded_files bucket_name
50
+
51
+ @state[:color] = new_color
52
+ save_state
53
+
54
+ url = bucket_url bucket_name
55
+
56
+ @config.current_environment.do_notify new_color, color
57
+ puts
58
+ puts "Finished deploying color #{new_color} to bucket #{bucket_name}"
59
+ puts "Public url: #{url}"
60
+ end
61
+
62
+ private
63
+
64
+ def client
65
+ @s3_client = Aws::S3::Client.new if @s3_client.nil?
66
+ @s3_client
67
+ end
68
+
69
+ def bucket_url(bucket_name)
70
+ bucket = Aws::S3::Bucket.new bucket_name
71
+ bucket.url
72
+ end
73
+
74
+ def s3_exists?(bucket, key)
75
+ result = client.list_objects({bucket: bucket, prefix: key})
76
+
77
+ result.contents.each do |content|
78
+ return true if key.eql? content.key
79
+ end
80
+
81
+ false
82
+ end
83
+
84
+ def s3_files_in_bucket(bucket)
85
+ is_truncated = true
86
+ next_marker = nil
87
+ result = []
88
+
89
+ while is_truncated
90
+ params = {bucket: bucket}
91
+ params[:next_marker] = next_marker unless next_marker.nil?
92
+ response = client.list_objects(params)
93
+
94
+ response.contents.each do |content|
95
+ result << content.key
96
+ end
97
+
98
+ next_marker = response.next_marker
99
+ is_truncated = response.is_truncated
100
+ end
101
+
102
+ result
103
+ end
104
+
105
+ def recursive_file_upload(bucket, path)
106
+ Dir.glob(File.join(path, '**')).each do |file|
107
+ if File.directory? file
108
+ recursive_file_upload bucket, file
109
+ else
110
+ target_file = file.gsub("#{@site_path}/", '')
111
+ content_type = MimeMagic.by_extension File.extname file
112
+ @uploaded_files << target_file
113
+ puts " *> #{file} => #{target_file} [Content-Type: #{content_type}]"
114
+
115
+ File.open(file, 'rb') do |opened_file|
116
+ client.put_object({
117
+ acl: 'public-read',
118
+ bucket: bucket,
119
+ key: target_file,
120
+ body: opened_file,
121
+ content_type: content_type.to_s,
122
+ server_side_encryption: 'AES256'
123
+ })
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ def delete_not_uploaded_files(bucket)
130
+ s3_files = s3_files_in_bucket bucket
131
+
132
+ new_files = @uploaded_files - s3_files
133
+ files_to_delete = s3_files - @uploaded_files
134
+
135
+ puts '*'*100
136
+ puts @uploaded_files
137
+ puts '*'*100
138
+ puts s3_files
139
+ puts '*'*100
140
+ puts "New Files: #{new_files}"
141
+ puts '*'*100
142
+ puts "Files to delete: #{files_to_delete}"
143
+ end
144
+
145
+ def load_state
146
+ @state = {color: 'blue'}
147
+ if s3_exists?(@s3_config.state_bucket, 'state.yml')
148
+ response = client.get_object({bucket: @s3_config.state_bucket, key: 'state.yml'})
149
+ @state = YAML.load response.body.read
150
+ end
151
+
152
+ @state
153
+ end
154
+
155
+ def save_state
156
+ client.put_object({
157
+ bucket: @s3_config.state_bucket,
158
+ key: 'state.yml',
159
+ body: YAML.dump(@state),
160
+ server_side_encryption: 'AES256'
161
+ })
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,112 @@
1
+ module OdaniaStaticPages
2
+ module Generator
3
+ class Jekyll
4
+ def init
5
+ puts 'Initliazing jekyll pages'
6
+ puts
7
+ setup_generator
8
+
9
+ FileUtils.mkdir_p @pages_path unless File.exist? @pages_path
10
+
11
+ unless File.exist? @jekyll_config_file
12
+ FileUtils.cp File.join(@config.base_dir, 'templates', 'jekyll', 'example_config.yml'), @jekyll_config_file
13
+ setup_generator
14
+ end
15
+
16
+ FileUtils.mkdir_p @generator_config.full_common_folder unless File.exist? @generator_config.full_common_folder
17
+
18
+ puts 'Initialize Gemfile'
19
+ gemfile_template = File.join(@config.base_dir, 'templates', 'jekyll', 'Gemfile.erb')
20
+ gem_extra = @generator_config.gem_extra
21
+ File.write File.join(@generator_config.full_common_folder, 'Gemfile'), ERB.new(File.read(gemfile_template)).result(binding)
22
+
23
+ puts 'Install gems'
24
+ puts `cd #{@generator_config.full_common_folder} && bundle check`
25
+ puts `cd #{@generator_config.full_common_folder} && bundle install --path ~/.gems` unless $?.success?
26
+
27
+ @jekyll_config['pages'].each do |page|
28
+ relative_page_path = @generator_config.page_path page
29
+ relative_page_path += page['baseurl'] unless page['baseurl'].empty?
30
+ page_path = File.join @pages_path, relative_page_path
31
+
32
+ puts '*' * 100
33
+ puts "Processing #{relative_page_path} => #{page_path}"
34
+
35
+ unless File.directory? page_path
36
+ puts "Creating page #{page['name']}"
37
+ `cd #{@pages_path} && octopress new #{relative_page_path}`
38
+ end
39
+
40
+ page_config = @generator_config.prepare_config page
41
+ current_config_file = File.join page_path, '_config.yml'
42
+ current_config = YAML.load_file current_config_file
43
+
44
+ unless current_config.eql? page_config
45
+ puts ' -> Updating config'
46
+ File.write current_config_file, YAML.dump(page_config)
47
+ end
48
+
49
+ @generator_config.link @config.base_dir, page_path, page
50
+
51
+ puts
52
+ end
53
+
54
+ end
55
+
56
+ def build(env)
57
+ puts 'Building all jekyll websites'
58
+ setup_generator
59
+
60
+ grouped_domains.each_pair do |site_name, page_config|
61
+ build_for_configs(page_config, site_name, @config.output_site_path, env)
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def setup_generator
68
+ @config = OdaniaStaticPages.config
69
+ @current_environment = @config.current_environment
70
+ @generator_config = @config.generator
71
+ @pages_path = @config.pages_path
72
+ @jekyll_config_file = @generator_config.jekyll_config_file
73
+ @jekyll_config = @generator_config.jekyll_config
74
+ end
75
+
76
+ def grouped_domains
77
+ result = Hash.new { |k, v| k[v] = [] }
78
+
79
+ @generator_config.jekyll_config['pages'].each do |page|
80
+ uri = URI.parse(page['url'])
81
+ host = uri.host
82
+ result[host] << {baseurl: page['baseurl'], relative_path: @generator_config.page_path(page)}
83
+ end
84
+
85
+ puts result.inspect
86
+ result
87
+ end
88
+
89
+ def build_site(site_path, options, jekyll_env='development')
90
+ puts 'Install gems'
91
+ puts `cd #{File.join(@generator_config.pages_dir, site_path)} && bundle check`
92
+ puts `cd #{File.join(@generator_config.pages_dir, site_path)} && bundle install --path ~/.gems` unless $?.success?
93
+
94
+ cmd = "cd #{ File.join(@generator_config.pages_dir, site_path) } && JEKYLL_ENV=#{jekyll_env} bundle exec jekyll build #{options}"
95
+ puts " -> Building site [cmd: #{cmd}]"
96
+ unless system(cmd)
97
+ puts "Error building site: #{site_path}"
98
+ exit 1
99
+ end
100
+ end
101
+
102
+ def build_for_configs(page_config, site_name, target_site_path, jekyll_env='development')
103
+ page_config.each do |config|
104
+ site_path = site_name
105
+ site_path = File.join(site_path, config[:baseurl]) unless config[:baseurl].nil?
106
+ options = "-d #{File.join(target_site_path, site_path)}"
107
+ build_site site_path, options, jekyll_env
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,7 @@
1
+ module OdaniaStaticPages
2
+ module Server
3
+ class Nginx
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ module OdaniaStaticPages
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/all'
2
+ require 'autostacker24'
3
+ require 'aws-sdk'
4
+ require 'erb'
5
+ require 'mimemagic'
6
+ require 'thor'
7
+ require 'uri'
8
+ require 'yaml'
9
+
10
+ require_relative 'odania_static_pages/cli'
11
+ require_relative 'odania_static_pages/config'
12
+ require_relative 'odania_static_pages/deploy/docker_compose'
13
+ require_relative 'odania_static_pages/deploy/rsync'
14
+ require_relative 'odania_static_pages/deploy/s3'
15
+ require_relative 'odania_static_pages/generator/jekyll'
16
+ require_relative 'odania_static_pages/server/nginx'
17
+ require_relative 'odania_static_pages/version'
18
+
19
+ module OdaniaStaticPages
20
+ def self.config(path=nil)
21
+ if @config.nil? or !path.nil?
22
+ @config = OdaniaStaticPages::Config.new(path)
23
+ @config.load!
24
+ end
25
+
26
+ @config
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require_relative 'lib/odania_static_pages/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'odania-static-pages'
8
+ spec.version = OdaniaStaticPages::VERSION
9
+ spec.authors = ['Mike Petersen']
10
+ spec.email = ['mike@odania-it.de']
11
+
12
+ spec.summary = %q{Helper For creating static pages}
13
+ spec.description = %q{Helper for creating static pages}
14
+ spec.homepage = 'http://www.odania.com'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = 'exe'
21
+ spec.executables = spec.files.grep(%r{^exe/}) {|f| File.basename(f)}
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_runtime_dependency 'activesupport'
25
+ spec.add_runtime_dependency 'autostacker24', '>= 2.8.0'
26
+ spec.add_runtime_dependency 'aws-sdk', '>= 3'
27
+ spec.add_runtime_dependency 'mimemagic'
28
+ spec.add_runtime_dependency 'thor'
29
+
30
+ spec.add_development_dependency 'bundler', '~> 1.15'
31
+ spec.add_development_dependency 'rake', '~> 10.0'
32
+ spec.add_development_dependency 'minitest', '~> 5.0'
33
+ end