Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用VSTSAPI的VSTS中的持续集成/持续交付过程中,将文件提交到Git_Git_Azure Devops_Azure Pipelines_Azure Pipelines Release Pipeline - Fatal编程技术网

在使用VSTSAPI的VSTS中的持续集成/持续交付过程中,将文件提交到Git

在使用VSTSAPI的VSTS中的持续集成/持续交付过程中,将文件提交到Git,git,azure-devops,azure-pipelines,azure-pipelines-release-pipeline,Git,Azure Devops,Azure Pipelines,Azure Pipelines Release Pipeline,我们在VST中配置了多个使用不同数据库的发布环境。这些环境中的每个数据库都包含控制应用程序工作方式的特定元数据。此元数据由管理工具定期配置给用户 我们希望在每个版本上备份此元数据并将其签入Git,以便在数据丢失或需要比较以前的版本时将其保存在某处。我们有一个实用程序,它从生成XML文件的数据库中提取元数据,所以我将运行这个实用程序,然后使用VSTS中的一个任务将其放入Git中。如果有可能做到这一点,我们还计划将我们的VSTS发布定义导出到JSON中,并将其签入Git 如何在发布定义阶段将文件签入

我们在VST中配置了多个使用不同数据库的发布环境。这些环境中的每个数据库都包含控制应用程序工作方式的特定元数据。此元数据由管理工具定期配置给用户

我们希望在每个版本上备份此元数据并将其签入Git,以便在数据丢失或需要比较以前的版本时将其保存在某处。我们有一个实用程序,它从生成XML文件的数据库中提取元数据,所以我将运行这个实用程序,然后使用VSTS中的一个任务将其放入Git中。如果有可能做到这一点,我们还计划将我们的VSTS发布定义导出到JSON中,并将其签入Git


如何在发布定义阶段将文件签入到存储库?

虽然我通常认为发布到源repo(它也会触发构建)是个坏主意,但这相对简单

您可以在构建过程中调用
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
选择 VST中的每个构建都有一个“人工制品”的概念。您可以使用复制和发布构建人工制品任务来捕获数据并确保它们不会丢失

建立历史 如果您希望您的构建采用源代码管理,请务必研究新的YAML构建支持:


经过一些研究和几个小时后的Postman/VSTS测试,我能够编写一个powershell脚本,向VSTS发送API请求并将文件提交到存储库

我引用了。我需要确定JSON请求的以下属性的正确值:

  • oldObjectId—在任何地方都没有完全的文档记录。这里需要的值可以通过调用返回。我相信这与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编码。我从前面的另一个例子中学到了这一点,当时我在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

希望这能有所帮助

谢谢-我浏览了一下VSTS API文档,发现它们有一个API调用,可以做类似的事情。这个API调用看起来我可以发送一个更新的文件。您听说过从存储库添加/更新/删除文件的API调用吗?这也可以。我仍然建议使用构建人工制品,而不是回到git。因为您通过RESTAPI解决了您的问题,所以您可以添加一个答案并接受它。