[英]Commit a file to Git during continuous integration/continuous delivery process in VSTS using VSTS API
我们在VSTS中配置了多个使用不同数据库的发行环境。 这些环境中的每个数据库都包含控制应用程序工作方式的特定元数据。 该元数据由管理工具定期配置给用户。
我们希望备份此元数据,并在每个发行版中将其检入Git,以便将其保存在某处,以防数据丢失或需要比较以前的版本。 我们有一个实用程序,可从数据库中提取此元数据并生成XML文件,因此我将运行该实用程序,然后使用VSTS中的任务将其放入Git。 如果有可能做到这一点,我们还计划将VSTS版本定义导出到JSON中,并将其也检查到Git中。
如何在发布定义阶段将文件检入到存储库中?
经过一些研究和几个小时后的Postman / VSTS测试,我能够编写一个powershell脚本,该脚本将API请求发送到VSTS并将文件提交到存储库。
我参考了此处的创建推送文档 。 我需要为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
成为了rawText
。 允许的唯一其他contentType是base64Encoded
。
我必须使用启用了-Raw
开关的Powershell的Get-Content
cmdlet才能成功对内容进行base64编码。 我从我先前在遇到XML格式问题时发表的另一篇StackOverflow帖子中学到了这一点。
$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
希望能有所帮助
虽然我通常认为发布到也会触发构建的源存储库是一个坏主意,但这相对容易。
您可以在构建过程中调用git.exe
。 您可能需要调整存储库设置以克隆整个存储库,而不仅仅是浅克隆。 如果启用对构建作业的OAuth令牌的访问权限,则可以传递它:
您可以看到VSTS本身如何添加授权标头:
git remote add origin https://jessehouwing.visualstudio.com/
git config --get-all http.https://jessehouwing.visualstudio.com/_git/Torpydo.extraheader
git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" fetch --tags --prune --progress --no-recurse-submodules origin
VSTS中的每个构建都有“人工制品”的概念。 您可以使用复制并发布构建工件任务来捕获数据并确保它们不会丢失。
如果您希望自己的版本在源代码管理中,请确保研究新的YAML版本支持:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.