diff --git a/providers/lib/job_tracker.rb b/providers/lib/job_tracker.rb index 48d2aee70b471295b97a3da0ad3d22ff2c693350..7e9f7ac142cda260ac8b4d3ddb0b42c1fb7263a7 100644 --- a/providers/lib/job_tracker.rb +++ b/providers/lib/job_tracker.rb @@ -88,19 +88,58 @@ class JobTracker def find_hostname(tbox_group) 1.upto(100000) do |i| hostname = tbox_group + "-#{i}" - return hostname unless has_hostname(hostname) + + # 检查jobs中是否已存在该hostname + next if has_hostname(hostname) + + next if hostname_conflict?(tbox_group, hostname) + + return hostname end raise "Cannot find non-conflict hostname for #{tbox_group}" end private + def hostname_conflict?(tbox_group, hostname) + if tbox_group.start_with?("dc") + # 检查docker容器名称是否冲突 + docker_container_exists?(hostname) + elsif tbox_group.start_with?("vm") + # 检查vm的pid文件是否已存在 + vm_pid_file_exists?(hostname) + else + false + end + end + def has_hostname(hostname) @jobs.any? do |_, v| v[:hostname] == hostname end end + def docker_container_exists?(hostname) + # 使用docker inspect检查容器是否存在 + exists = system("docker inspect #{hostname} > /dev/null 2>&1") + if exists + puts "WARNING: Docker container #{hostname} already exists" + end + exists + rescue + false + end + + def vm_pid_file_exists?(hostname) + #检查/var/lib/docker/compass-ci/providers/pids目录下的pid文件是否重复 + pid_file_path = "/var/lib/docker/compass-ci/providers/pids/#{hostname}" + exists = File.exist?(pid_file_path) + if exists + puts "WARNING: VM PID file #{pid_file_path} already exists" + end + exists + end + def job_file_path(job_id) File.join(ENV["JOBS_DIR"], "#{job_id}.yaml") end