mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-08-03 15:53:48 +00:00
175 lines
5.5 KiB
Ruby
175 lines
5.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Backup
|
|
module Cli
|
|
module Context
|
|
# This context is equivalent to a Source Install or GDK instance
|
|
#
|
|
# Any specific information from the GitLab installation will be
|
|
# automatically discovered from the current machine
|
|
class SourceContext
|
|
# Defaults defined in `config/initializers/1_settings.rb`
|
|
DEFAULT_SHARED_PATH = 'shared'
|
|
DEFAULT_CI_BUILDS_PATH = 'builds'
|
|
DEFAULT_JOBS_ARTIFACTS_PATH = 'artifacts'
|
|
DEFAULT_SECURE_FILES_PATH = 'ci_secure_files'
|
|
DEFAULT_CI_LFS_PATH = 'lfs-objects'
|
|
DEFAULT_PACKAGES = 'packages'
|
|
DEFAULT_PAGES = 'pages'
|
|
DEFAULT_REGISTRY_PATH = 'registry'
|
|
DEFAULT_TERRAFORM_STATE_PATH = 'terraform_state'
|
|
DEFAULT_UPLOADS_PATH = 'public' # based on GitLab's root folder
|
|
|
|
def gitlab_version
|
|
File.read(gitlab_basepath.join("VERSION")).strip.freeze
|
|
end
|
|
|
|
def backup_basedir
|
|
path = gitlab_config[env]['backup']['path']
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# CI Builds basepath
|
|
def ci_builds_path
|
|
path = gitlab_config.dig(env, 'gitlab_ci', 'builds_path') || DEFAULT_CI_BUILDS_PATH
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# Job Artifacts basepath
|
|
def ci_job_artifacts_path
|
|
path = gitlab_config.dig(env, 'artifacts', 'path') ||
|
|
gitlab_config.dig(env, 'artifacts', 'storage_path') ||
|
|
gitlab_shared_path.join(DEFAULT_JOBS_ARTIFACTS_PATH)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# CI Secure Files basepath
|
|
def ci_secure_files_path
|
|
path = gitlab_config.dig(env, 'ci_secure_files', 'storage_path') ||
|
|
gitlab_shared_path.join(DEFAULT_SECURE_FILES_PATH)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# CI LFS basepath
|
|
def ci_lfs_path
|
|
path = gitlab_config.dig(env, 'lfs', 'storage_path') ||
|
|
gitlab_shared_path.join(DEFAULT_CI_LFS_PATH)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# Packages basepath
|
|
def packages_path
|
|
path = gitlab_config.dig(env, 'packages', 'storage_path') ||
|
|
gitlab_shared_path.join(DEFAULT_PACKAGES)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# GitLab Pages basepath
|
|
def pages_path
|
|
path = gitlab_config.dig(env, 'pages', 'path') ||
|
|
gitlab_shared_path.join(DEFAULT_PAGES)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# Registry basepath
|
|
def registry_path
|
|
path = gitlab_config.dig(env, 'registry', 'path') ||
|
|
gitlab_shared_path.join(DEFAULT_REGISTRY_PATH)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# Terraform State basepath
|
|
def terraform_state_path
|
|
path = gitlab_config.dig(env, 'terraform_state', 'storage_path') ||
|
|
gitlab_shared_path.join(DEFAULT_TERRAFORM_STATE_PATH)
|
|
|
|
absolute_path(path)
|
|
end
|
|
|
|
# Upload basepath
|
|
def upload_path
|
|
path = gitlab_config.dig(env, 'uploads', 'storage_path') ||
|
|
gitlab_basepath.join(DEFAULT_UPLOADS_PATH)
|
|
|
|
absolute_path(path).join('uploads')
|
|
end
|
|
|
|
def config(object_type)
|
|
gitlab_config[object_type]
|
|
end
|
|
|
|
def env
|
|
@env ||= ActiveSupport::EnvironmentInquirer.new(
|
|
ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development")
|
|
end
|
|
|
|
def config_repositories_storages
|
|
gitlab_config.dig(env, 'repositories', 'storages')
|
|
end
|
|
|
|
def gitaly_backup_path
|
|
gitlab_config.dig(env, 'backup', 'gitaly_backup_path')
|
|
end
|
|
|
|
def gitaly_token
|
|
gitlab_config.dig(env, 'gitaly', 'token')
|
|
end
|
|
|
|
private
|
|
|
|
# Return the shared path used as a fallback base location to each blob type
|
|
# We use this to determine the storage location when everything else fails
|
|
# @return [Pathname]
|
|
def gitlab_shared_path
|
|
shared_path = gitlab_config.dig(env, 'shared', 'path') || DEFAULT_SHARED_PATH
|
|
|
|
Pathname(shared_path)
|
|
end
|
|
|
|
# Return a fullpath for a given path
|
|
#
|
|
# When the path is already a full one return itself as a Pathname
|
|
# otherwise uses gitlab_basepath as its base
|
|
# @param [String|Pathname] path
|
|
# @return [Pathname]
|
|
def absolute_path(path)
|
|
# Joins with gitlab_basepath when relative, otherwise return full path
|
|
Pathname(File.expand_path(path, gitlab_basepath))
|
|
end
|
|
|
|
# Return the GitLab base directory
|
|
# @return [Pathname]
|
|
def gitlab_basepath
|
|
return Pathname.new(GITLAB_PATH) if GITLAB_PATH
|
|
|
|
raise ::Gitlab::Backup::Cli::Error, 'GITLAB_PATH is missing'
|
|
end
|
|
|
|
def gitlab_config
|
|
return @gitlab_config unless @gitlab_config.nil?
|
|
|
|
@gitlab_config ||= build_gitlab_config.then do |config|
|
|
raise ::Gitlab::Backup::Cli::Error, 'Failed to load GitLab configuration file' unless config.loaded?
|
|
|
|
config
|
|
end
|
|
end
|
|
|
|
def build_gitlab_config
|
|
Gitlab::Backup::Cli::GitlabConfig.new(gitlab_basepath.join('config/gitlab.yml'))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|