Commit 012fe314 authored by Hordur Freyr Yngvason's avatar Hordur Freyr Yngvason Committed by Jan Provaznik

Fix broken update_project_templates rake task

This rake task had been broken for a while. This fixes the breakages,
adds a test to help avoid future breakages, and adds a few ergonomic
improvements to the task itself.
parent 11f82c89
...@@ -13,11 +13,15 @@ module Gitlab ...@@ -13,11 +13,15 @@ module Gitlab
end end
def archive_path def archive_path
Rails.root.join("vendor/project_templates/#{name}.tar.gz") self.class.archive_directory.join(archive_filename)
end
def archive_filename
"#{name}.tar.gz"
end end
def clone_url def clone_url
"https://gitlab.com/gitlab-org/project-templates/#{name}.git" "#{preview}.git"
end end
def ==(other) def ==(other)
...@@ -54,7 +58,7 @@ module Gitlab ...@@ -54,7 +58,7 @@ module Gitlab
end end
def archive_directory def archive_directory
Rails.root.join("vendor_directory/project_templates") Rails.root.join("vendor/project_templates")
end end
end end
end end
......
...@@ -5,25 +5,43 @@ namespace :gitlab do ...@@ -5,25 +5,43 @@ namespace :gitlab do
end end
desc "GitLab | Update project templates" desc "GitLab | Update project templates"
task :update_project_templates do task :update_project_templates, [] => :environment do |_task, args|
include Gitlab::ImportExport::CommandLineUtil # we need an instance method from Gitlab::ImportExport::CommandLineUtil and don't
# want to include it in the task, as this would affect subsequent tasks as well
downloader = Class.new do
extend Gitlab::ImportExport::CommandLineUtil
def self.call(uploader, upload_path)
download_or_copy_upload(uploader, upload_path)
end
end
template_names = args.extras.to_set
if Rails.env.production? if Rails.env.production?
puts "This rake task is not meant fo production instances".red raise "This rake task is not meant for production instances"
exit(1)
end end
admin = User.find_by(admin: true) admin = User.find_by(admin: true)
unless admin unless admin
puts "No admin user could be found".red raise "No admin user could be found"
exit(1)
end end
Gitlab::ProjectTemplate.all.each do |template| tmp_namespace_path = "tmp-project-import-#{Time.now.to_i}"
puts "Creating temporary namespace #{tmp_namespace_path}"
tmp_namespace = Namespace.create!(owner: admin, name: tmp_namespace_path, path: tmp_namespace_path)
templates = if template_names.empty?
Gitlab::ProjectTemplate.all
else
Gitlab::ProjectTemplate.all.select { |template| template_names.include?(template.name) }
end
templates.each do |template|
params = { params = {
import_url: template.clone_url, import_url: template.clone_url,
namespace_id: admin.namespace.id, namespace_id: tmp_namespace.id,
path: template.name, path: template.name,
skip_wiki: true skip_wiki: true
} }
...@@ -32,19 +50,17 @@ namespace :gitlab do ...@@ -32,19 +50,17 @@ namespace :gitlab do
project = Projects::CreateService.new(admin, params).execute project = Projects::CreateService.new(admin, params).execute
unless project.persisted? unless project.persisted?
puts project.errors.messages raise "Failed to create project: #{project.errors.messages}"
exit(1)
end end
loop do loop do
if project.finished? if project.import_finished?
puts "Import finished for #{template.name}" puts "Import finished for #{template.name}"
break break
end end
if project.failed? if project.import_failed?
puts "Failed to import from #{project_params[:import_url]}".red raise "Failed to import from #{project_params[:import_url]}"
exit(1)
end end
puts "Waiting for the import to finish" puts "Waiting for the import to finish"
...@@ -54,11 +70,23 @@ namespace :gitlab do ...@@ -54,11 +70,23 @@ namespace :gitlab do
end end
Projects::ImportExport::ExportService.new(project, admin).execute Projects::ImportExport::ExportService.new(project, admin).execute
download_or_copy_upload(project.export_file, template.archive_path) downloader.call(project.export_file, template.archive_path)
Projects::DestroyService.new(admin, project).execute
unless Projects::DestroyService.new(project, admin).execute
puts "Failed to destroy project #{template.name} (but namespace will be cleaned up later)"
end
puts "Exported #{template.name}".green puts "Exported #{template.name}".green
end end
puts "Done".green
success = true
ensure
if tmp_namespace
puts "Destroying temporary namespace #{tmp_namespace_path}"
tmp_namespace.destroy
end
puts "Done".green if success
end end
def update(template) def update(template)
......
...@@ -44,6 +44,12 @@ describe Gitlab::ProjectTemplate do ...@@ -44,6 +44,12 @@ describe Gitlab::ProjectTemplate do
end end
end end
describe '.archive_directory' do
subject { described_class.archive_directory }
it { is_expected.to be_a Pathname }
end
describe 'instance methods' do describe 'instance methods' do
subject { described_class.new('phoenix', 'Phoenix Framework', 'Phoenix description', 'link-to-template') } subject { described_class.new('phoenix', 'Phoenix Framework', 'Phoenix description', 'link-to-template') }
......
# frozen_string_literal: true
require 'rake_helper'
describe 'gitlab:update_project_templates rake task' do
let!(:tmpdir) { Dir.mktmpdir }
before do
Rake.application.rake_require 'tasks/gitlab/update_templates'
create(:admin)
allow(Gitlab::ProjectTemplate)
.to receive(:archive_directory)
.and_return(Pathname.new(tmpdir))
end
after do
FileUtils.rm_rf(tmpdir)
end
it 'updates valid project templates' do
expect { run_rake_task('gitlab:update_project_templates', ['rails']) }
.to change { Dir.entries(tmpdir) }
.by(['rails.tar.gz'])
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment