Description
openedon Mar 26, 2024
Environment
Node version: v18.19.0
Npm version: 10.2.3
OS and version: Linux 5.10.102.1-microsoft-standard-WSL2 - linux/x64
azure-devops-node-api version: 13.0.0
Issue Description
The new IPipelinesApi.createPipeline()
that has been published under version 13 seems to have several incompatibilities with the Azure DevOps REST API for creating a YAML pipeline. The function accepts an incomplete list of values that the REST API requires. The expected values seem to be copied directly from what is documented in the REST API documentation, but that documentation is NOT correct.
IPipelinesApi.createPipeline()
and the the documentation at https://learn.microsoft.com/en-us/rest/api/azure/devops/pipelines/pipelines/create?view=azure-devops-rest-7.1 should be corrected to reflect the parameters that the REST API actually expects.
Expected behaviour
I've been looking at blogs from other parties (such as this one) to see what the Azure DevOps REST API expects for creating a new pipeline. Thanks to those, I made the following fetch
request:
await fetch(`${orgUrl}/${project}/_apis/pipelines?api-version=7.1-preview.1`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': `Bearer ${token}`,
'X-TFS-FedAuthRedirect': 'Suppress',
},
body: JSON.stringify({
name,
folder,
configuration: {
type: 'yaml',
path: pathToYamlFile,
repository: {
id: repositoryId,
name: repositoryName,
type: 'azureReposGit',
},
},
}),
});
And this works as expected, where it creates a pipeline within Azure DevOps (assuming the properties in the sample fetch
exist).
Actual behaviour
To create a new YAML pipeline, the type definition of IPipelinesApi.createPipeline()
requires me to call the function as follows:
const project = 'MyProject';
const pipelinesApi = await azureDevOps.getPipelinesApi();
const pipeline = await pipelinesApi.createPipeline({
name: 'test',
folder: '/',
configuration: {
type: ConfigurationType.Yaml, // An enum which is equal to literal value 1
}
}, project);
This results in the following error thrown:
Error: This API does not support creating pipelines of configuration type Yaml.
at RestClient.<anonymous> (node_modules/typed-rest-client/RestClient.js:202:31)
at Generator.next (<anonymous>)
at fulfilled (node_modules/typed-rest-client/RestClient.js:6:58)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
This seems to make sense. When I reproduce the request that is made, which would look like the following:
organization='<org>'
project='<project>'
token='<bearer_token>'
curl --location --request POST "https://dev.azure.com/$organization/$project/_apis/pipelines?api-version=7.1-preview.1" \
--header "Authorization: Bearer $token" \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-TFS-FedAuthRedirect: Suppress' \
--data-raw '{
"name": "pipelinename",
"folder": "/"
"configuration": {
"type": 1
}
}'
I get the same error in the body of the REST API.
This happens because the value 1
is not valid for configuration.type
. It should be the string literal yaml
in case you want to make a YAML pipeline. I expect more errors to occur when that single issue is fixed, since there is no way to specify a repository name or path to the yaml file.