powershell - varios - tfs build predefined variables
Elimine archivos y foldes en Azure antes de una nueva implementación de VSTS (3)
Así es como puede probar la configuración que usa en los scripts de PowerShell anteriores utilizando Postman.
Me pareció útil jugar con la API REST usando Postman para comprender qué estaban haciendo los scripts de PowerShell anteriores y qué códigos de estado podía esperar de la API. También noté que la lógica recursiva para eliminar un directorio devuelve un error de Conflicto 409 a pesar de que SI elimina los archivos.
En los ejemplos a continuación, mi servicio de aplicación se llama "YatesDeleteMe"
Cree una cadena de nombre de usuario y contraseña codificada en base 64 para usar a continuación en su encabezado de autorización O ejecute los scripts de PowerShell anteriores y generará uno para usted
- Descargue el archivo de publicación de su servicio de aplicaciones, que puede descargarse de la pestaña Descripción general en Azure Portal.
- Abra el archivo con un editor de texto.
- Encuentre el nombre de usuario (ejemplo de nombre de usuario: $ YatesDeleteMe) y la contraseña (ejemplo de contraseña: ch222cDlpCjx4Glq333qo4QywGPMs1cK2Rjrn6phqZ9HswtgEEE12CrhDmcn)
- Cree una cadena con ellos y sepárelos con dos puntos (debería verse así: $ YatesDeleteMe: ch222cDlpCjx4Glq333qo4QywGPMs1cK2Rjrn6phqZ9HswtgEEE12CrhDmcn)
- Base 64 los codifica utilizando su propio programa de un site . El resultado debería verse así: JFlhdGVzRGVsZXRlTWU6Y2gyMjJjRGxwQ2p4NEdscTMzM3FvNFF5d0dQTXMxY0syUmpybjZwaHFaOUhzd3RnRUVFMTJDcmhEb
Recuperar un solo archivo
- Cartero abierto
- Cambia el verbo a GET
- Ingrese su URL en el archivo que desea recuperar (por ejemplo, https://YatesDeleteMe.scm.azurewebsites.net/api/vfs/site/wwwroot/web.config ). Para obtener más información sobre rutas, vea esto
-
Se agregó un encabezado ->
- Clave: Autorización
- Valor: básico YourBase64EncodedStringFromAbove
- Haga clic izquierdo en el botón "Enviar" y el archivo se descargará
Eliminar un solo archivo
- Cartero abierto
- Cambia el verbo a DELETE
- Ingrese su URL en el archivo que desea eliminar (por ejemplo, https://YatesDeleteMe.scm.azurewebsites.net/api/vfs/site/wwwroot/web.config )
-
Se agregó un encabezado ->
- Clave: Autorización
- Valor: básico YourBase64EncodedStringFromAbove
-
Se agregó un encabezado ->
- Clave: If-Match
- Valor: *
- Haga clic izquierdo en el botón "Enviar" y el archivo se eliminará
Eliminar todos los archivos en un directorio
- Cartero abierto
- Cambia el verbo a DELETE
- Ingrese su URL en la carpeta que desea eliminar ADEMÁS agregue una barra diagonal y luego la cadena de consulta? Recursive = true (por ejemplo, https://YatesDeleteMe.scm.azurewebsites.net/api/vfs/site/wwwroot/?recursive=true )
-
Se agregó un encabezado ->
- Clave: Autorización
- Valor: básico YourBase64EncodedStringFromAbove
-
Se agregó un encabezado ->
- Clave: If-Match
- Valor: *
- Haga clic izquierdo en el botón "Enviar" y la carpeta se eliminará. Siempre recibo un error 409, pero la carpeta se elimina.
Referencia
- Publicación de blog con fotos here .
Como parte de mi proceso de compilación en VSTS, quiero eliminar todos los archivos y carpetas (excepto algunos) de mi sitio azul antes de una nueva implementación. Supongo que usar una secuencia de comandos de Azure Powershell sería una buena idea y preferiría hacer una secuencia de comandos en línea.
Estoy usando Azure Resource Manager como tipo de conexión, seleccioné mi suscripción y tipo de script (Inline Script) pero luego me pierdo, ¿cómo selecciono el servicio de mi aplicación y, para empezar, enumero mis archivos?
Intentando, esto para una prueba, solo da mis archivos en mi entorno VSTS
Get-ChildItem -Path $(build.sourcesDirectory)
Aquí hay una versión modificada del script que debe incluirse en su proyecto y exportarse como un artefacto como parte de su construcción, yo llamo al mío Delete-WebAppFiles.ps1
Se expande en la respuesta anterior al manejar también aplicaciones virtuales y tener manejo de errores para el caso cuando los archivos no existen, por ejemplo, en la primera implementación en un nuevo entorno
param(
[string]$resourceGroupName,
[string]$webAppName,
[string]$appPath="wwwroot",
[string]$slotName="",
[string]$kuduPath,
[bool]$recursive=$false
)
function Get-AzureRmWebAppPublishingCredentials($resourceGroupName, $webAppName, $slotName = $null){
if ([string]::IsNullOrWhiteSpace($slotName)){
$resourceType = "Microsoft.Web/sites/config"
$resourceName = "$webAppName/publishingcredentials"
}
else{
$resourceType = "Microsoft.Web/sites/slots/config"
$resourceName = "$webAppName/$slotName/publishingcredentials"
}
$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force
Write-Host $publishingCredentials
return $publishingCredentials
}
function Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName, $slotName = $null){
$publishingCredentials = Get-AzureRmWebAppPublishingCredentials $resourceGroupName $webAppName $slotName
Write-Host $publishingCredentials.Properties.PublishingUserName
Write-Host $publishingCredentials.Properties.PublishingPassword
return ("Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword))))
}
function Delete-KuduFile($resourceGroupName, $webAppName, $appPath, $slotName, $kuduPath, $recursive){
$kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue $resourceGroupName $webAppName $slotName
if ($recursive -eq $true) {
if (-not ($kuduPath.endswith("recursive=true"))) {
if (-not ($kuduPath.endswith("/"))) {
$kuduPath += "/"
}
$kuduPath += "?recursive=true"
}
}
if ($slotName -eq ""){
$kuduApiUrl = "https://$webAppName.scm.azurewebsites.net/api/vfs/site/$appPath/$kuduPath"
}
else{
$kuduApiUrl = "https://$webAppName`-$slotName.scm.azurewebsites.net/api/vfs/site/$appPath/$kuduPath"
}
Write-Output $kuduApiUrl
Write-Output $kuduApiAuthorisationToken
try
{
Invoke-RestMethod -Uri $kuduApiUrl `
-Headers @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"} `
-Method DELETE
} catch {
Write-Host "StatusCode:" $_.Exception.Response.StatusCode.value__
Write-Host "StatusDescription:" $_.Exception.Response.StatusDescription
if (-not ($_.Exception.Response.StatusCode.value__ -eq 404)) {
throw $PSItem
}
}
}
Delete-KuduFile $resourceGroupName $webAppName $appPath $slotName $kuduPath $recursive
Luego puede agregar una tarea Powershell como se mencionó anteriormente que debería verse un poco así ...
Primero, es mejor incluir los archivos en el proyecto que necesita la aplicación web, luego simplemente marque Eliminar archivos adicionales en la opción de destino (Marque Publicar usando la opción Web Deploy primero) para eliminar archivos adicionales.
En segundo lugar, puede eliminar los archivos a través de la API de Kudu.
DELETE /api/vfs/{path} (Delete the file at path)
Para obtener más información, consulte: Interacción con el sistema de archivos virtual de Azure Web Apps con PowerShell y la API de Kudu
Actualización (Agregar muestra de Kudu):
- Agregar paso / tarea de Azure PowerShell
- Sepcifique los argumentos, por ejemplo: -resourceGroupName XXX -webAppName XXX -kuduPath Global.asax
Guión:
param(
[string]$resourceGroupName,
[string]$webAppName,
[string]$slotName="",
[string]$kuduPath
)
function Get-AzureRmWebAppPublishingCredentials($resourceGroupName, $webAppName, $slotName = $null){
if ([string]::IsNullOrWhiteSpace($slotName)){
$resourceType = "Microsoft.Web/sites/config"
$resourceName = "$webAppName/publishingcredentials"
}
else{
$resourceType = "Microsoft.Web/sites/slots/config"
$resourceName = "$webAppName/$slotName/publishingcredentials"
}
$publishingCredentials = Invoke-AzureRmResourceAction -ResourceGroupName $resourceGroupName -ResourceType $resourceType -ResourceName $resourceName -Action list -ApiVersion 2015-08-01 -Force
Write-Host $publishingCredentials
return $publishingCredentials
}
function Get-KuduApiAuthorisationHeaderValue($resourceGroupName, $webAppName, $slotName = $null){
$publishingCredentials = Get-AzureRmWebAppPublishingCredentials $resourceGroupName $webAppName $slotName
Write-Host $publishingCredentials.Properties.PublishingUserName
Write-Host $publishingCredentials.Properties.PublishingPassword
return ("Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $publishingCredentials.Properties.PublishingUserName, $publishingCredentials.Properties.PublishingPassword))))
}
function Delete-FileToWebApp($resourceGroupName, $webAppName, $slotName = "", $kuduPath){
$kuduApiAuthorisationToken = Get-KuduApiAuthorisationHeaderValue $resourceGroupName $webAppName $slotName
if ($slotName -eq ""){
$kuduApiUrl = "https://$webAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/$kuduPath"
}
else{
$kuduApiUrl = "https://$webAppName`-$slotName.scm.azurewebsites.net/api/vfs/site/wwwroot/$kuduPath"
}
Write-Output $kuduApiUrl
Write-Output $kuduApiAuthorisationToken
Invoke-RestMethod -Uri $kuduApiUrl `
-Headers @{"Authorization"=$kuduApiAuthorisationToken;"If-Match"="*"} `
-Method DELETE
}
Delete-FileToWebApp $resourceGroupName $webAppName $slotName $kuduPath