80 lines
2.7 KiB
Ruby
80 lines
2.7 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module GoogleCloud
|
||
|
class GeneratePipelineService < :: BaseService
|
||
|
ACTION_DEPLOY_TO_CLOUD_RUN = 'DEPLOY_TO_CLOUD_RUN'
|
||
|
ACTION_DEPLOY_TO_CLOUD_STORAGE = 'DEPLOY_TO_CLOUD_STORAGE'
|
||
|
|
||
|
def execute
|
||
|
commit_attributes = generate_commit_attributes
|
||
|
create_branch_response = ::Branches::CreateService.new(project, current_user)
|
||
|
.execute(commit_attributes[:branch_name], project.default_branch)
|
||
|
|
||
|
if create_branch_response[:status] == :error
|
||
|
return create_branch_response
|
||
|
end
|
||
|
|
||
|
branch = create_branch_response[:branch]
|
||
|
|
||
|
service = default_branch_gitlab_ci_yml.present? ? ::Files::UpdateService : ::Files::CreateService
|
||
|
|
||
|
commit_response = service.new(project, current_user, commit_attributes).execute
|
||
|
|
||
|
if commit_response[:status] == :error
|
||
|
return commit_response
|
||
|
end
|
||
|
|
||
|
success({ branch_name: branch.name, commit: commit_response })
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def action
|
||
|
@params[:action]
|
||
|
end
|
||
|
|
||
|
def generate_commit_attributes
|
||
|
if action == ACTION_DEPLOY_TO_CLOUD_RUN
|
||
|
branch_name = "deploy-to-cloud-run-#{SecureRandom.hex(8)}"
|
||
|
{
|
||
|
commit_message: 'Enable Cloud Run deployments',
|
||
|
file_path: '.gitlab-ci.yml',
|
||
|
file_content: pipeline_content('gcp/cloud-run.gitlab-ci.yml'),
|
||
|
branch_name: branch_name,
|
||
|
start_branch: branch_name
|
||
|
}
|
||
|
elsif action == ACTION_DEPLOY_TO_CLOUD_STORAGE
|
||
|
branch_name = "deploy-to-cloud-storage-#{SecureRandom.hex(8)}"
|
||
|
{
|
||
|
commit_message: 'Enable Cloud Storage deployments',
|
||
|
file_path: '.gitlab-ci.yml',
|
||
|
file_content: pipeline_content('gcp/cloud-storage.gitlab-ci.yml'),
|
||
|
branch_name: branch_name,
|
||
|
start_branch: branch_name
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def default_branch_gitlab_ci_yml
|
||
|
@default_branch_gitlab_ci_yml ||= project.repository.gitlab_ci_yml_for(project.default_branch)
|
||
|
end
|
||
|
|
||
|
def pipeline_content(include_path)
|
||
|
gitlab_ci_yml = Gitlab::Config::Loader::Yaml.new(default_branch_gitlab_ci_yml || '{}').load!
|
||
|
append_remote_include(gitlab_ci_yml, "https://gitlab.com/gitlab-org/incubation-engineering/five-minute-production/library/-/raw/main/#{include_path}")
|
||
|
end
|
||
|
|
||
|
def append_remote_include(gitlab_ci_yml, include_url)
|
||
|
stages = gitlab_ci_yml['stages'] || []
|
||
|
gitlab_ci_yml['stages'] = (stages + %w[build test deploy]).uniq
|
||
|
|
||
|
includes = gitlab_ci_yml['include'] || []
|
||
|
includes = Array.wrap(includes)
|
||
|
includes << { 'remote' => include_url }
|
||
|
gitlab_ci_yml['include'] = includes.uniq
|
||
|
|
||
|
gitlab_ci_yml.to_yaml
|
||
|
end
|
||
|
end
|
||
|
end
|