如何从 Powershell 在 TFS 构建定义上添加计划?
How to add schedule on a TFS Build definition from Powershell?
我想在构建定义上添加计划 从 TFS REST API 使用 PowerShell(添加计划到代码示例中的 $buildDef 变量)。
我得到了执行 API 请求的构建定义,但我无法为每周创建一个时间表作为触发器。我在下面使用 Api 来更新触发时间表。
$buildDef = Invoke-RestMethod -Method Get -UseDefaultCredentials -ContentType application/json -Uri $TfsBuildDefinitionUri
任何帮助将不胜感激,因为我无法完成它。谢谢!!
首先,您必须使用以下方法获取 ADO 构建的构建定义:
GET https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.1
附加参数:
GET https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?revision={revision}&minMetricsTime={minMetricsTime}&propertyFilters={propertyFilters}&includeLatestBuilds={includeLatestBuilds}&api-version=5.1
然后它会给你一个**[BuildTrigger][1]**
的数组然后你必须更新DefinitionTriggerType的时间表。
schedule
无论变更集是否存在,构建都应该按指定的时间表开始。
这是更新构建触发器的示例代码:
$definitionToUpdate = Invoke-RestMethod -Uri "$($collection)$($project.name)/_apis/build/definitions/$($definition.id)" -Method GET -Header $header
$trigger = $definitionToUpdate.triggers | Where {$_.triggerType -eq 'continuousIntegration'}
if ($trigger) {
$trigger.branchFilters = $branchNames | % {"+refs/heads/$_/*"}
Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions/$($definition.id)?api-version=5.0" -Method PUT -ContentType application/json -Body ($definitionToUpdate | ConvertTo-Json -Depth 10) -Header $header
}
您可以参考 线程以进一步参考,希望对您有所帮助。
既然你已经有了构建定义。然后你只需要使用 Definitions - Update Rest API 来更新
PUT https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?secretsSourceDefinitionId={secretsSourceDefinitionId}&secretsSourceDefinitionRevision={secretsSourceDefinitionRevision}&api-version=5.0
在请求体中,有一个BuildTrigger表示一个buld定义的触发器。这是一个数组[]。它包含 时间表
string : 无论变更集是否存在,构建都应该按指定的时间表开始。
供您参考的人体样本:
Content-Type: application/json
{
"id": 29,
"revision": 1,
"name": "myFavoriteDefinition",
"definitionType": "build",
"documentQuality": "definition",
"queue": {
"id": 1
},
"build": [
{
"enabled": true,
"continueOnError": false,
"alwaysRun": false,
"displayName": "Build solution **\*.sln",
"task": {
"id": "71a9a2d3-a98a-4caa-96ab-affca411ecda",
"versionSpec": "*"
},
"inputs": {
"solution": "**\*.sln",
"msbuildArgs": "",
"platform": "$(platform)",
"configuration": "$(config)",
"clean": "false",
"restoreNugetPackages": "true",
"vsLocationMethod": "version",
"vsVersion": "latest",
"vsLocation": "",
"msbuildLocationMethod": "version",
"msbuildVersion": "latest",
"msbuildArchitecture": "x86",
"msbuildLocation": "",
"logProjectEvents": "true"
}
},
{
"enabled": true,
"continueOnError": false,
"alwaysRun": false,
"displayName": "Test Assemblies **\*test*.dll;-:**\obj\**",
"task": {
"id": "ef087383-ee5e-42c7-9a53-ab56c98420f9",
"versionSpec": "*"
},
"inputs": {
"testAssembly": "**\*test*.dll;-:**\obj\**",
"testFiltercriteria": "",
"runSettingsFile": "",
"codeCoverageEnabled": "true",
"otherConsoleOptions": "",
"vsTestVersion": "14.0",
"pathtoCustomTestAdapters": ""
}
}
],
"repository": {
"id": "278d5cd2-584d-4b63-824a-2ba458937249",
"type": "tfsgit",
"name": "Fabrikam-Fiber-Git",
"localPath": "$(sys.sourceFolder)/MyGitProject",
"defaultBranch": "refs/heads/master",
"url": "https://fabrikam.visualstudio.com/DefaultCollection/_git/Fabrikam-Fiber-Git",
"clean": "false"
},
"options": [
{
"enabled": true,
"definition": {
"id": "7c555368-ca64-4199-add6-9ebaf0b0137d"
},
"inputs": {
"parallel": "false",
"multipliers": "[\"config\",\"platform\"]"
}
}
],
"variables": {
"forceClean": {
"value": "false",
"allowOverride": true
},
"config": {
"value": "debug, release",
"allowOverride": true
},
"platform": {
"value": "any cpu",
"allowOverride": true
}
},
"triggers": [],
"comment": "renamed"
}
关于如何在powershell中调用RestAPI,google中有多个示例,你也可以看看这个:
$body = '
{
...
}
'
$bodyJson=$body | ConvertFrom-Json
Write-Output $bodyJson
$bodyString=$bodyJson | ConvertTo-Json -Depth 100
Write-Output $bodyString
$user="name"
$token="PAT"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
$Uri = "rest api url"
$buildresponse = Invoke-RestMethod -Method Post -UseDefaultCredentials -ContentType application/json -Uri $Uri -Body $bodyString -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
write-host ....
最后,我为我的构建定义创建/添加了一个计划触发器。当构建定义没有任何触发器时,属性(构建对象)或json数组(构建对象转换为数组)不存在。所以,我们必须添加它。这是解决方案:
$triggerValue = @"
[
{
"schedules":[
{
"branchFilters":[
"+$/FilterName"
],
"timeZoneId":"W. Europe Standard Time",
"startHours":$startHoursNB,
"startMinutes":$startMinutesNB,
"daysToBuild":"all"
}
],
"triggerType":"schedule"
}
]
"@
$buildDef | add-member -Name "triggers" -value (Convertfrom-Json $triggerValue) -MemberType NoteProperty
也感谢您的帮助。
我想在构建定义上添加计划 从 TFS REST API 使用 PowerShell(添加计划到代码示例中的 $buildDef 变量)。
我得到了执行 API 请求的构建定义,但我无法为每周创建一个时间表作为触发器。我在下面使用 Api 来更新触发时间表。
$buildDef = Invoke-RestMethod -Method Get -UseDefaultCredentials -ContentType application/json -Uri $TfsBuildDefinitionUri
任何帮助将不胜感激,因为我无法完成它。谢谢!!
首先,您必须使用以下方法获取 ADO 构建的构建定义:
GET https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?api-version=5.1
附加参数:
GET https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?revision={revision}&minMetricsTime={minMetricsTime}&propertyFilters={propertyFilters}&includeLatestBuilds={includeLatestBuilds}&api-version=5.1
然后它会给你一个**[BuildTrigger][1]**
的数组然后你必须更新DefinitionTriggerType的时间表。
schedule
无论变更集是否存在,构建都应该按指定的时间表开始。
这是更新构建触发器的示例代码:
$definitionToUpdate = Invoke-RestMethod -Uri "$($collection)$($project.name)/_apis/build/definitions/$($definition.id)" -Method GET -Header $header
$trigger = $definitionToUpdate.triggers | Where {$_.triggerType -eq 'continuousIntegration'}
if ($trigger) {
$trigger.branchFilters = $branchNames | % {"+refs/heads/$_/*"}
Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions/$($definition.id)?api-version=5.0" -Method PUT -ContentType application/json -Body ($definitionToUpdate | ConvertTo-Json -Depth 10) -Header $header
}
您可以参考
既然你已经有了构建定义。然后你只需要使用 Definitions - Update Rest API 来更新
PUT https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?secretsSourceDefinitionId={secretsSourceDefinitionId}&secretsSourceDefinitionRevision={secretsSourceDefinitionRevision}&api-version=5.0
在请求体中,有一个BuildTrigger表示一个buld定义的触发器。这是一个数组[]。它包含 时间表 string : 无论变更集是否存在,构建都应该按指定的时间表开始。
供您参考的人体样本:
Content-Type: application/json
{
"id": 29,
"revision": 1,
"name": "myFavoriteDefinition",
"definitionType": "build",
"documentQuality": "definition",
"queue": {
"id": 1
},
"build": [
{
"enabled": true,
"continueOnError": false,
"alwaysRun": false,
"displayName": "Build solution **\*.sln",
"task": {
"id": "71a9a2d3-a98a-4caa-96ab-affca411ecda",
"versionSpec": "*"
},
"inputs": {
"solution": "**\*.sln",
"msbuildArgs": "",
"platform": "$(platform)",
"configuration": "$(config)",
"clean": "false",
"restoreNugetPackages": "true",
"vsLocationMethod": "version",
"vsVersion": "latest",
"vsLocation": "",
"msbuildLocationMethod": "version",
"msbuildVersion": "latest",
"msbuildArchitecture": "x86",
"msbuildLocation": "",
"logProjectEvents": "true"
}
},
{
"enabled": true,
"continueOnError": false,
"alwaysRun": false,
"displayName": "Test Assemblies **\*test*.dll;-:**\obj\**",
"task": {
"id": "ef087383-ee5e-42c7-9a53-ab56c98420f9",
"versionSpec": "*"
},
"inputs": {
"testAssembly": "**\*test*.dll;-:**\obj\**",
"testFiltercriteria": "",
"runSettingsFile": "",
"codeCoverageEnabled": "true",
"otherConsoleOptions": "",
"vsTestVersion": "14.0",
"pathtoCustomTestAdapters": ""
}
}
],
"repository": {
"id": "278d5cd2-584d-4b63-824a-2ba458937249",
"type": "tfsgit",
"name": "Fabrikam-Fiber-Git",
"localPath": "$(sys.sourceFolder)/MyGitProject",
"defaultBranch": "refs/heads/master",
"url": "https://fabrikam.visualstudio.com/DefaultCollection/_git/Fabrikam-Fiber-Git",
"clean": "false"
},
"options": [
{
"enabled": true,
"definition": {
"id": "7c555368-ca64-4199-add6-9ebaf0b0137d"
},
"inputs": {
"parallel": "false",
"multipliers": "[\"config\",\"platform\"]"
}
}
],
"variables": {
"forceClean": {
"value": "false",
"allowOverride": true
},
"config": {
"value": "debug, release",
"allowOverride": true
},
"platform": {
"value": "any cpu",
"allowOverride": true
}
},
"triggers": [],
"comment": "renamed"
}
关于如何在powershell中调用RestAPI,google中有多个示例,你也可以看看这个:
$body = '
{
...
}
'
$bodyJson=$body | ConvertFrom-Json
Write-Output $bodyJson
$bodyString=$bodyJson | ConvertTo-Json -Depth 100
Write-Output $bodyString
$user="name"
$token="PAT"
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
$Uri = "rest api url"
$buildresponse = Invoke-RestMethod -Method Post -UseDefaultCredentials -ContentType application/json -Uri $Uri -Body $bodyString -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
write-host ....
最后,我为我的构建定义创建/添加了一个计划触发器。当构建定义没有任何触发器时,属性(构建对象)或json数组(构建对象转换为数组)不存在。所以,我们必须添加它。这是解决方案:
$triggerValue = @"
[
{
"schedules":[
{
"branchFilters":[
"+$/FilterName"
],
"timeZoneId":"W. Europe Standard Time",
"startHours":$startHoursNB,
"startMinutes":$startMinutesNB,
"daysToBuild":"all"
}
],
"triggerType":"schedule"
}
]
"@
$buildDef | add-member -Name "triggers" -value (Convertfrom-Json $triggerValue) -MemberType NoteProperty
也感谢您的帮助。