代码之家  ›  专栏  ›  技术社区  ›  Anthony Klotz

使用VSTS API在VSTS中的连续集成/连续交付过程中向Git提交文件

  •  2
  • Anthony Klotz  · 技术社区  · 8 年前

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

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

    如何在版本定义阶段将文件签入存储库?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Anthony Klotz    8 年前

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

    我引用了 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 具有 -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
    

    希望有帮助

        2
  •  1
  •   jessehouwing    8 年前

    虽然我通常认为发布到源repo并触发构建是个坏主意,但这相对容易。

    您可以调用 git.exe 作为构建的一部分。您可能需要调整存储库设置以克隆整个存储库,而不仅仅是浅层克隆。如果启用对生成作业的访问,则可以传入生成作业的OAuth标记:

    enter image description here

    您可以看到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构建支持: