OctopusDeploy - 部署中的每个网站都有不同的AppPool和网站名称;如何解决;没有其他差异

时间:2014-10-24 12:30:03

标签: powershell octopus-deploy

我尝试设置一个针对16个网站的部署流程,每个网站都托管同一个应用程序的实例。

网站和AppPools的命名如下:

appServer1:

app10.site.com

app11.site.com

app12.site.com

app13.site.com

appServer2:

app20.site.com

app21.site.com

app22.site.com

app23.site.com

...每个网站都有一个相应命名的AppPool。

我正在拼命尝试确定如何使用单个Deploy NuGet Package步骤,如果可能,使用变量和powershell脚本的组合来定位所有这些网站/应用程序池。

我希望只有一个步骤可以替代网站和应用程序池名称。因为这是唯一的区别。我基本上需要相当于能够循环nuget包步骤传递一个网站和应用程序池名称列表。我不能简单地使用变量,因为我只能使用变量作用域解析到机器级别。

创建所有Website和AppPool名称的列表,迭代它们将每个值传递给Step执行。 ForEach处理步骤缺乏更好的单词。

我确实能够重命名AppPools,如果需要更一致的模式,但我无法更改网站名称

非常感谢任何想法。

http://help.octopusdeploy.com/discussions/questions/3481-every-website-in-the-deploy-has-a-different-apppool-and-website-name-how-to-deal-no-other-differences

1 个答案:

答案 0 :(得分:0)

你的问题有很多,但我会尝试解释我们的方法,希望能够慢慢增加你的创意。

TL;博士

简单地说,使用您自己的PowerShell脚本来安装Web应用程序。在那里,您可以基于每个网站设置应用程序池名称


对于初学者,我们为每个项目执行单独的部署步骤。我们使用的脚本允许您从单个deploy.ps1(包括唯一的appPool名称)执行所有部署,但我们发现它确实有助于使每个部署保持良好和精简,并且易于管理。每个项目都有自己的nupkg,其中包含predeploy.ps1,deploy.ps1和postdeploy.ps1以及build/deploy scripts that we've open sourcesd文件夹和环境配置xml文件的文件夹。

环境配置的示例就是这样。名称只是[envName] .xml

<!-- environments\Production.xml -->
<environmentSettings>
    <webSites>
        <app>
            <physicalPathRoot>c:\inetpub</physicalPathRoot>
            <physicalFolderPrefix>appname</physicalFolderPrefix>
            <siteProtcol>https</siteProtcol>
            <siteName>appname.tld</siteName>
            <siteHost>appname.tld</siteHost>
            <portNumber>443</portNumber>
            <appPath>/</appPath>
            <appPool>
                <name>appname.tld</name>
                <!-- valid identityTypes are: [LocalSystem, LocalService, NetworkService, SpecificUser, ApplicationPoolIdentity] -->
                <identityType>NetworkService</identityType>
                <!-- Set this value to the User the Service will run under in the format DOMAIN\username -->
                <!-- If Running as 'NetworkService' then 'NT AUTHORITY\Network Service' is used -->
                <userName>NT AUTHORITY\Network Service</userName>
                <!-- Leave blank unless using SpecificUser -->
                <password></password>
                <maxWorkerProcesses>5</maxWorkerProcesses>
            </appPool>
        </app>
    </webSites>
    <serverDatabase>
        <name>database_name</name>
        <connectionString>REPLACED BY OCTOPUS</connectionString>
        <providerName>System.Data.SqlClient</providerName>
    </serverDatabase>
</environmentSettings>

您可以在我们加载配置的相应Get-EnvironmentSettings.ps1中看到,然后使用任何八达通变量更新它。这是最棘手的部分,因为我们使用dot-Notation来更新路径(区分大小写)。

我们的章鱼变量实际上只包含秘密信息,因为其他所有信息都存在于[环境] .xml

|   Name                             |     Value            |  Scope
-------------------------------------------------------------------------- 
| webSites.app.appPool.password      |     supersecret      | Production

现在,典型的部署脚本只需导入模块,获取环境设置,更新配置并安装Web应用程序。

# Top of the script, get Octopus environment and version
param( 
    [string] $version = $OctopusPackageVersion,
    [string] $environment = $OctopusEnvironmentName
)

# Make sure a failed deployment actually fails
$ErrorActionPreference = "Stop"

# Import the modules
$currentDir = Split-Path $script:MyInvocation.MyCommand.Path
$moduleDir = "$currentDir\modules"
Import-Module BuildDeployModules

# Grab the environment settings
$environmentSettings = Get-EnvironmentSettings $environment "//environmentSettings"
$databaseSettings = $environmentSettings.serverDatabase
$websiteSettings = $environmentSettings.webSites.app

# update the config
Update-XmlConfigValues $currentDir\website\Web.config "//appSettings/add[@key='databaseName']" $($databaseSettings.name) "value"
Update-XmlConfigValues $currentDir\website\Web.config "//connectionStrings/add[@name='databaseConnection']" $($databaseSettings.connectionString) "connectionString"
Update-XmlConfigValues $currentDir\website\Web.config "//connectionStrings/add[@name='databaseConnection']" $($databaseSettings.providerName) "providerName"

# Install the web application
Install-WebApplication $environment $websiteSettings $version "anonymousAuthentication"

在执行所有这些操作时,Web应用程序将安装到具有特定应用程序池的IIS中,并且适当的配置转换而不依赖于任何未知数。

我们的nupkg结构看起来像这样

  • appname.1.2.3.4.nupkg
    • 环境
      • dev.xml
      • staging.xml
      • qual.xml
      • production.xml
    • 模块
      • [我们所有的构建模块]
    • 网站
      • [我们所有的网站文件]

这是超级可重复,易于维护和易于编辑的配置。希望它有所帮助