Cloning an Azure Devops yaml Pipeline - azure-devops

Azure Devops pipelines provide a clone functionality. This is super useful functionality for scaffolding pipelines. My yaml pipelines have a lot of variables, and it's difficult and error prone to reassign all of these variables from scratch.
The Azure Devops UI updated in the last week or so, and there doesn't seem to be an option to clone yaml pipelines anymore. Classic pipelines still have the clone option.
Can anyone figure out how to clone a yaml pipeline with the new UI?

Hmm I haven't used the clone feature, but have you investigated using variable groups or variable templates to make your life easier? You can link a variable group to Azure Key Vault to facilitate secrets.

I've never used a cloning option in YAML. But I wouldn't use so many Azure DevOps variables which were created in the UI. You have multiple options here:
Store the variables in your YAML file (not for secrets)
Store the variables in a YAML template (not for secrets)
Store the variables in a variable group (use Azure Key Vault or the Secure flag for secrets)
The variable group can be linked to multiple pipelines. But there is currently no scope available. So, if you have multiple environments, you have to name it like "myvariablegroup-dev", "myvariablegroup-prod". Hopefully, this feature to attach a variable group to an environment is coming in the near feature.

1,You can disable the multi-stage pipelines feature in preview features
On the top right corner of the page click the user profile and choose Preview features
Then disable the Multi-stage pipelines. Then you will see the clone option appear again.
2,The other workaround is to create a new pipeline and choose to use the Existing Azure PipelineS Yaml file while following the wizard. (which has the same effect with cloning yaml, they use the same azure-pipelines.yml file)
Then choose the same yaml file with the original pipeline.

Related

Is there a pattern for including Release Pipelines in Azure Dev Ops via Source Control and Automation?

Our team uses Azure Dev Ops for our source control and release pipelines. The release pipelines are not included in our source control and are created through ADO UI. These can be very complex; I exported one release and it was 7500 lines of json. I would like these pipeline definitions to be in the same source control as our source code for easy maintenance and review.
I see that there are tools for exporting the pipeline definition to json and an option in the UI to create a pipeline by importing json. Is there a pattern to use automation to leverage these import/export functions and have a pipeline that is updated based on the definition in my repo?
We are currently just using the UI to update the pipelines without any additional version control or review controls. I'm expecting some functionality like GitHub Actions where the pipeline definition is contained within the repo and automation picks up the files.
If you want to version control your pipelines, I suggest that you start using the yaml pipelines that exist in Azure Devops.
These can handle both build and release pipelines. The "Releases" tab in the GUI becomes obsolete, as all pipelines (both build and release) instead show up in the "Pipelines" tab. For release pipelines, use the deployment job type, which gives you access to automatic artifact handling and environment management.
Edit: So to answer the actual question, I do not know any way to version control the GUI (classic) pipelines. My strong recommendation is to migrate to yaml pipelines.

Azure DevOps single pipeline for multiple projects without multiple azure-pipelines.yml files

We have an Azure DevOps Pipeline defined as a template in a .yml file, and would like to use this to build 100+ projects.
There is zero parameterization to do, and the template essentially just runs against the project repo as-is.
Normally, we would just go into each of those project repos and create an azure-pipelines.yml file and reference the template pipeline, easy.
However, I would like to know if we can avoid creating these azure-pipelines.yml in each of the 100+ project repos. Is there some way to just run the template against 100+ repos, but as separate pipelines?
No.
YAML pipelines are based upon the YAML being stored in the application's repo, as code, alongside the application code. You can pull in templates from other repos, but you can't have one pipeline that is automatically valid for any repo.
Trying to use one template to build 100+ applications without the possibility of pinning the template to a specific version on an application by application basis is setting yourself up for a nightmare at some point in the future, when the template changes in such a way that it's no longer valid for a subset of your 100 applications.

Use a YAML template as a task/step/job/stage in classic pipelines [duplicate]

