- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们在 VSTS 中配置了多个使用不同数据库的发布环境。这些环境中的每个数据库都包含控制应用程序工作方式的特定元数据。此元数据由管理工具定期配置给用户。
我们希望备份此元数据并在每次发布时将其 checkin Git,以便我们将其保存在某个地方,以防数据丢失或需要比较以前的版本。我们有一个实用程序可以从生成 XML 文件的数据库中提取此元数据,因此我将运行此实用程序,然后使用 VSTS 中的任务以某种方式将其放入 Git 中。如果可能的话,我们还计划将我们的 VSTS 发布定义导出到 JSON 中,并将其也检查到 Git 中。
如何在发布定义阶段将文件 checkin 存储库?
最佳答案
经过一些研究和几个小时后在 Postman/VSTS 中进行测试 - 我能够编写一个 powershell 脚本,该脚本将 API 请求发送到 VSTS 并将文件提交到存储库。
我引用了 Create a push documentation here .我需要确定 JSON 请求的以下属性的正确值:
git show HEAD
这是一个检索最新的 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
由于所有特殊字符而无法上传。唯一允许的其他内容类型是 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
或编辑
。见下文:
$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
希望对你有帮助
关于git - 在 VSTS 中使用 VSTS API 的持续集成/持续交付过程中将文件提交到 Git,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49057808/
我是一名优秀的程序员,十分优秀!