class Gitlab::QA::Component::InternetTunnel
def initialize
def initialize @docker = Docker::Engine.new @volumes = {} key_dir = ENV['CI_PROJECT_DIR'] || Dir.tmpdir @ssh_key = Tempfile.new('tunnel-ssh-private-key', key_dir) @ssh_key.write(ENV.fetch('TUNNEL_SSH_PRIVATE_KEY')) @ssh_key.close File.chmod(0o600, @ssh_key.path) @volumes['/root/.ssh/id_rsa'] = @ssh_key.path end
def instance
def instance raise ArgumentError, 'Please provide a block!' unless block_given? prepare start yield self ensure teardown end
def name
def name @name ||= "ssh-tunnel-#{SecureRandom.hex(4)}" end
def prepare
def prepare @docker.pull(DOCKER_IMAGE, DOCKER_IMAGE_TAG) return if @docker.network_exists?(network) @docker.network_create(network) end
def restart
def restart @docker.restart(name) end
def start
def start raise "Must set gitlab_hostname" unless @gitlab_hostname @docker.run(DOCKER_IMAGE, DOCKER_IMAGE_TAG, "-o StrictHostKeyChecking=no -N -R #{subdomain}:#{@gitlab_hostname}:80 #{ENV.fetch('TUNNEL_SSH_USER')}@#{tunnel_server_hostname}") do |command| command << '-d ' command << "--name #{name}" command << "--net #{network}" @volumes.to_h.each do |to, from| command.volume(from, to, 'Z') end end end
def subdomain
def subdomain @subdomain ||= rand(30_000..49_000) end
def teardown
def teardown raise 'Invalid instance name!' unless name @docker.stop(name) @docker.remove(name) @ssh_key.unlink end
def tunnel_server_hostname
def tunnel_server_hostname ENV.fetch("TUNNEL_SERVER_HOSTNAME") end
def url
def url "https://#{subdomain}.#{tunnel_server_hostname}" end