diff options
author | Kamil Trzcinski <ayufan@ayufan.eu> | 2015-11-03 21:28:07 +0100 |
---|---|---|
committer | Kamil Trzcinski <ayufan@ayufan.eu> | 2015-11-04 15:44:37 +0100 |
commit | e0fdbfd3f2cadd7ad9ce524425e93cd6225c9d22 (patch) | |
tree | 58f5ecef911c3c6f36a3b9c66b649631b5683a7d | |
parent | 39b7a99361e04784d9dfe54a8ca38368b8cfe0aa (diff) | |
download | gitlab-ce-e0fdbfd3f2cadd7ad9ce524425e93cd6225c9d22.tar.gz |
Serve static pages
-rw-r--r-- | app/models/ci/build.rb | 6 | ||||
-rw-r--r-- | app/workers/pages_updater_worker.rb | 55 | ||||
-rw-r--r-- | config/initializers/1_settings.rb | 1 | ||||
-rw-r--r-- | lib/ci/gitlab_ci_yaml_processor.rb | 15 |
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 |