2016-06-20 17 views
6

Sto utilizzando il passaggio di build "Distribuzione Web di Azure" in VSTS per pubblicare un'API Core ASP.NET in un Azure Web App:Distribuzione applicazione Web di Azure: Web Deploy non può modificare il file sulla destinazione perché è bloccato da un processo esterno

Azure Web App Deployment

di tanto in tanto, questo passaggio rompe con il seguente errore:

[error]Microsoft.Web.Deployment.DeploymentDetailedClientServerException: Web Deploy cannot modify the file 'MyProject.Api.exe' on the destination because it is locked by an external process. In order to allow the publish operation to succeed, you may need to either restart your application to release the lock, or use the AppOffline rule handler for .Net applications on your next publish attempt. Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE .

This GitHub issue solleva lo stesso problema, ma non esiste una soluzione suggerito di utilizzare i Azure Web App Deployment costruire passo.

risposta

15

Come da un thread separato nel repository Microsoft Github here, c'è una soluzione alternativa hacky in cui se si aggiunge la seguente chiave ai appSettings Azure, può aiutare a risolvere l'errore di distribuzione file bloccato:

MSDEPLOY_RENAME_LOCKED_FILES = 1 

Non sono sicuro per quanto tempo sarà supportato questo trucco di app, ma mi ha aiutato a risolvere il problema personalmente.

enter image description here

+0

Grazie per l'aggiornamento su questo. – davenewza

+0

Un'osservazione è che risolve il problema di distribuzione, ma poiché l'articolo viene rinominato non verrà raccolto la prossima volta che l'app si ricaricherà. Quindi l'exe che è stato rinominato non inizierà in realtà la prossima volta, ma il vecchio exe verrà comunque utilizzato. –

+1

@GeorgeOnofrei yeah Penso che il tuo chilometraggio varierà su questo. Ho visto gli altri che descrivono il problema di cui stai parlando, ma per me personalmente sembra che stia prendendo in mano la nuova DLL. –

0

Ci sono alcune attività dedicate per i progetti principali di asp.net perché il processo di distribuzione è leggermente diverso.
È possibile ottenere quelli dal mercato gratuitamente, controlla DNX Tasks vsts marketplace
Speranza che aiuta !!

7

È possibile creare due script Power Shell:

stopapp.ps1:

param($websiteName) 
$website = Get-AzureWebsite -Name $websiteName 
Stop-AzureWebsite -Name $websiteName 

startapp.ps1:

param($websiteName) 
$website = Get-AzureWebsite -Name $websiteName 
Start-AzureWebsite -Name $websiteName 

e quindi aggiungere un compito "Azure PowerShell" prima e dopo Attività di "Distribuzione di app Web di Azure" per arrestare l'app Web prima della distribuzione e avviare l'app dopo la distribuzione. enter image description here

+0

La tua risposta è stata utile come al solito, grazie Eddie. L'unica cosa che mancava era un modo per specificare lo slot di distribuzione ma era abbastanza facile cambiare i tuoi script per farlo. –

+0

Grazie, questo è molto utile! Ho una domanda: come e dove carichi gli script di Powershell? Li incorporate nella vostra soluzione. Ho un'app di asp.net. – sebvst

+1

@sebvst Basta controllare nel controllo del codice sorgente. E c'è un'estensione che puoi usare per farlo più facilmente ora: https://marketplace.visualstudio.com/items?itemName=amel.appservices-start-stop –

0

risposta di Eddie era vicino a quello che mi serviva, l'unica cosa che mancava era un modo per specificare lo slot di distribuzione:

stopapp.ps1

param($websiteName, $websiteSlot) 
$website = Get-AzureWebsite -Name $websiteName -Slot $websiteSlot 
Stop-AzureWebsite -Name $websiteName -Slot $websiteSlot 

startapp.ps1

param($websiteName, $websiteSlot) 
$website = Get-AzureWebsite -Name $websiteName -Slot $websiteSlot 
Start-AzureWebsite -Name $websiteName -Slot $websiteSlot 

E quindi sull'attività di Azure PowerShell Gli argomenti dello script possono essere qualcosa del tipo:

-websiteName "{mywebsite}" -websiteSlot "{mydeploymentslot}" 
2

Prendendo sito offline, mentre il rilascio dovrebbe fare il trucco.

enter image description here

+1

Questo funziona. Lo farei solo, o qualsiasi riavvio app basato su script su uno slot di gestione temporanea, per ovvi motivi. – DivineOps

2

ero alle prese con lo stesso problema di blocco.
ci sono ora una nuova attività (in anteprima) che è possibile aggiungere per avviare e arrestare il servizio App:

enter image description here

aggiungere un'attività di arresto prima della distribuzione e un compito inizio dopo la distribuzione.

enter image description here

Questo ha fatto il trucco per me.

+0

Penso che da tutte le soluzioni questo sia il migliore –

+0

d'accordo, questo è quello che stiamo usando per distribuire un .NET Core web api –

Problemi correlati