Búsqueda de sitios web

Implementando continuamente mis módulos PowerShell


Construir e implementar continuamente nuevas versiones de mis módulos en repositorios internos (o Galería de PowerShell) es algo que realmente me gusta. De esa manera puedo simplemente enviar mi código y dejar que la automatización se encargue del resto. Aquí hay algunos aprendizajes que he logrado.

Implementar en etiqueta

En primer lugar, normalmente solo activo un flujo de trabajo de implementación en etiquetas, de esta manera puedo decidir manualmente cuándo realizar un lanzamiento y qué versión tendrá sin depender de ningún método complejo. Mis módulos suelen ser bastante pequeños y rara vez somos más de un puñado de personas trabajando en cada uno de ellos, por lo que intento mantener las cosas lo más simples posible.

Crear una etiqueta con git es realmente simple, solo hago esto:

git tag -a 1.4.2 -m 'Release 1.4.2'

Anoto cada etiqueta con mi versión deseada, luego, usando gitversion, puedo analizar la versión semántica de mi etiqueta y siempre obtendré la versión correcta. Gitversion también realiza un seguimiento de los números de compilación para que pueda compilar y probar en cada confirmación (incluso si no implementaré el resultado en un repositorio). Puede leer más sobre gitversion aquí: https://gitversion.readthedocs.io/en/latest/

Construir mi módulo

Cuando trabajo en mi módulo, me gusta mantener mi código dividido en archivos diferentes. En primer lugar, normalmente tengo dos subcarpetas, Privada y Pública. Cada uno contiene archivos ps1 con funciones públicas o privadas. Dentro de estas carpetas suelo crear una ps1 para cada conjunto o grupo de funciones similares. Así es como me he acostumbrado a trabajar y es posible que tengas otra forma de hacer las cosas y está bien. Sin embargo, descubrí que tener muchos archivos a veces hace que el tiempo de carga de mi módulo sea muy lento, por lo que se me ocurrió una manera de combinar todos los archivos en un archivo psm1 grande al compilarlo. Simplemente obtengo el contenido de todos ellos y lo envío a .\bin\MyModule\MyModule.psm1. Este es un ejemplo de la carpeta de mi módulo antes de la compilación:

También a menudo me olvido de exportar mis funciones públicas. Al principio tenía un archivo ps1 por función y usaba el nombre del archivo para encontrar funciones para exportar, pero esto me dio paso a muchos archivos con los que trabajar, así que ahora uso AST para analizar funciones de todos los archivos ps1 en mi carpeta Pública. . De esta manera puedo agregar un Export-ModuleMember con los parámetros correctos al final de mi archivo psm1.

Un fragmento del código que utilizo para combinar todos los archivos de la carpeta pública en un bloque de script y analizar funciones y nombres de alias es este:

$PublicScriptBlock = [ScriptBlock]::Create((Get-ChildItem -Path $PublicFolder | Get-Content | Out-String))
$PublicFunctions = $PublicScriptBlock.Ast.FindAll({ $args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst]},$false).Name
$PublicAlias = $PublicScriptBlock.Ast.FindAll({ $args[0] -is [System.Management.Automation.Language.ParamBlockAst] },$true).Attributes.Where{$_.TypeName.FullName -eq 'alias'}.PositionalArguments.Value

Manifiesto del módulo de actualización

Como uso gitversion, mi nueva versión se encuentra con este comando:

$gitversion = gitversion | ConvertFrom-Json
if($gitversion.BuildMetaData) {
$ModuleVersion = $gitversion.MajorMinorPatch + '.' + $gitversion.BuildMetaData
}
else {
$ModuleVersion = $gitversion.MajorMinorPatch
}

Si mi última confirmación es una etiqueta denominada 1.4.2, esta será mi nueva versión. Sin embargo, si agrego tres confirmaciones después de esa etiqueta, mi nueva versión será 1.4.2.3.

A continuación necesito actualizar mi ModuleManifest. ¡Para esto, Update-ModuleManifest es genial! Si no lo tienes, consíguelo instalando el módulo PowerShellGet desde la galería (https://www.powershellgallery.com/packages/PowerShellGet). Si ya lo tienes, asegúrate de estar usando la última versión.

Update-ModuleManifest -Path '.\bin\MyModule\MyModule.psd1' -ModuleVersion $ModuleVersion

Artículos relacionados