2016-08-19 41 views
0

我是AppVeyor的新手,我为一家Web代理商工作,我们在单独的GIT仓库中有许多项目。在手动部署期间访问AppVeyor项目环境变量

每个项目都有一个开发分支,这是我在AppVeyor中观看的内容。由于我们有一个运行IIS的内部开发服务器,所以将我们的开发服务器定义为AppVeyor环境是一个很好的选择。开发服务器正在运行AppVeyor代理。

在项目特定的YAML文件中,我指定了我定义的环境名称和自定义环境变量。

environment: 
    iis_site_name: project-specific-site-name.com 

deploy: 
- provider: Environment 
    name: dev-environment 

我配置了AppVeyor环境以接受来自项目的环境变量。

AppVeyor Environment - 注意:websitebuild是与工件关联的“部署名称”。

这项工作完全在提交上,项目在正确的位置构建并部署到代理。

这不起作用的是当我需要启动手动部署。因此,可以说我想通过进入AppVeyor界面并选择环境>开发环境>新部署>选择项目来启动手动部署

当此部署运行时,从YAML文件(iis_site_name)的环境变量未见并创建一个名为“default”的新IIS站点,并在该站点中部署该站点。 请注意,我也尝试通过GUI在项目设置中添加环境变量(而不是在YAML中),它的行为没有任何不同。

回答

0

我相信这是预期的行为,当构建时环境变量不可用时,Appveyor将发送给您在代理程序默认值中定义的环境级变量。请看here

在我们定义的“默认”值屏幕的底部,即 当你从环境中部署和构建环境 变量使用的值不存在

正如我了解这不符合您的情况,因为您需要不同项目的不同站点名称。你可以做的是为每个项目创建单独的环境(使用单独的默认站点名称),但是将其所有的环境访问密钥替换为当前环境使用的密钥,因此代理将从所有环境访问它们。

更新:

这不是根据马蒂的评论最好的解决方案。让我们使用REST API。

文档是在这里https://www.appveyor.com/docs/api/environments-deployments/#start-deployment

下面检查样品的PowerShell功能。您可以在需要时使用特定于项目的参数进行调用。

注意,你也必须设置websitebuild.hostname$(iis_site_name)在部署提供设置为站点使用主机头,而不是*的IIS绑定,否则他们将在TCP端口打;)

function start-appveyorDeploy 
{ 
    param (
     [Parameter(Position=0, Mandatory=$true)] 
     [string]$projectSlug, 

     [Parameter(Position=1, Mandatory=$true)] 
     [string]$buildVersion, 

     [Parameter(Position=2, Mandatory=$true)] 
     [string]$siteName 
    ) 

    $apiUrl = 'https://ci.appveyor.com/api' 

    # Replace this with your values 
    $token = <your_token> 
    $environmentName = <your_environmentName> 
    $accountName = <your_accountName> 

    $headers = @{ 
     "Authorization" = "Bearer $token" 
     "Content-type" = "application/json" 
    } 

    $body = @{ 
     environmentName=$environmentName 
     accountName=$accountName 
     projectSlug=$projectSlug 
     buildVersion=$buildVersion 
     environmentVariables [email protected]{ 
      iis_site_name=$siteName 
     } 
    } 

    $jsonBody = $body | ConvertTo-Json -Depth 3 

    Invoke-RestMethod -Uri "$apiUrl/deployments" -Headers $headers -Body $jsonBody -Method Post 
} 
+0

感谢答案是肯定的,但是为每个网站创建一个独立的环境完全违背了首先定义环境的目的。我在这里谈论的可能是5-60个站点,每周都会有新的站点出现,这就是为什么我试图尽可能简化流程。 –

+0

所以考虑到这一点,我想我可以在没有以这种方式触发手动部署的情况下生活。现在我想到了,我可以通过开始重建最后一次提交而获得相同的结果,这不是很糟糕,但这是一个审慎的构建步骤,但它可以完成工作。 –

+0

我看到了,那么我建议使用REST API来调用环境部署。我想我会更新我的答案 – ilyaf