настройка приложения Click Once в Octopus, развертывание с помощью mage.exe, изменение URL-адреса публикации и app.config

Я пытаюсь опубликовать щелчок один раз со следующим процессом:

  • GitHub фиксирует
  • Teamcity строит и создает базовый (неподписанный артефакт)
  • нажать на Octopus Deploy
  • Octopus меняет URL-адрес публикации и настройки приложения
  • Octopus использует мага, чтобы изменить вышеперечисленное, воссоздать файл приложения, манифестировать и уйти в отставку.
  • Octopus отправляет файлы на сайт развертывания

У меня вышеприведенное примерно работало, пока мне не понадобилось изменить настройку приложения со следующим предостережением:

  • изменился только URL публикации
  • использовал мага для повторной подписи файлов, но не регенерировал никаких файлов.

Теперь он опубликует файлы и дойдет до загрузки и попытки запустить/установить приложение и выдаст следующую ошибку:

 Activation of http://myapp-setuptool-dev.mysite.co.uk/myappSetupTool.application resulted in exception. Following failure messages were detected:
        + Downloading http://myapp-setuptool-dev.mysite.co.uk/Application Files/myappSetupTool_0_1_1_110/myappSetupTool.exe.config did not succeed.
        + The remote server returned an error: (404) Not Found.

Чтобы заставить Octopus выполнить преобразование конфигурации за меня, мне пришлось добавить скрипт в OD во время развертывания. В разделе предварительного развертывания он копирует файл «myappSetupTool.exe.config.deploy» и удаляет расширение «.deploy», чтобы OD видел его как конфигурацию и автоматически заменял настройку приложения.

В разделе после развертывания я копирую файл обратно, чтобы иметь расширение «.deploy».

Я сообщаю, что это изменяет хэш файлов, и поэтому это не сработает, поэтому я подумал, что мне нужно заново сгенерировать файлы .application и .manifest, чтобы компенсировать это.

Вопрос 1:

Нужно ли регенерировать эти файлы, пока файлы имеют расширение .deploy или без него?

вопрос 2:

Если мне нужно удалить расширение «.deploy», нужно ли вернуть файлы в исходное состояние? т.е. переименовать их обратно в "*.deploy"?

вопрос 3:

каковы будут шаги для достижения этого? Я разместил свой сценарий powershell ниже.

$mage = "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\mage.exe"
$path = $OctopusParameters["Octopus.Action[deploy click once app].Output.deploymentPath"]

Set-Location -Path $path 

write-host "mage: " $mage

$appNameShort = "myappSetupTool"
$appName = "$appNameShort.application"

$folderName = $OctopusParameters["Octopus.Action[setup version number].Output.clickOnceVersion"]
$version = $folderName.Replace("_", ".")
$folderSegment = "Application Files\$appNameShort" + "_$folderName"

$deploymentApplicaitonPath = "$path\$folderSegment\$appNameShort.application"
$deploymentManifestRelativePath = "$folderSegment\$appNameShort.exe.manifest"
$deploymentManifestPath = "$path\$deploymentManifestRelativePath"

$appApplicationPath = "$path\$appName"
$certFilePath = "$path\$certFileName"

$setupPath = "$path\setup.exe"

$url  = "$publishUrl/$appName"

write-host "deployment application path: " $deploymentApplicaitonPath
write-host "deployment manifest path: " $deploymentManifestPath

write-host "application file path: " $appApplicationPath
write-host "cert file path: " $certFilePath
write-host "setup.exe path: " $setupPath

write-host "publish url: " $url

write-host "renaming all .deploy files to remove deploy extension"
#Need to resign the application manifest, but before we do we need to rename all the files back to their original names (remove .deploy)
Get-ChildItem "$path\$folderSegment\*.deploy" -Recurse | Rename-Item -NewName { $_.Name -replace '\.deploy','' }

write-host "deleting old app files manifest file to be regenerated"
Remove-Item $deploymentManifestRelativePath 

Write-Host "Creating application manifest at "$deploymentManifestRelativePath
write-host "running: $mage -New Application -t $deploymentManifestPath -n $appName -v $version -p msil -fd $path\$folderSegment -tr FullTrust -a sha256RSA"
& "$mage" -New Application -t "$deploymentManifestPath" -n "$appName" -v $version -p msil -fd "$path\$folderSegment" -tr FullTrust -a sha256RSA

write-host "Running: $mage -Sign $deploymentManifestPath -CertFile $certFilePath -Password $certPassword"
& "$mage" -Sign "$deploymentManifestPath" -CertFile "$certFilePath" -Password $certPassword


Write-Host "Creating application: $mage -New Deployment -t $appApplicationPath -n $appName -v $version -p msil -appm $deploymentManifestRelativePath -ip true -i true -um true  -pu $appApplicationPath -appc $deploymentManifestRelativePath -a sha256RSA " 
& "$mage" -New Deployment -t "$appApplicationPath" -n "$appName" -v $version -p msil -appm "$deploymentManifestPath" -ip true -i true -um true  -pu "$appApplicationPath" -appc "$deploymentManifestRelativePath" -a sha256RSA 


