in azure-devops/azext_devops/dev/pipelines/pipeline_create.py [0:0]
def _create_and_get_yml_path(cix_client, repository_type, repo_id, repo_name, branch, # pylint: disable=too-many-locals, too-many-statements
service_endpoint, project, organization):
logger.debug('No yaml file was given. Trying to find the yaml file in the repo.')
queue_branch = branch
default_yml_exists = False
yml_names = []
yml_options = []
configurations = cix_client.get_configurations(
project=project, repository_type=repository_type,
repository_id=repo_id, branch=branch, service_connection_id=service_endpoint)
for configuration in configurations:
if configuration.path.strip('/') == 'azure-pipelines.yml':
default_yml_exists = True
logger.debug('The repo has a yaml pipeline definition. Path: %s', configuration.path)
custom_name = 'Existing yaml (path={})'.format(configuration.path)
yml_names.append(custom_name)
yml_options.append(YmlOptions(name=custom_name, content=configuration.content, id='customid',
path=configuration.path))
recommendations = cix_client.get_template_recommendations(
project=project, repository_type=repository_type,
repository_id=repo_id, branch=branch, service_connection_id=service_endpoint)
logger.debug('List of recommended templates..')
# sort recommendations
from operator import attrgetter
recommendations = sorted(recommendations, key=attrgetter('recommended_weight'), reverse=True)
for recommendation in recommendations:
yml_names.append(recommendation.name)
yml_options.append(YmlOptions(name=recommendation.name, content=recommendation.content,
id=recommendation.id, description=recommendation.description,
params=recommendation.parameters, assets=recommendation.assets))
temp_filename = None
files = []
yml_selection_index = 0
proceed_selection = 1
while proceed_selection == 1:
proceed_selection = 0
# Clear files since user can change the template now
del files[:]
yml_selection_index = prompt_user_friendly_choice_list("Which template do you want to use for this pipeline?",
yml_names)
if yml_options[yml_selection_index].params:
yml_options[yml_selection_index].content, yml_options[yml_selection_index].assets = _handle_yml_props(
params_required=yml_options[yml_selection_index].params,
template_id=yml_options[yml_selection_index].id,
cix_client=cix_client, repo_name=repo_name, organization=organization, project=project)
temp_dir = tempfile.mkdtemp(prefix='AzurePipelines_')
temp_filename = os.path.join(temp_dir, 'azure-pipelines.yml')
f = open(temp_filename, mode='w')
f.write(yml_options[yml_selection_index].content)
f.close()
assets = yml_options[yml_selection_index].assets
if assets:
for asset in assets:
files.append(Files(asset.destination_path, asset.content))
view_choice = prompt_user_friendly_choice_list(
'Do you want to view/edit the template yaml before proceeding?',
['Continue with generated yaml', 'View or edit the yaml'])
if view_choice == 1:
open_file(temp_filename)
proceed_selection = prompt_user_friendly_choice_list(
'Do you want to proceed creating a pipeline?',
['Proceed with this yaml', 'Choose another template'])
# Read updated data from the file
f = open(temp_filename, mode='r')
content = f.read()
f.close()
delete_dir(temp_dir)
checkin_path = 'azure-pipelines.yml'
if default_yml_exists and not yml_options[yml_selection_index].path: # We need yml path from user
logger.warning('A yaml file azure-pipelines.yml already exists in the repository root.')
checkin_path = prompt_not_empty(
msg='Enter a yaml file path to checkin the new pipeline yaml in the repository? ',
help_string='e.g. /new_azure-pipeline.yml to add in the root folder.')
print('')
files.append(Files(checkin_path, content))
print('Files to be added to your repository ({numfiles})'.format(numfiles=len(files)))
count_file = 1
for file in files:
print('{index}) {file}'.format(index=count_file, file=file.path))
count_file = count_file + 1
print('')
if default_yml_exists and checkin_path.strip('/') == 'azure-pipelines.yml':
print('Edits on the existing yaml can be done in the code repository.')
else:
queue_branch = push_files_to_repository(organization, project, repo_name, branch, files, repository_type)
return checkin_path, queue_branch