support/gitlab-remote-development/setup_workspace.rb (65 lines of code) (raw):

#!/usr/bin/env ruby # # frozen_string_literal: true require 'socket' require_relative '../../lib/gdk' class SetupWorkspace ROOT_DIR = '/projects/gitlab-development-kit' GDK_SETUP_FLAG_FILE = "#{ROOT_DIR}/.cache/.gdk_setup_complete".freeze def initialize @hostname = Socket.gethostname @ip_address = Socket.ip_address_list.find(&:ipv4_private?)&.ip_address port = ENV.find { |key, _| key.include?('SERVICE_PORT_GDK') }&.last @url = ENV.fetch('GL_WORKSPACE_DOMAIN_TEMPLATE', '').gsub('${PORT}', port.to_s) end def run return GDK::Output.info(%(Nothing to do as we're not a GitLab Workspace.\n\n)) unless gitlab_workspace_context? if bootstrap_needed? success, duration = execute_bootstrap create_flag_file if success configure_telemetry send_telemetry(success, duration) if allow_sending_telemetry? else GDK::Output.info("#{GDK_SETUP_FLAG_FILE} exists, GDK has already been bootstrapped.\n\nRemove the #{GDK_SETUP_FLAG_FILE} to re-bootstrap.") end end private def gitlab_workspace_context? ENV.key?('GL_WORKSPACE_DOMAIN_TEMPLATE') && Dir.exist?(ROOT_DIR) end def bootstrap_needed? !File.exist?(GDK_SETUP_FLAG_FILE) end def execute_bootstrap start = Process.clock_gettime(Process::CLOCK_MONOTONIC) configure_gdk # Instead GDK::Shellout use Process.spawn to let the process reuse the interactive TTY. # This is cructial to run command like `gdk update` in parallel. pid = Process.spawn('support/gitlab-remote-development/remote-development-gdk-bootstrap.sh', chdir: ROOT_DIR) success = Process::Status.wait(pid).success? duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start [success, duration] end def allow_sending_telemetry? GDK.config.telemetry.enabled end def configure_gdk new_values = { 'listen_address' => @ip_address.to_s, 'gitlab.rails.hostname' => @url.to_s, 'gitlab.rails.https.enabled' => true, 'gitlab.rails.port' => 443, 'gitlab_shell.skip_setup' => true, 'gitaly.skip_setup' => true, 'vite.enabled' => true, 'vite.hot_module_reloading' => false, 'webpack.enabled' => false, 'telemetry.environment' => 'remote-development' } GDK.config.bury_multiple!(new_values) GDK.config.save_yaml! end def configure_telemetry answer = 'y' if GDK::Telemetry.team_member? answer ||= GDK::Output.prompt(GDK::Telemetry::PROMPT_TEXT) GDK::Telemetry.update_settings(answer) end def send_telemetry(success, duration) GDK::Telemetry.send_telemetry(success, 'setup-workspace', duration: duration) GDK::Telemetry.flush_events end def create_flag_file FileUtils.mkdir_p(File.dirname(GDK_SETUP_FLAG_FILE)) FileUtils.touch(GDK_SETUP_FLAG_FILE) GDK::Output.success("You can access your GDK here: https://#{@url}") end end SetupWorkspace.new.run if $PROGRAM_NAME == __FILE__