write-host "Running: $mage -Update $deploymentApplicaitonPath -ProviderUrl $url"
& "$mage" -Update "$deploymentApplicaitonPath" -ProviderUrl $url



write-host "Running: $mage -Update $appApplicationPath -ProviderUrl $url"
& "$mage" -Update "$appApplicationPath" -ProviderUrl $url

write-host "Running: $mage -Update $appApplicationPath -AppManifest $deploymentManifestRelativePath"
& "$mage" -Update "$appApplicationPath" -AppManifest "$deploymentManifestRelativePath"

write-host "Running: $mage -Sign $appApplicationPath -CertFile $certFilePath  -Password $certPassword"
& "$mage" -Sign "$appApplicationPath" -CertFile "$certFilePath" -Password $certPassword

write-host "Running: $setupPath -url=$publishUrl/"
& "$setupPath" "-url=$publishUrl/"

write-host "update files to have deploy extension again"
#Rename files back to the .deploy extension, skipping the files that shouldn't be renamed
Get-ChildItem -Path "Application Files\*"  -Recurse | Where-Object {!$_.PSIsContainer -and $_.Name -notlike "*.manifest" -and $_.Name -notlike "*.application" -and $_.Name -notlike "*.gif" -and $_.Name -notlike "*.png"} | Rename-Item -NewName {$_.Name + ".deploy"}

person Jon    schedule 14.12.2016    source источник


Ответы (1)


Итак, я понял это ... не уверен, что не так с исходным сценарием, но решил вернуться к основам и разбить его на разделы, сценарий ниже:

$mage = "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\mage.exe"
$path = $OctopusParameters["Octopus.Action[deploy click once app].Output.deploymentPath"]

Set-Location -Path $path 

write-host "mage: " $mage

$appNameShort = "myappSetupTool"
$appName = "$appNameShort.application"

$folderName = $OctopusParameters["Octopus.Action[setup version number].Output.clickOnceVersion"]
$version = $folderName.Replace("_", ".")
$folderSegment = "Application Files\$appNameShort" + "_$folderName"

$deploymentApplicaitonPath = "$path\$folderSegment\$appNameShort.application"
$deploymentManifestRelativePath = "$folderSegment\$appNameShort.exe.manifest"
$deploymentManifestPath = "$path\$deploymentManifestRelativePath"

$appApplicationPath = "$path\$appName"
$certFilePath = "$path\$certFileName"

$setupPath = "$path\setup.exe"

$url  = "$publishUrl/$appName"

write-host "deployment application path: " $deploymentApplicaitonPath
write-host "deployment manifest path: " $deploymentManifestPath

write-host "application file path: " $appApplicationPath
write-host "cert file path: " $certFilePath
write-host "setup.exe path: " $setupPath

write-host "publish url: " $url






##
## order of process
##
## 1) remove all .deploy extensions
## 2) set properties on the applicaiton manifest file
## 3) update applicaiton manifest file directly
##
## 4) set properties on .application file
## 5) update .application file directly
##
## 6) sign application manifest
## 7) sign .application file
## 8) update setup.exe
##
## 9) put .deploy back on files
##

##### 1

write-host "renaming all .deploy files to remove deploy extension"
#Need to resign the application manifest, but before we do we need to rename all the files back to their original names (remove .deploy)
Get-ChildItem "$path\$folderSegment\*.deploy" -Recurse | Rename-Item -NewName { $_.Name -replace '\.deploy','' }


##### 2




##### 3

& "$mage" -Update "$deploymentManifestPath" -CertFile "$certFilePath" -Password $certPassword


##### 4

write-host "Running: $mage -Update $appApplicationPath -ProviderUrl $url"
& "$mage" -Update "$appApplicationPath" -ProviderUrl $url

write-host "Running: $mage -Update $deploymentApplicaitonPath -ProviderUrl $url"
& "$mage" -Update "$deploymentApplicaitonPath" -ProviderUrl $url


##### 5

write-host "Running: $mage -Update $appApplicationPath -AppManifest $deploymentManifestRelativePath"
& "$mage" -Update "$appApplicationPath" -AppManifest "$deploymentManifestRelativePath"


##### 6

write-host "Running: $mage -Sign $deploymentManifestPath -CertFile $certFilePath -Password $certPassword"
& "$mage" -Sign "$deploymentManifestPath" -CertFile "$certFilePath" -Password $certPassword



##### 7

write-host "Running: $mage -Sign $appApplicationPath -CertFile $certFilePath  -Password $certPassword"
& "$mage" -Sign "$appApplicationPath" -CertFile "$certFilePath" -Password $certPassword



##### 8

write-host "Running: $setupPath -url=$publishUrl/"
& "$setupPath" "-url=$publishUrl/"



##### 9

write-host "update files to have deploy extension again"
#Rename files back to the .deploy extension, skipping the files that shouldn't be renamed
Get-ChildItem -Path "$folderSegment\*"  -Recurse | Where-Object {!$_.PSIsContainer -and $_.Name -notlike "*.manifest" -and $_.Name -notlike "*.application"} | Rename-Item -NewName {$_.Name + ".deploy"}
person Jon    schedule 15.12.2016