经过一些研究和几个小时后在 Postman/VSTS 中的测试 - 我能够编写一个 powershell 脚本,将 API 请求发送到 VSTS 并将文件提交到存储库。
我引用了Create a push documentation here。我需要确定 JSON 请求的以下属性的正确值:
以下是检索最新 objectId 以用作 oldObjectId 值的示例:
Invoke-RestMethod -Uri "https://{accountName}.visualstudio.com/DefaultCollection/{project}/_apis/git/repositories/{repositoryId}/refs?filter=heads%2Fmaster&api-version=4.1-preview" -Method Get -Headers $header
我的下一个任务是准备 newContent 属性。由于我试图上传 XML 文件,rawText 是不可能的,因为所有的特殊字符。唯一允许的其他 contentType 是 base64Encoded。
我必须使用 Powershell 的 Get-Content cmdlet 并启用 -Raw 开关才能成功对内容进行 base64 编码。我是从另一个StackOverflow post 那里了解到的,这是我之前遇到XML 格式问题时所做的。
$xmlData = Get-Content -Path $xmlFile -Raw
$xmlDataEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($xmlData))
然后,为了确定我是在添加新文件还是修改现有文件,我需要在脚本中添加逻辑以检查文件是否存在,并将 changeType 设置为add 或edit。见下文:
$xmlDataRepo = Invoke-RestMethod -Uri "{accountName}.visualstudio.com/DefaultCollection/{project/_apis/git/repositories/{project}/items/?recursionLevel=OneLevel&api-version=4.1-preview" -Method Get -Headers $header
ForEach-Object -InputObject $xmlDataRepo.value -Process {if ($_.path -eq $repoXmlFile) {$changeType = "edit"} else {$changeType = "add"}}
最后,现在我已经收集了所有信息并编码了我的 XML 内容。我需要构建请求正文并调用 API。这是请求的正文:
$body = @"
{
"refUpdates": [
{
"name": "refs/heads/master",
"oldObjectId": "$objectId"
}
],
"commits": [
{
"comment": "Data backed up",
"changes": [
{
"changeType": "$changeType",
"item": {
"path": "$repoXmlFile"
},
"newContent": {
"content": "$xmlDataEncoded",
"contentType": "base64Encoded"
}
}
]
}
]
}
"@
最后,顶部的樱桃:
Invoke-RestMethod -Uri "https://{accountName}.visualstudio.com/DefaultCollection/{project/_apis/git/repositories/{project}/pushes?api-version=4.1-preview" -Method Post -Headers $header -Body $body -ContentType application/json
希望有帮助