update - Programaticalmente encuentra cambios en TFS desde la última buena construcción
tfs 2018 update 3 (2)
Tengo varias ramas en TFS (desarrollo, prueba, etapa) y cuando fusiono los cambios en la rama de prueba, quiero que el script automatizado de compilación e implementación encuentre todos los archivos SQL actualizados y los implemente en la base de datos de prueba.
Pensé que podría hacer esto al encontrar todos los conjuntos de cambios asociados con la construcción desde la última compilación, encontrar todos los archivos sql en los conjuntos de cambios y desplegarlos. Sin embargo, parece que no estoy teniendo el conjunto de cambios asociado con la construcción por alguna razón, por lo que mi pregunta es doble:
1) ¿Cómo me aseguro de que un conjunto de cambios esté asociado con una compilación en particular?
2) ¿Cómo puedo obtener una lista de los archivos que han cambiado en la sucursal desde la última compilación? Tengo la última compilación construida con éxito, pero no estoy seguro de cómo obtener los archivos sin verificar los conjuntos de cambios (que, como se mencionó anteriormente, no están asociados con la compilación).
Entonces puedo entender el atractivo intuitivo de este enfoque, pero no creo que sea el camino correcto.
Por un lado, va a ser difícil. Pero el segundo problema es que TFS no tiene una buena forma de registrar datos de implementación.
Para la primera pregunta, no estoy seguro de lo que eso significa. Para la segunda pregunta, puede usar las etiquetas de compilación y la lista de historial de hoy de los archivos modificados.
Como alternativa, podría reconsiderar cómo desea administrar los cambios SQL. Utilizo un método de baja tecnología para mantener los cambios pendientes actuales en un directorio, y luego de implementar moviendo los archivos a un directorio diferente. Este método se puede mejorar manteniendo una tabla de historial de despliegue en la base de datos. También es posible que desee examinar la adición de vsts DB, el CTP actual tiene muchas características nuevas relacionadas con la administración de cambios en la base de datos. También escuché que Red Gate también tiene buenas herramientas de administración de bases de datos.
Gracias Scott,
Después de un tiempo encontré una buena manera de manejar esto.
Básicamente, creé una tarea que obtiene los conjuntos de cambios actuales asociados con la compilación (el punto 1 de mi pregunta no es un problema) y luego los busqué en busca de archivos .sql. Una vez que tengo una lista de ellos, puedo crear un script de cambio o ejecutarlos en la base de datos de destino.
El código se ve así:
TeamFoundationServer tfs = new TeamFoundationServer(TfsServerUrl);
VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
var buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));
IBuildDetail build = buildServer.GetBuild(
new Uri(BuildUri)
, null
, QueryOptions.All
);
build.RefreshAllDetails();
var changesets = InformationNodeConverters.GetAssociatedChangesets(build);
foreach (var changesetSummary in changesets)
{
Changeset changeSet = vcs.GetChangeset(changesetSummary.ChangesetId);
sqlFilePaths.AddRange(
ProcessChangeSet(changeSet)
);
}
y el código dentro de ProcessChangeSet se parece a
List<string> sqlFilePaths = new List<string>();
foreach (Change change in changeSet.Changes)
{
if ((change.Item.ItemType == ItemType.File)
&& (change.Item.ServerItem.EndsWith(".sql", StringComparison.OrdinalIgnoreCase))
)
{
sqlFilePaths.Add(
sqlPath
);
}
}
return sqlFilePathes;
Pero si alguien quiere, me complace darles el código completo. Asegura que los procedimientos almacenados estén sincronizados en todo el sistema. Esto solo deja cambios de esquema para administrar manualmente dentro de mi base de datos, lo que me complace hacer.