summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2015-11-03 21:28:07 +0100
committerKamil Trzcinski <ayufan@ayufan.eu>2015-11-04 15:44:37 +0100
commite0fdbfd3f2cadd7ad9ce524425e93cd6225c9d22 (patch)
tree58f5ecef911c3c6f36a3b9c66b649631b5683a7d
parent39b7a99361e04784d9dfe54a8ca38368b8cfe0aa (diff)
downloadgitlab-ce-e0fdbfd3f2cadd7ad9ce524425e93cd6225c9d22.tar.gz
Serve static pages
-rw-r--r--app/models/ci/build.rb6
-rw-r--r--app/workers/pages_updater_worker.rb55
-rw-r--r--config/initializers/1_settings.rb1
-rw-r--r--lib/ci/gitlab_ci_yaml_processor.rb15
4 files changed, 77 insertions, 0 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index c8a1e00d5f1..243b155d860 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -104,6 +104,12 @@ module Ci
build.update_coverage
end
end
+
+ after_transition any => :success do |build, transition|
+ if build.name == 'pages' && build.artifact_file?
+ PagesUpdaterWorker.perform_async(build.id)
+ end
+ end
end
def ignored?
diff --git a/app/workers/pages_updater_worker.rb b/app/workers/pages_updater_worker.rb
new file mode 100644
index 00000000000..d7db37ccdcc
--- /dev/null
+++ b/app/workers/pages_updater_worker.rb
@@ -0,0 +1,55 @@
+class PagesUpdaterWorker
+ include Sidekiq::Worker
+
+ sidekiq_options queue: :pages
+
+ def perform(build_id)
+ @build_id = build_id
+ return unless valid?
+
+ FileUtils.mkdir_p(tmp_path)
+
+ Dir.mktmpdir(nil, tmp_path) do |dir|
+ cmd = %W(tar -zxf #{build.artifact_file.path} -C #{dir})
+ return unless system(*cmd)
+ return unless valid?
+
+ public_dir = File.join(dir, 'public')
+ return unless File.exists?(public_dir)
+
+ FileUtils.mkdir_p(pages_path)
+ if File.exists?(pages_path)
+ FileUtils.move(pages_path, old_pages_path)
+ end
+ FileUtils.move(public_dir, pages_path)
+ FileUtils.rm_r(old_pages_path)
+ end
+ end
+
+ private
+
+ def valid?
+ # check if ref is still recent one
+ build && build.artifact_file? && build.sha == gl_project.commit.sha
+ end
+
+ def build
+ @build ||= Ci::Build.find(@build_id)
+ end
+
+ def gl_project
+ @gl_project ||= build.gl_project
+ end
+
+ def tmp_path
+ @tmp_path ||= File.join(Settings.gitlab_ci.pages_path, 'tmp')
+ end
+
+ def pages_path
+ @pages_path ||= File.join(Settings.gitlab_ci.pages_path, gl_project.path_with_namespace)
+ end
+
+ def old_pages_path
+ @old_pages_path ||= File.expand_path("#{pages_path}.#{SecureRandom.hex}")
+ end
+end
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index 7001c05aa32..5232f038e5b 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -186,6 +186,7 @@ Settings.gitlab_ci['add_pusher'] = false if Settings.gitlab_ci['add_pus
Settings.gitlab_ci['url'] ||= Settings.send(:build_gitlab_ci_url)
Settings.gitlab_ci['builds_path'] = File.expand_path(Settings.gitlab_ci['builds_path'] || "builds/", Rails.root)
Settings.gitlab_ci['artifacts_path'] = File.expand_path('shared/artifacts/', Rails.root)
+Settings.gitlab_ci['pages_path'] = File.expand_path('shared/pages/', Rails.root)
Settings.gitlab_ci['max_artifact_size'] ||= 100
diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb
index 6f9af5388ca..e4da37d178f 100644
--- a/lib/ci/gitlab_ci_yaml_processor.rb
+++ b/lib/ci/gitlab_ci_yaml_processor.rb
@@ -20,6 +20,7 @@ module Ci
@config = @config.deep_symbolize_keys
initial_parsing
+ inject_pages
validate!
end
@@ -38,6 +39,20 @@ module Ci
@stages || DEFAULT_STAGES
end
+ def inject_pages
+ return unless stages.include?('deploy')
+ return if @jobs.include?('pages')
+
+ @jobs['pages'] = {
+ stage: 'deploy',
+ image: 'jekyll/jekyll:builder',
+ script: 'jekyll build --destination public',
+ artifacts: [
+ 'public/',
+ ]
+ }
+ end
+
private
def initial_parsing