require'securerandom'require'net/http'require'uri'require'forwardable'require'openssl'moduleGitlabmoduleQAmoduleComponentclassGitlab<BaseextendForwardableattr_reader:releaseattr_accessor:tls,:disable_animations,:skip_availability_check,:runner_networkattr_writer:name,:relative_pathdef_delegators:release,:tag,:image,:editionGITLAB_CERTIFICATES_PATH=File.expand_path('../../../../tls_certificates/gitlab'.freeze,__dir__)GITALY_CERTIFICATES_PATH=File.expand_path('../../../../tls_certificates/gitaly/ssl'.freeze,__dir__)TRUSTED_CERTIFICATES_PATH=File.expand_path('../../../../tls_certificates/gitaly/trusted-certs'.freeze,__dir__)SSL_PATH='/etc/gitlab/ssl'.freezeTRUSTED_PATH='/etc/gitlab/trusted-certs'.freezedefinitializesuper@disable_animations=true@skip_availability_check=false@volumes[GITLAB_CERTIFICATES_PATH]=SSL_PATHself.release='CE'enddefomnibus_config=(config)@environment['GITLAB_OMNIBUS_CONFIG']=config.tr("\n",' ')enddefset_formless_login_tokenreturnifRuntime::Env.gitlab_qa_formless_login_token.to_s.strip.empty?@environment['GITLAB_OMNIBUS_CONFIG']="gitlab_rails['env'] = { 'GITLAB_QA_FORMLESS_LOGIN_TOKEN' => '#{Runtime::Env.gitlab_qa_formless_login_token}' }; #{@environment['GITLAB_OMNIBUS_CONFIG']||''}"enddefelastic_url=(url)@environment['ELASTIC_URL']=urlenddefrelease=(release)@release=QA::Release.new(release)enddefname@name||="gitlab-#{edition}-#{SecureRandom.hex(4)}"enddefaddress"#{scheme}://#{hostname}#{relative_path}"enddefschemetls?'https':'http'enddefporttls?'443':'80'enddefmtls@volumes.delete(GITLAB_CERTIFICATES_PATH)@volumes[GITALY_CERTIFICATES_PATH]=SSL_PATHset_trusted_certificatesenddefset_trusted_certificates@volumes[TRUSTED_CERTIFICATES_PATH]=TRUSTED_PATHenddefrelative_path@relative_path||=''enddefset_accept_insecure_certsRuntime::Env.accept_insecure_certs='true'enddefprepareprepare_gitlab_omnibus_configsuperenddefpulldocker.login(**release.login_params)ifrelease.login_paramssuperenddefprepare_gitlab_omnibus_configsetup_disable_animationsifdisable_animationsset_formless_login_tokensetup_application_settings_cache_expiryenddefsetup_disable_animations@environment['GITLAB_OMNIBUS_CONFIG']="gitlab_rails['gitlab_disable_animations'] = true; #{@environment['GITLAB_OMNIBUS_CONFIG']||''}"enddefsetup_application_settings_cache_expiry@environment['GITLAB_OMNIBUS_CONFIG']="gitlab_rails['application_settings_cache_seconds'] = 0; #{@environment['GITLAB_OMNIBUS_CONFIG']||''}"enddefstart# rubocop:disable Metrics/AbcSizeensure_configured!docker.run(image,tag)do|command|command<<"-d -p #{port}"command<<"--name #{name}"command<<"--net #{network}"command<<"--hostname #{hostname}"@volumes.to_h.eachdo|to,from|command.volume(to,from,'Z')endcommand.volume(File.join(Runtime::Env.host_artifacts_dir,name,'logs'),'/var/log/gitlab','Z')@environment.to_h.eachdo|key,value|command.env(key,value)end@network_aliases.to_a.eachdo|network_alias|command<<"--network-alias #{network_alias}"endendDocker::Command.execute("network connect --alias #{name}.#{network} --alias #{name}.#{runner_network}#{runner_network}#{name}")ifrunner_networkenddefreconfigure@docker.attach(name)do|line,wait|putsline# TODO, workaround which allows to detach from the container#breakifline=~/gitlab Reconfigured!/endenddefwait_until_readyreturnifskip_availability_checkifAvailability.new(name,relative_path: relative_path,scheme: scheme,protocol_port: port.to_i).check(300)sleep12# TODO, handle that betterputs' -> GitLab is available.'elseabort' -> GitLab unavailable!'endenddefsha_versionjson=@docker.read_file(@release.image,@release.tag,'/opt/gitlab/version-manifest.json')manifest=JSON.parse(json)manifest['software']['gitlab-rails']['locked_version']endprivatedefensure_configured!raise'Please configure an instance first!'unless[name,release,network].all?endclassAvailabilitydefinitialize(name,relative_path: '',scheme: 'http',protocol_port: 80)@docker=Docker::Engine.newhost=@docker.hostnameport=@docker.port(name,protocol_port).split(':').last@uri=URI.join("#{scheme}://#{host}:#{port}","#{relative_path}/",'help')enddefcheck(retries)print"Waiting for GitLab at `#{@uri}` to become available "retries.timesdoreturntrueifservice_available?print'.'sleep1endfalseendprivatedefservice_available?response=Net::HTTP.start(@uri.host,@uri.port,opts)do|http|http.head2(@uri.request_uri)endresponse.code.to_i==200rescueErrno::ECONNREFUSED,Errno::ECONNRESET,EOFErrorfalseenddefopts@uri.scheme=='https'?{use_ssl: true,verify_mode: OpenSSL::SSL::VERIFY_NONE}:{}endendendendendend