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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
#!/usr/bin/env ruby
# frozen_string_literal: true
require 'tempfile'
require 'socket'
require 'optparse'
ADDR = 'socket'
def main(params) # rubocop:disable Metrics/MethodLength
gitaly_dir = File.realpath(params[:dir])
build_dir = File.join(gitaly_dir, '_build')
bin_dir = File.join(build_dir, 'bin')
git_path, use_bundled_git =
if params[:"bundled-git"]
['', true]
else
[File.join(build_dir, 'deps', 'git-distribution', 'bin-wrappers', 'git'), false]
end
version = IO.popen("#{File.join(bin_dir, 'gitaly')} -version").read.delete_prefix('Gitaly, version ').strip
version_from_file = IO.read(File.join(gitaly_dir, 'VERSION')).strip
# Use start_with? instead of == because the version output could use git describe, if it is a source install
# eg: Gitaly, version 1.75.0-14-gd1ecb43f
unless version.start_with?(version_from_file)
abort "\nversion check failed: VERSION file contained '#{version_from_file}'"\
" but 'gitaly -version' reported '#{version}'."\
' If you are working from a fork, please fetch the latest tags.'
end
Dir.mktmpdir do |dir|
Dir.chdir(dir)
gitlab_shell_dir = File.join(dir, 'gitlab-shell')
Dir.mkdir(gitlab_shell_dir)
File.write(File.join(gitlab_shell_dir, '.gitlab_shell_secret'), 'test_gitlab_shell_token')
write_gitaly_config('config.toml',
bin_dir: bin_dir,
dir: dir,
use_bundled_git: use_bundled_git,
git_path: git_path,
gitaly_dir: gitaly_dir,
gitlab_shell_dir: gitlab_shell_dir)
pid = nil
begin
start = Time.now
pid = spawn(File.join(bin_dir, 'gitaly'), 'config.toml')
wait_connect
puts
puts "\n\nconnection established after #{Time.now - start} seconds\n\n"
ensure
if pid
Process.kill('KILL', pid)
Process.wait(pid)
end
end
end
end
def write_gitaly_config(config_path, bin_dir:, dir:, use_bundled_git:, git_path:, gitaly_dir:, gitlab_shell_dir:) # rubocop:disable Metrics/ParameterLists
File.write(config_path, <<~CONFIG
socket_path = "#{ADDR}"
bin_dir = "#{bin_dir}"
[[storage]]
name = "default"
path = "#{dir}"
[git]
use_bundled_binaries = #{use_bundled_git}
bin_path = "#{git_path}"
[gitaly-ruby]
dir = "#{gitaly_dir}/ruby"
[gitlab-shell]
dir = "#{gitlab_shell_dir}"
[gitlab]
url = 'http://gitlab_url'
CONFIG
)
end
def wait_connect
repeats = 100
sleep_time = 0.1
repeats.times do
Socket.unix(ADDR)
return
rescue StandardError
print '.'
sleep(sleep_time)
end
puts "failed to connect to gitaly after #{repeats * sleep_time}s"
abort
end
params = {}
OptionParser.new do |parser|
parser.banner = "Usage: #{$0} [options] <GITALY_DIR>"
parser.on('--[no-]bundled-git', 'Set up Gitaly with bundled Git binaries')
end.parse!(into: params)
params[:dir] = ARGV.pop
abort 'Gitaly source directory not provided' if params[:dir].nil?
abort 'Extra arguments' unless ARGV.count.zero?
main(params)
|