关于Jenkins:MS Web Deploy Ignoring <setParameter> Entries Writing to wrong file

MS Web Deploy Ignoring <setParameter> Entries + Writing to wrong file

问题

  • 我们需要 3 个参数来使用我们的 3rd 方服务进行身份验证:用户名、密码、securityToken,它们存在于意想不到的地方(取决于它们可能在 Web.config 或 CI 构建脚本中的环境)。
  • 我们要求 MS Web Deploy 从我们的 XML 文件中写入 <setParameter> 值,但它忽略了一些……特别是用户名、密码和安全令牌参数
  • MS Web Deploy 想要写入 \\Views\\Web.config。我们要写入 \\Web.config
  • 2个进球

  • 将我们所有的身份验证凭据组织到对应于每个或我们的环境(开发、质量保证和生产)的 DeploySettings.xml 文件中。
  • <setParameter> 值写入 \\\\\\\\Web.config 而不是 \\\\\\\\Views\\\\\\\\Web.config
  • 细节

    • 我们正在使用 Jenkins 进行持续集成。
    • Jenkins 正在调用 MS Web Deploy 3 来处理部署。
    • 我们将为每个环境创建一个 DeploySettings 文件。
    • 我目前正在开发我们的开发环境。对于这个问题的范围,我将指代我们的 "dev" 环境及其各自的 DeploySettings.Dev.xml 文件
    • Jenkins 部署脚本告诉 Web 部署使用 -setParamFileDeploySettings.Dev.xml 文件中的 <setParameter> 值覆盖 \\\\\\\\Web.config 值

    调用 DeploySettings 文件的部署脚本

    1
    -setParamFile:"%WORKSPACE%\\DeploySettings.Dev.xml" -verbose

    部署设置.Dev.xml

    a???? This is not the entire file

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="utf-8"?>
    <parameters>
      <setParameter
        name="username"
        value="lukeSkywalker" />
      <setParameter
        name="password"
        value="xxxxxx" />
      <setParameter
        name="token"
        value="xxxxxx" />
      <setParameter
        name="DBConnection"
        value="Data Source=fully.qulified.domain;Initial Catalog=CatalogName;uid=obiwan;password=xxxxx;MultipleActiveResultSets=True" />
      <setParameter
        name="SessionDBConnection"
        value="Data Source=1.2.3.4;uid=userId;password=xxxxxx" />
    ...

    详细的 Jenkins 部署控制台日志记录表明用户名、密码和令牌被忽略

    note that username, password and token are absent

    1
    2
    Verbose: Parameter entry 'DBConnection/1' is applicable to '\\Web.config' because of its scope.
    Verbose: Parameter entry 'SessionDBConnection/1' is applicable to '\\Web.config' because of its scope.

    详细的 Jenkins 部署控制台日志记录显示我们正在写入错误的文件 (\\\\\\\\Views\\\\\\\\Web.config)

    1
    2
    3
    4
    5
    Verbose: Parameter entry 'DBConnection/1' is applicable to '\\Views\\Web.config' because of its scope.
    Verbose: Parameter entry 'DBConnection/1' could not be applied to '\\Views\\Web.config'. Deployment will continue with the original data. Details:

    Verbose: Parameter entry 'DBConnection/1' is applicable to '\\Views\\Web.config' because of its scope.
    Verbose: Parameter entry 'DBConnection/1' could not be applied to '\\Views\\Web.config'. Deployment will continue with the original data. Details:

    燃烧的问题

    • 如何配置 Web 部署以写入 \\\\\\\\Web.config? \\\\\\\\Views\\\\\\\\Web.config 错误
    • 如何配置 -setParamFile 以获取和覆盖 usernamepasswordtoken

    感谢您的宝贵时间。


    问题解决了

    我将这种类型的配置重写工作移到了构建脚本中(Jenkins > "Your Project "> Build > Configure)。

    这是我如何让它工作的一个例子

    1
    2
    3
    4
    5
    6
    7
    8
    SET PATH=%PATH%;c:\\Program Files (x86)\\IIS\\Microsoft Web Deploy V3
    msdeploy.exe -verb:sync -source:dirPath="%WORKSPACE%" ^
      -dest:package="%WORKSPACE%\\ArtifactName-%BUILD_NUMBER%.zip" ^
      -replace:objectName=dirPath,targetAttributeName=path,match="^C:\\\\.*\\\\pathToSite",replace="c:\\sitesRoot\\pathToSite" ^
      -declareParam:name=DBConnection,kind=XmlFile,scope=Web.config,match=//configuration/connectionStrings/add/@connectionString,defaultValue="Data Source=1.2.3.4;Initial Catalog=dbName;uid=website;password=xxxx;MultipleActiveResultSets=True" ^
      -declareParam:name=SessionDBConnection,kind=XmlFile,scope=Web.config,match=//configuration/system.web/sessionState/@sqlConnectionString,defaultValue="Data Source=1.2.3.4;uid=xxxx;password=xxxx" ^
      -declareParam:name=Parameter1,kind=XmlFile,scope=Web.config,match=//configuration/appSettings/add[@key="Parameter1"]/@value,defaultValue="paramValue1" ^
      -declareParam:name=Paramtere2,kind=XmlFile,scope=Web.config,match=//configuration/appSettings/add[@key="Parameter2"]/@value,defaultValue="paramvalue2" ^