1

简短的问题:

我想知道下面的 MSDeploy 资源(部署 azure 应用服务)中的 packageUri 参数是否可以指向发布管道使用的 VSTS 构建服务器放置位置的位置。

如何以编程方式获得建立放置位置的权限? 使用 vsts api?哪个?也许这个链接可以阐明一些观点:

了解工件

从在线视觉工作室获取您的构建工件

REST API 的基本身份验证

"resources": [
  {
    "name": "MSDeploy",
    "type": "extensions",
    "location": "[parameters('location')]",
    "apiVersion": "2014-06-01",
    "dependsOn": [
      "[concat('Microsoft.Web/sites/', parameters('siteName'))]"
    ],
    "tags": {
      "displayName": "ContentDeploy"
    },
    "properties": {
      "packageUri": "[concat(parameters('packageUrl'), parameters('sasToken'))]",
      "dbType": "None",
      "connectionString": "",
      "setParameters": {
          "IIS Web Application Name": "[parameters('siteName')]"
      }
    }
  }
]

更长的问题和解释: 我在开发过程中使用 VSTS 发布定义来部署我的 Web 应用程序基础架构。Web 应用程序将由我的 VSTS 构建构建和打包并上传到服务器放置位置。我正在为我的构建和发布管道使用本地(我的 PC)代理。

虽然我可以使用 vsts Deploy Azure App Service 发布任务(知道如何查找构建工件)进行 Web 应用程序部署,但我想从我打算构建的 Web 应用程序中以编程方式自动部署多个 Web 应用程序。

我想知道这个 .zip Web 应用程序包是否可以以某种方式提供给我的 ARM 部署模板。每个人都建议将 .zip 包复制到带有 SAS 令牌的存储 blob 中,这样 Release “Deploy azure app service” 就可以找到它。我想避免这种复制。实际上,如果我无法按要求执行此操作,我至少希望以编程方式下载此软件包并最终将其复制到存储 blob 容器中。

这是我做的小研究:

我为构建和发布打开了代理日志记录

Some Build variables:
BUILD_SOURCESDIRECTORY=F:\agent\_work\1\s
BUILD_STAGINGDIRECTORY=F:\agent\_work\1\a


Some release variables:
[SYSTEM_ARTIFACTSDIRECTORY] --> [F:\agent\_work\r3\a]
[RELEASE_ARTIFACTS_ECOMMERCESITECI_SOURCEVERSION] --> [91]
[BUILD_BUILDNUMBER] --> [20161230.12]
[BUILD_BUILDID] --> [85]
[SYSTEM_TEAMPROJECTID] --> [7ab6c2a4-208d-411d-81e5-5e88b26f2252]
[RELEASE_RELEASEWEBURL] --> [https://vstsaccount.visualstudio.com/7ab6c2a4-208d-411d-81e5-5e88b26f2252/_apps/hub/ms.vss-releaseManagement-web.hub-explorer?releaseId=103&_a=release-summary]

RELEASE_RELEASEWEBURL 是一个有趣的页面,我可以在其中按显示所有链接源的工件(在我的情况下,我有一个来自我的 CI 构建的主要源。)。然后我可以点击链接并到达特定的构建 EcommerceSiteCI / Build 20161230.12,然后我可以按下载按钮(从下面的链接)下载我想要的 .zip 包。我想从我的 Arm 模板中以编程方式了解它。我想创建一个 Web 应用程序或 Api 应用程序,它可以以编程方式发现这个 .zip 包并使用它来使用“Web 应用程序的 Web 部署”资源部署应用程序。

https://vstsaccount.visualstudio.com/vstsproject/_build/index?buildId=85&_a=summary&tab=artifacts

看着提琴手,我设法看到资产下载的网址是什么:

获取https://vstsaccount.visualstudio.com/7ab6c2a4-208d-411d-81e5-5e88b26f2252/_apis/build/builds/85/artifacts?artifactName=drop&%24format=zip

所以我可以看到基于 [BUILD_BUILDID] --> [85] 和 [SYSTEM_TEAMPROJECTID] --> [7ab6c2a4-208d-411d-81e5-5e88b26f2252] 我可以组装这个 URL。唯一的事情是如何验证这个请求。当我输入上面的地址时,系统提示我使用 Microsoft 帐户登录,我看到它是 oauth 2.0 身份验证。网址是这样的: https://login.live.com/oauth20_authorize.srf?response_type=code&client_id=51483342-012c-4d86-bf138-cf50c7252078&scope=openid+profile+email+offline_access&response_mode=form_pos 等...(一些加密字符串 - 可能表示 .zip 包位置被省略)。

即使我无法将此下载 url 提供给 MSDeploy 臂资源,如果我可以以编程方式下载它并上传到存储 blob 容器并为 MSDeploy 生成 SAS 令牌以找到它,那将是很棒的。

那么如何以编程方式获得建立放置位置的权限呢?谢谢拉德

4

1 回答 1

0

我最近写了一篇关于使用 PowerShell 对构建进行排队并使用 TFS API 提取工件的博客。非常适合我们。

$artifacts = Invoke-RestMethod -Method Get -Credential $creds -ContentType application/json -Uri "$TFSUri/$project/_apis/build/builds/$buildId/artifacts?api-version=2.0"
foreach($artifact in $artifacts.value)
{
    $filePath = $artifact.resource.downloadUrl.Replace("file:", "").Replace("/", "\").Replace("%20", " ");          
    $path  = $filePath + "\*Package\*"
    if (Test-Path $path)
    {        
        $packagePath = "MSDeployPackages\$project-$buildName\"; 
        if ((Test-Path $packagePath) -eq $false) {
            New-Item $packagePath -ItemType directory
        }
        Copy-Item -Path $path -Destination $packagePath -Recurse -Force
    }
}

http://www.dotnetcatch.com/2016/10/14/queue-tfsvsts-builds-via-powershell/

于 2017-01-24T15:32:01.077 回答