This question already has answers here:
Migrating existing (entire) Azure DevOps pipeline to YAML based pipelines (in bulk)
(3 answers)
Closed 2 years ago.
I have a number of existing build and release pipelines defined using the classic interface, but I'm switching over to using the newer YAML pipelines and templates. Converting the existing classic pipelines to YAML pipelines would be too much work, but I would like to define any new pipelines using YAML pipelines and templates. Would there be a way to still use the newly defined YAML templates from the existing classic pipelines if necessary?
Edit: to clarify, this is not a question about how to bulk migrate classic pipelines to YAML, but about using YAML templates in classic pipelines.
No. This is not possible. In terms of moving from Classic to YAML the Azure DevOps team works on tool which should help converting this. However, this is not ready yet. I check status of the task and it was moved again to planned.
Description of above mentioned task:
We'll add a migration tool to help convert your classic build pipelines to YAML. While there is a gesture to generate a snippet of YAML for selected tasks in the classic editor, there has been enough feedback from customers calling for a more complete experience to support this migration.
In the upcoming Sprint 178-Update, we will introduce a new "export to YAML" feature for designer build pipelines. Save your pipeline definition, then find "Export to YAML" on the ... menu.
The new full export replaces the "View as YAML" function found in the build editor. The older function was incomplete as it could only inspect what the web UI knew about the build, which sometimes led to incorrect YAML. The new feature takes into account exactly how the pipeline will be processed and has full fidelity with the designer pipeline.
Currently azure devops service is updated to Sprint-177.
No, but you can find "View YAML" on the job or task section to simplify the migration process:

What is the natural way to flow the build variables from build to the respective release in Azure DevOps Server 2019 (on prem)?

So, one option is create a file during the build with all the build variables and attach it as an artifact to the build.
Not a big deal, but I am wondering if this is the natural way to do it in Azure DevOps. Maybe there is some feature to enable it easily and I just do not see it?
According to your description, seems you just want to access the Build variables from Release pipeline.
The is no official way to pass variables from Build to Release. What you are doing is the right way.
Alternative, you could use some 3rd-party Azure DevOps extension such as this one--Variable Tools for Azure DevOps Services.
In the "build pipeline" you can create a JSON file using "save
variables". This file needs to be published as artifact or with
existing artifact.
In the "release pipeline" you can restore the variables using "load
variables" from the JSON file.
Also take a look at this similar question here: How to get the variable value in TFS/AzureDevOps from Build to Release Pipeline?

Azure DevOps: Why does new pipeline commit the yaml file to default branch

I created a new pipeline in Azure DevOps, and created a new branch for it.
As a result, DevOps automatically committed the YAML file for the new pipeline to my 'development' branch.
None of the other pipelines I've created have YAML files committed into the repo...
Why does it do this?
Do we have to keep the YAML file there?
It has nothing to do with the source code of the application, so doesn't seem to make sense why its stored there.
YAML is code for how your application is deployed, thus it is part of the source code. By putting it under source control it can keep track of version changes and any additional changes to parameters or variables that are determined or inserted in the build process.
This is opposed to the older ways of doing things where it was updated via UI and not source control and did not have peer reviews, branching merging, and additional polices that can be applied.
This on top of the the YAML Pipelines for Releases going GA the other week will make YAML under a repo even more powerful as the YAMLs will not only build but also release code.
In Azure Devops Service we define pipelines using the YAML syntax or through the user interface (Classic). So there're two kinds of pipelines, Yaml pipelines and Classic UI(Classic build and release) pipelines.
None of the other pipelines I've created have YAML files committed
into the repo...
Why does it do this?
It's expected behavior when defining pipelines using Yaml syntax: The pipeline is versioned with your code. It follows the same branching structure.
And one advantage for this is: A change to the build process might cause a break or result in an unexpected outcome. Because the change is in version control with the rest of your codebase, you can more easily identify the issue.
To sum up, the yaml pipeline will be added into version control and it's by-design behavior. If you don't want this behavior, you can feel free to use Classic Build and Classic Release pipelines. It's also a good choice! About the differences between these formats you can check Feature availability. Hope it helps :)