summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/gitlab/project_template.rb12
-rw-r--r--lib/tasks/gitlab/update_templates.rake47
-rw-r--r--spec/lib/gitlab/project_template_spec.rb4
3 files changed, 59 insertions, 4 deletions
diff --git a/lib/gitlab/project_template.rb b/lib/gitlab/project_template.rb
index 72fcda154c5..01f9492c860 100644
--- a/lib/gitlab/project_template.rb
+++ b/lib/gitlab/project_template.rb
@@ -11,13 +11,17 @@ module Gitlab
end
def file
- template_archive.open
+ archive_path.open
end
- def template_archive
+ def archive_path
Rails.root.join("vendor/project_templates/#{name}.tar.gz")
end
+ def clone_url
+ "https://gitlab.com/gitlab-org/project-templates/#{name}.git"
+ end
+
def ==(other)
name == other.name && title == other.title
end
@@ -34,6 +38,10 @@ module Gitlab
def find(name)
all.find { |template| template.name == name.to_s }
end
+
+ def archive_directory
+ Rails.root.join("vendor_directory/project_templates")
+ end
end
end
end
diff --git a/lib/tasks/gitlab/update_templates.rake b/lib/tasks/gitlab/update_templates.rake
index 59c32bbe7a4..26f6276e84b 100644
--- a/lib/tasks/gitlab/update_templates.rake
+++ b/lib/tasks/gitlab/update_templates.rake
@@ -4,6 +4,53 @@ namespace :gitlab do
TEMPLATE_DATA.each { |template| update(template) }
end
+ desc "GitLab | Update project templates"
+ task :update_project_templates do
+ if Rails.env.production?
+ puts "This rake task is not meant fo production instances".red
+ exit(1)
+ end
+ admin = User.find_by(admin: true)
+
+ unless admin
+ puts "No admin user could be found".red
+ exit(1)
+ end
+
+ Gitlab::ProjectTemplate.all.each do |template|
+ params = {
+ import_url: template.clone_url,
+ namespace_id: admin.namespace.id,
+ path: template.title,
+ skip_wiki: true
+ }
+ puts "Creating project for #{template.name}"
+ project = Projects::CreateService.new(admin, project).execute
+
+ loop do
+ if project.import_status == "finished"
+ puts "Import finished for #{template.name}"
+ break
+ end
+
+ if project.import_status == "failed"
+ puts "Failed to import from #{project_params[:import_url]}".red
+ exit(1)
+ end
+
+ puts "Waiting for the import to finish"
+ sleep(5)
+ project = project.reload
+ end
+
+ Projects::ImportExport::ExportService.new(project, admin).execute
+ FileUtils.cp(project.export_project_path, template.archive_path)
+ Projects::DestroyService.new(admin, project).execute
+ puts "Exported #{template.name}".green
+ end
+ puts "Done".green
+ end
+
def update(template)
sub_dir = template.repo_url.match(/([A-Za-z-]+)\.git\z/)[1]
dir = File.join(vendor_directory, sub_dir)
diff --git a/spec/lib/gitlab/project_template_spec.rb b/spec/lib/gitlab/project_template_spec.rb
index 5dc6059b49c..d95dab748fe 100644
--- a/spec/lib/gitlab/project_template_spec.rb
+++ b/spec/lib/gitlab/project_template_spec.rb
@@ -31,13 +31,13 @@ describe Gitlab::ProjectTemplate do
describe 'instance methods' do
subject { described_class.new('phoenix', 'Phoenix Framework') }
- it { is_expected.to respond_to(:logo_path, :file, :template_archive) }
+ it { is_expected.to respond_to(:logo_path, :file, :archive_path) }
end
describe 'validate all templates' do
described_class.all.each do |template|
it "#{template.name} has a valid archive" do
- archive = template.template_archive
+ archive = template.archive_path
logo = Rails.root.join("app/assets/images/#{template.logo_path}")
expect(File.exist?(archive)).to be(true)