diff options
Diffstat (limited to 'scripts/review_apps/automated_cleanup.rb')
-rwxr-xr-x | scripts/review_apps/automated_cleanup.rb | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/scripts/review_apps/automated_cleanup.rb b/scripts/review_apps/automated_cleanup.rb index 90dc0fd418e..e6efbca9e86 100755 --- a/scripts/review_apps/automated_cleanup.rb +++ b/scripts/review_apps/automated_cleanup.rb @@ -8,6 +8,10 @@ class AutomatedCleanup attr_reader :project_path, :gitlab_token DEPLOYMENTS_PER_PAGE = 100 + ENVIRONMENT_PREFIX = { + review_app: 'review/', + docs_review_app: 'review-docs/' + }.freeze IGNORED_HELM_ERRORS = [ 'transport is closing', 'error upgrading connection', @@ -62,13 +66,14 @@ class AutomatedCleanup releases_to_delete = [] + # Delete environments via deployments gitlab.deployments(project_path, per_page: DEPLOYMENTS_PER_PAGE, sort: 'desc').auto_paginate do |deployment| break if Time.parse(deployment.created_at) < deployments_look_back_threshold environment = deployment.environment next unless environment - next unless environment.name.start_with?('review/') + next unless environment.name.start_with?(ENVIRONMENT_PREFIX[:review_app]) next if checked_environments.include?(environment.slug) last_deploy = deployment.created_at @@ -92,6 +97,10 @@ class AutomatedCleanup checked_environments << environment.slug end + delete_stopped_environments(environment_type: :review_app, checked_environments: checked_environments, last_updated_threshold: delete_threshold) do |environment| + releases_to_delete << Tooling::Helm3Client::Release.new(environment.slug, 1, environment.updated_at, nil, nil, review_apps_namespace) + end + delete_helm_releases(releases_to_delete) end @@ -102,14 +111,12 @@ class AutomatedCleanup stop_threshold = threshold_time(days: days_for_stop) delete_threshold = threshold_time(days: days_for_delete) - max_delete_count = 1000 - delete_count = 0 - + # Delete environments via deployments gitlab.deployments(project_path, per_page: DEPLOYMENTS_PER_PAGE, sort: 'desc').auto_paginate do |deployment| environment = deployment.environment next unless environment - next unless environment.name.start_with?('review-docs/') + next unless environment.name.start_with?(ENVIRONMENT_PREFIX[:docs_review_app]) next if checked_environments.include?(environment.slug) last_deploy = deployment.created_at @@ -120,15 +127,12 @@ class AutomatedCleanup stop_environment(environment, deployment) if environment_state && environment_state != 'stopped' end - if deployed_at < delete_threshold - delete_environment(environment, deployment) - delete_count += 1 - - break if delete_count > max_delete_count - end + delete_environment(environment, deployment) if deployed_at < delete_threshold checked_environments << environment.slug end + + delete_stopped_environments(environment_type: :docs_review_app, checked_environments: checked_environments, last_updated_threshold: delete_threshold) end def perform_helm_releases_cleanup!(days:) @@ -171,8 +175,9 @@ class AutomatedCleanup nil end - def delete_environment(environment, deployment) - print_release_state(subject: 'Review app', release_name: environment.slug, release_date: deployment.created_at, action: 'deleting') + def delete_environment(environment, deployment = nil) + release_date = deployment ? deployment.created_at : environment.updated_at + print_release_state(subject: 'Review app', release_name: environment.slug, release_date: release_date, action: 'deleting') gitlab.delete_environment(project_path, environment.id) rescue Gitlab::Error::Forbidden @@ -187,6 +192,24 @@ class AutomatedCleanup puts "Review app '#{environment.name}' / '#{environment.slug}' (##{environment.id}) is forbidden: skipping it" end + def delete_stopped_environments(environment_type:, checked_environments:, last_updated_threshold:) + gitlab.environments(project_path, per_page: DEPLOYMENTS_PER_PAGE, sort: 'desc', states: 'stopped', search: ENVIRONMENT_PREFIX[environment_type]).auto_paginate do |environment| + next if skip_environment?(environment: environment, checked_environments: checked_environments, last_updated_threshold: last_updated_threshold, environment_type: environment_type) + + yield environment if delete_environment(environment) + + checked_environments << environment.slug + end + end + + def skip_environment?(environment:, checked_environments:, last_updated_threshold:, environment_type:) + return true unless environment.name.start_with?(ENVIRONMENT_PREFIX[environment_type]) + return true if checked_environments.include?(environment.slug) + return true if Time.parse(environment.updated_at) > last_updated_threshold + + false + end + def helm_releases args = ['--all', '--date'] |