aboutsummaryrefslogtreecommitdiff
blob: 153cc2fb165fc4be3bfabbd83f80c804f0d7c00c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
def run_ci(docker_image, num_of_packages)
	packages = []
	Package.order { [category, lower(name), version] }.each do |package|
		packages << package[:identifier]
	end

	if num_of_packages == :all
		packages = packages
	elsif num_of_packages == 0
		packages = packages.sample(5)
	elsif num_of_packages == :untested
		packages = []
		Package.exclude(tested: true).order { [category, lower(name), version] }.each do |package|
			packages << package[:identifier]
			next if [
				'virtual/rubygems',
				'dev-ruby/rake',
				'dev-ruby/rspec',
				'dev-ruby/rspec-core',
				'dev-ruby/rdoc'
			].include?("#{package[:category]}/#{package[:name]}")
			Package.where(Sequel.like(
				:dependencies,
				"#{package[:category]}/#{package[:name]} %",
				"% #{package[:category]}/#{package[:name]} %",
				"% #{package[:category]}/#{package[:name]}"
			)).each do |rdep|
				packages << rdep[:identifier]
			end
		end
	else
		packages = packages.sample(num_of_packages)
	end

	packages = packages.uniq
	packages.each do |package|
		docker_container = docker_image.run("/ruby-tinderbox/tinder.sh #{package}")
		docker_container.wait(36_000)

		tar = Tempfile.new('tar')
		File.open(tar, 'w') do |file|
			docker_container.copy('/ruby-tinderbox/ci-logs') do |chunk|
				file.write(chunk)
			end
		end
		Archive::Tar::Minitar.unpack(tar, File.dirname(File.expand_path(File.dirname(__FILE__))))
		tar.close
		tar.unlink

		docker_container.delete
	end
end

def update_ci
	Dir.glob('ci-logs/*/*/*') do |build|
		build_array = build.split('/')
		package_id = "#{build_array[1]}/#{build_array[2]}"
		time = build_array[3]

		if File.exist?("#{build}/succeeded")
			result = 'succeeded'
		elsif File.exist?("#{build}/failed")
			result = 'failed'
		elsif File.exist?("#{build}/timedout")
			result = 'timed out'
		end

		emerge_info = File.read("#{build}/emerge-info") if File.exist?("#{build}/emerge-info")
		emerge_pqv = File.read("#{build}/emerge-pqv") if File.exist?("#{build}/emerge-pqv")
		build_log = File.read("#{build}/build.log") if File.exist?("#{build}/build.log")
		gem_list = File.read("#{build}/gem-list") if File.exist?("#{build}/gem-list")

		Build.find_or_create(
			package_id: package_id,
			time: time,
			result: result,
			emerge_info: emerge_info,
			emerge_pqv: emerge_pqv,
			build_log: build_log,
			gem_list: gem_list
		)
	end
	Build.each do |build|
		Package.where(identifier: build[:package_id]).update(tested: true)
	end
end

def clear_ci
	Build.map(&:delete)
end