Я пытаюсь опубликовать щелчок один раз со следующим процессом:
- 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"}