Resumen
Esta extensión fue diseñada para realizar transformación de archivos de configuración de soluciones .NET, como por ejemplo los archivos Web.config de los proyectos web. Permite cambiar los valores del archivo que correspondan con los nodos appSettings
, applicationSettings
, connectionStrings
y endpoint
, además de poder transformar otros nodos diferentes a los mencionados, archivos Data Source de reportes y los reportes mismos. Podrá encontrar más detalles de la extensión en secciones posteriores.
La extensión tomará las variables del pipeline, y comparará contra el archivo en los nodos anteriormente mencionados. Podrá ver un archivo de ejemplo en sección Ejemplo de uso de la extensión.
Requisitos de uso
Para el uso de esta extensión se necesitará tener instalado en el agente, al menos la versión 5 de PowerShell.
Parámetros
Archivo a transformar: Este será el archivo físico a transformar con extensiones XML, CONFIG, RDS o RDL. Debe ser la ruta completa del donde se ubica el archivo. Para la opción RDL (parámetro Tipo de archivo), podrá seleccionar la carpeta de reportes completa y se tomarán todos los archivos con la extensión .rdl, o solo un archivo específico.
Tipo de archivo: Opción que permite seleccionar solo una de las tres posibles XML (estará seleccionada por defecto), RDS y RDL. Se describe cada una de las opciones a continuación:
- XML: Seleccionar en el caso de que el archivo a modificar sea con extensión XML o CONFIG,
- RDS: Seleccionar cuando el formato sea RDS o DataSource para reportes.
- RDL: Seleccionar cuando el formato sea RDL o una carpeta de archivos de reportes.
Nombre del Data Source: Visible solo cuando se selecciona la opción RDS del parámetro Tipo de archivo. Es el nombre del Data Source que se desea publicar.
Cadena de conexión: Igual que el parámetro anterior, solo es visible con la opción RDS seleccionada. Será la cadena de conexión que se le desee colocar al Data Source.
Nombre del Data Source para reportes: Visible solo cuando se selecciona la opción RDL del parámetro Tipo de archivo. Será el nombre del Data Source que tendrá el reporte o reportes que se deseen publicar.
Grupo: Otros nodos y etiquetas: En este grupo, podrá encontrar un campo de texto multilínea para escribir, llamado Nodos y etiquetas, el cual se describe a continuación:
- Nodos y etiquetas: En este espacio, se podrán especificar nodos y otras etiquetas que se deseen cambiar, pero que ya la transformación normal ha cambiado, o aquellos que no se encuentren entre los descritos en el resumen. Por ejemplo, para un nodo
<endpoint name="conexion" address="https://misitio.com">
, la extensión cambiará el valor del atributo address si en el grupo de variables existe una variable con el nombre conexion, pero si realmente a ese atributo se le deseaba poner el valor de otra variable, entonces es cuando se usa este parámetro. Se debe colocar texto en formato JSON de la siguiente manera:
{
"etiquetas": [
{
"etiqueta": "",
"atributo": "",
"valor": ""
}
],
"connectionStrings": [
{
"llave": "",
"valor": ""
}
],
"appSettings": [
{
"llave": "",
"valor": ""
}
],
"applicationSettings": [
{
"llave": "",
"valor": ""
}
],
"endpoints": [
{
"llave": "",
"valor": ""
}
]
}
Con el formato anterior, lo que se pretende es, que se coloque en el atributo "llave" el identificador con el cual buscar entre la etiqueta XML especificada, para así cambiarle el valor por el que posea el atributo "valor".
El atributo "etiquetas", está diseñado para realizar el cambio de valor en etiquetas que no son del tipo especificado al inicio en el Resumen, si no que tienen otros nombres pero también se desean cambiar. Verá un ejemplo de esto más adelante en la sección Ejemplo de uso de la extensión.
Importante destacar, que no son necesarios todos los atributos en el formato JSON, solo debe incluir aquellos que necesita, es decir, puede que la necesidad sea solo cambiar uno o dos valores en los nodos endpoints.
Ejemplo de uso de la extensión
A continuación podrá ver un ejemplo con cada uno de los tipos de archivo de las opciones del parámetro Tipo de archivo:
Archivos de configuración
Estos archivos suelen ser los utilizados para configuraciones de proyectos .NET, comunmente se encuentran con los nombre App.config o Web.config dentro de los proyectos. A continuación un ejemplo de un archivo:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="Connections" type="MyAppConnection, MyApp.DAL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<section name="AnotherService" type="AnotherService, AnotherService.WCF" />
</configSections>
<Connections>
<DATA_Base DataBase="SqlServer" ConnectString="Data Source=MyDBServer;Initial Catalog=DBName;Integrated Security=True;Connect Timeout=60;Pooling=True;Enlist=True" providerName="System.Data.SqlClient" />
</Connections>
<AnotherService WebSite="https://www.test.com:8974/MyOtherService/" UseSsl="false" SecurytProtocol="">
<Authenticate Uri="static-pwd" Method="POST" TimeOut="30000" />
</AnotherService>
<appSettings>
<add key="App_EventLogName" value="MyAppName"/>
<add key="App_EventLogSource" value="MyAppModule"/>
<add key="Archivo_Log" value="D:\Temp\ErrorsLog\"/>
<add key="WaitForSeconds" value="40" />
<add key="SharedFolder" value="\\MyAppFolder\Shared\" />
</appSettings>
<connectionStrings>
<add name="MyEntity" connectionString="metadata=res://*/EDM.EDMEntity.csdl|res://*/EDM.EDMEntity.ssdl|res://*/EDM.EDMEntity.msl;provider=System.Data.SqlClient;provider connection string="data source=MyServerName;initial catalog=MyDBName;integrated security=True;application name=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
<system.web>
<compilation targetFramework="4.5.2" debug="true"/>
<httpRuntime targetFramework="4.5.2" enableVersionHeader="false"/>
</system.web>
<applicationSettings>
<WS_MyApp_Dao.Properties.Settings>
<setting name="My_App_Settings_1" serializeAs="String">
<value>http://localhost:48519/WsService1.asmx</value>
</setting>
<setting name="My_App_Settings_2" serializeAs="String">
<value>http://localhost:48519/WsService2.asmx</value>
</setting>
<setting name="My_App_Settings_3" serializeAs="String">
<value>http://localhost:48519/WsService3.asmx</value>
</setting>
</WS_MyApp_Dao.Properties.Settings>
</applicationSettings>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http"/>
</protocolMapping>
<client>
<endpoint address="http://localhost/MyAppService/service_A.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServiceA" contract="MyAppService.service_A" name="BasicHttpBinding_ServiceA"/>
<endpoint address="http://localhost/MyAppService/service_B.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IServiceB" contract="MyAppService.service_A" name="BasicHttpBinding_ServiceB"/>
</client>
</system.serviceModel>
</configuration>
Para poder convertir estos archivos, se utiliza la opción XML de la extensión, epecificando el archivo en el parámetro Archivo a transformar:
Lo que la extensión lleva a cabo es una sustitución de valores en el archivo, en conjunto con las variables del pipeline. Por ejemplo, si el pipeline utiliza una variable con el nombre BasicHttpBinding_ServiceA y con el valor http://localhost/otherService/service.asmx, entonces la extensión buscará una etiqueta XML (appSetting, applicationSetting, connectionString o endpoint) con el atributo name o key que coincida con ese nombre, y le colocará el valor que tenga la variable en el pipeline. Lo mismo aplica para las demás atiquetas mencionadas.
El parámetro Nodos y etiquetas se utiliza en conjunto con la opción XML. Utilizando el ejemplo anterior, puede ocurrir que el valor que tiene la variable, no es el indicado para la etiqueta en el archivo, es decir, podría quererse que el valor en la etiqueta sea el de la variable BasicHttpBinding_ServiceA_Copia que tiene el valor http://localhost/otherService_version/Ws_AnotherService.asmx, y no el de la variable BasicHttpBinding_ServiceA. Para ello, en el campo de texto del parámetro se especificará un texto en formato JSON como el siguiente (puede encontrar información del formato en la descripción del parámetro Grupo: Otros nodos y etiquetas):
{
"endpoints": [
{
"llave": "BasicHttpBinding_ServiceA",
"valor": "$(BasicHttpBinding_ServiceA_Copia)"
}
]
}
Al hacer esto, el valor de la etiqueta cambiará con respecto al indicado en la variable entre paréntesis (forma de pasar variables del pipeline a las extensiones en Azure DevOps).
Por otra parte, si verifica en el formato XML adjunto arriba, podrá encontrar que se encuentran dos etiquetas con los nombres Connections y AnotherService. Para estas etiquetas la extensión necesita ayuda mediante el parámetro Nodos y etiquetas, esto colocando en formato JSON el nombre de la etiqueta, el atributo de ese nodo a cambiar y el valor que se le dará para sustituirlo. El formato será como el siguiente, usando el XML de arriba (puede encontrar información del formato en la descripción del parámetro Grupo: Otros nodos y etiquetas):
{
"etiquetas": [
{
"etiqueta": "Connections",
"atributo": "ConnectString",
"valor": "$(ConnectionString_BD)"
},
{
"etiqueta": "AnotherService",
"atributo": "WebSite",
"valor": "$(WebSite_AnotherService)"
}
]
}
Donde ConnectionString_BD será una variable que el pipeline utilice. En el ejemplo anterior del formato JSON también se incluye una sustitución para el nodo con el nombre AnotherService y el atributo WebSite, colocandole el valor de la variable en el pipeline WebSite_AnotherService.
Archivos de Data Source (RDS)
Generalmente los archivos RDS tienen la siguiente extructura XML:
<?xml version="1.0" encoding="utf-8"?>
<RptDataSource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="DsMyReports">
<ConnectionProperties>
<Extension>SQL</Extension>
<ConnectString>Data Source=MyServerName;Initial Catalog=MyDbName</ConnectString>
</ConnectionProperties>
<DataSourceID>cc49058c-a9aa-1cf8-9147-91de75643a02</DataSourceID>
</RptDataSource>
Al marcar la opción RDS, los parámetros Nombre del Data Source y Cadena de conexión serán visibles y lo que se debe indicar en ellos será el nombre que poseerá el Data Source para los reportes y la cadena de conexión del mismo hacia la base de datos adecuada, respectivamente. Estos valores coincidarán con el atributo Name de la etiqueta RptDataSource, y con el valor de la etiqueta ConnectString. El resto de valores en el archivo no cambiará.
Archivos de reporte (RDL)
Los archivos RDL tienen una estructura algo grande, por lo que a continuación se mostrará uan básica como ejemplo:
<?xml version="1.0" encoding="utf-8"?>
<Report MustUnderstand="df" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:df="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition/defaultfontfamily">
<df:DefaultFontFamily>Segoe UI</df:DefaultFontFamily>
<AutoRefresh>0</AutoRefresh>
<DataSources>
<DataSource Name="DsMyReports">
<DataSourceReference>DsMyReports</DataSourceReference>
<rd:SecurityType>None</rd:SecurityType>
<rd:DataSourceID>46328abc-edd2-5cba-8227-a8e0ce537661</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="DataSet1">
<Query>
<DataSourceName>DsMyReports</DataSourceName>
<QueryParameters>
<QueryParameter Name="@IdTransaction">
<Value>=Parameters!IdTransaction.Value</Value>
</QueryParameter>
</QueryParameters>
<CommandText>SELECT * FROM table_name</CommandText>
</Query>
<Fields>
<Field Name="Rep_Id">
<DataField>Rep_Id</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
<Field Name="Rep_TransactionDate">
<DataField>Rep_TransactionDate</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
</Fields>
</DataSet>
</DataSets>
<ReportParameters>
<ReportParameter Name="IdTransaction">
<DataType>String</DataType>
<Nullable>true</Nullable>
<Prompt>IdTransaction</Prompt>
<Hidden>true</Hidden>
</ReportParameter>
</ReportParameters>
<ReportParametersLayout>
<GridLayoutDefinition>
<NumberOfColumns>4</NumberOfColumns>
<NumberOfRows>2</NumberOfRows>
<CellDefinitions>
<CellDefinition>
<ColumnIndex>0</ColumnIndex>
<RowIndex>0</RowIndex>
<ParameterName>IdTransaction</ParameterName>
</CellDefinition>
</CellDefinitions>
</GridLayoutDefinition>
</ReportParametersLayout>
<rd:ReportUnitType>Inch</rd:ReportUnitType>
<rd:ReportServerUrl>http://myServer:8080/Reports</rd:ReportServerUrl>
<rd:ReportID>8975a17a-c4b5-538d-cd8e-b53ad91ae0bf</rd:ReportID>
</Report>
Al marcar la opción RDL, el parámetro Nombre del Data Source para reportes será visible y lo que se debe indicar en el será el nombre que poseerá el Data Source para el o los reportes que se deseen publicar luego. Este valor coincidará con las etiquetas <DataSource>
, <DataSourceReference>
y <DataSourceName>
en el XML del reporte. El resto de valores en el archivo no cambiará.