在手动部署期间访问 AppVeyor 项目环境变量
Accessing AppVeyor Project Environment Variables during manual deploy
我是 AppVeyor 的新手,我在一家网络代理公司工作,我们在单独的 GIT 回购中有许多项目。
每个项目都有一个开发分支,这就是我在 AppVeyor 中看到的。由于我们只有一个内部开发服务器 运行 IIS,因此将我们的开发服务器定义为 AppVeyor 环境是一个很好的选择。开发服务器是运行 AppVeyor Agent。
在项目特定的 YAML 文件中,我指定了环境名称和我定义的自定义环境变量。
environment:
iis_site_name: project-specific-site-name.com
deploy:
- provider: Environment
name: dev-environment
我已经将 AppVeyor 环境配置为接受来自项目的环境变量,就像这样。
AppVeyor Environment - 注意:websitebuild 是与工件关联的 "deploy name"。
这项工作完美地提交,项目已构建并部署到正确位置的代理。
这不起作用的地方是我需要启动手动部署。假设我想通过进入 AppVeyor 界面并选择 Environments > Dev Environment > New Deploy > Select Project
来开始手动部署
当此部署运行时,从 YAML 文件 (iis_site_name) 中看不到环境变量,并且会创建一个名为 'default' 的新 IIS 站点,并将该站点部署到那里。
请注意,我还尝试通过 GUI(而不是在 YAML 中)在项目设置中添加环境变量,它的行为没有什么不同。
我相信这是预期的行为,当 build-time 环境变量不可用时,Appveyor 将向代理发送您在环境级别变量定义的默认值。请看here
At the bottom of that screen we are defining its “default” value, i.e.
the value used when you deploy from Environments and build environment
variables are not present
据我了解,这不适合您的情况,因为您需要为不同的项目使用不同的站点名称。您可以做的是为每个项目创建单独的环境(具有单独的默认站点名称),但是将它们的所有环境访问密钥替换为您当前环境中使用的密钥,这样代理将从所有这些项目中挑选工作。
更新:
根据 Marty 的评论,这不是最佳解决方案。让我们使用 REST API 然后。
文档在这里https://www.appveyor.com/docs/api/environments-deployments/#start-deployment
检查下面的示例 PowerShell 函数。您可以在需要时使用 project-specific 参数调用它。
请注意,您还必须在站点的部署提供商设置中将 websitebuild.hostname
设置为 $(iis_site_name)
使用主机 header 而不是 * 绑定在 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 =@{
iis_site_name=$siteName
}
}
$jsonBody = $body | ConvertTo-Json -Depth 3
Invoke-RestMethod -Uri "$apiUrl/deployments" -Headers $headers -Body $jsonBody -Method Post
}
我是 AppVeyor 的新手,我在一家网络代理公司工作,我们在单独的 GIT 回购中有许多项目。
每个项目都有一个开发分支,这就是我在 AppVeyor 中看到的。由于我们只有一个内部开发服务器 运行 IIS,因此将我们的开发服务器定义为 AppVeyor 环境是一个很好的选择。开发服务器是运行 AppVeyor Agent。
在项目特定的 YAML 文件中,我指定了环境名称和我定义的自定义环境变量。
environment:
iis_site_name: project-specific-site-name.com
deploy:
- provider: Environment
name: dev-environment
我已经将 AppVeyor 环境配置为接受来自项目的环境变量,就像这样。
AppVeyor Environment - 注意:websitebuild 是与工件关联的 "deploy name"。
这项工作完美地提交,项目已构建并部署到正确位置的代理。
这不起作用的地方是我需要启动手动部署。假设我想通过进入 AppVeyor 界面并选择 Environments > Dev Environment > New Deploy > Select Project
来开始手动部署当此部署运行时,从 YAML 文件 (iis_site_name) 中看不到环境变量,并且会创建一个名为 'default' 的新 IIS 站点,并将该站点部署到那里。 请注意,我还尝试通过 GUI(而不是在 YAML 中)在项目设置中添加环境变量,它的行为没有什么不同。
我相信这是预期的行为,当 build-time 环境变量不可用时,Appveyor 将向代理发送您在环境级别变量定义的默认值。请看here
At the bottom of that screen we are defining its “default” value, i.e. the value used when you deploy from Environments and build environment variables are not present
据我了解,这不适合您的情况,因为您需要为不同的项目使用不同的站点名称。您可以做的是为每个项目创建单独的环境(具有单独的默认站点名称),但是将它们的所有环境访问密钥替换为您当前环境中使用的密钥,这样代理将从所有这些项目中挑选工作。
更新:
根据 Marty 的评论,这不是最佳解决方案。让我们使用 REST API 然后。
文档在这里https://www.appveyor.com/docs/api/environments-deployments/#start-deployment
检查下面的示例 PowerShell 函数。您可以在需要时使用 project-specific 参数调用它。
请注意,您还必须在站点的部署提供商设置中将 websitebuild.hostname
设置为 $(iis_site_name)
使用主机 header 而不是 * 绑定在 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 =@{
iis_site_name=$siteName
}
}
$jsonBody = $body | ConvertTo-Json -Depth 3
Invoke-RestMethod -Uri "$apiUrl/deployments" -Headers $headers -Body $jsonBody -Method Post
}