diff --git a/Tools/create_upg_chk_files.ps1 b/Tools/create_upg_chk_files.ps1 index 8be9e0e71..6cfbcb754 100644 --- a/Tools/create_upg_chk_files.ps1 +++ b/Tools/create_upg_chk_files.ps1 @@ -1,5 +1,17 @@ #Requires -Version 4.0 param ( + [string] + [Parameter(Mandatory=$true)] + $WebsiteTargetOwner, + + [string] + [Parameter(Mandatory=$true)] + $WebsiteTargetRepository, + + [string] + [Parameter(Mandatory=$false)] + $PreTagName = "", + [string] [Parameter(Mandatory=$true)] $TagName, @@ -23,7 +35,7 @@ function New-MsiUpdateFileContent { $version = $MsiFile.BaseName -replace "[a-zA-Z-]*" $certThumbprint = (Get-AuthenticodeSignature -FilePath $MsiFile).SignerCertificate.Thumbprint - $hash = Get-FileHash -Algorithm SHA512 $MsiFile | % { $_.Hash } + $hash = Get-FileHash -Algorithm SHA512 $MsiFile | ForEach-Object { $_.Hash } $fileContents = ` "Version: $version @@ -47,7 +59,7 @@ function New-ZipUpdateFileContent { ) $version = $ZipFile.BaseName -replace "[a-zA-Z-]*" - $hash = Get-FileHash -Algorithm SHA512 $ZipFile | % { $_.Hash } + $hash = Get-FileHash -Algorithm SHA512 $ZipFile | ForEach-Object { $_.Hash } $fileContents = ` "Version: $version @@ -85,18 +97,23 @@ function Resolve-UpdateCheckFileName { Write-Output $fileName } + Write-Output "Begin create_upg_chk_files.ps1" + # determine update channel if ($env:APPVEYOR_PROJECT_NAME -match "(Nightly)") { write-host "UpdateChannel = Nightly" $UpdateChannel = "Nightly" + $ModifiedTagName = "$PreTagName-$TagName-NB" } elseif ($env:APPVEYOR_PROJECT_NAME -match "(Preview)") { - write-host "UpdateChannel = Nightly" + write-host "UpdateChannel = Preview" $UpdateChannel = "Preview" + $ModifiedTagName = "v$TagName-PB" } elseif ($env:APPVEYOR_PROJECT_NAME -match "(Stable)") { - write-host "UpdateChannel = Nightly" + write-host "UpdateChannel = Stable" $UpdateChannel = "Stable" + $ModifiedTagName = "v" + $TagName.Split("-")[0] } else { $UpdateChannel = "" } @@ -107,25 +124,38 @@ if ($UpdateChannel -ne "" -and $buildFolder -ne "") { $releaseFolder = Join-Path -Path $PSScriptRoot -ChildPath "..\Release" -Resolve $msiFile = Get-ChildItem -Path "$buildFolder\*.msi" | Sort-Object LastWriteTime | Select-Object -last 1 if (![string]::IsNullOrEmpty($msiFile)) { - $msiUpdateContents = New-MsiUpdateFileContent -MsiFile $msiFile -TagName $TagName + $msiUpdateContents = New-MsiUpdateFileContent -MsiFile $msiFile -TagName $ModifiedTagName $msiUpdateFileName = Resolve-UpdateCheckFileName -UpdateChannel $UpdateChannel -Type Normal Write-Output "`n`nMSI Update Check File Contents ($msiUpdateFileName)`n------------------------------" Tee-Object -InputObject $msiUpdateContents -FilePath "$releaseFolder\$msiUpdateFileName" write-host "msiUpdateFileName $releaseFolder\$msiUpdateFileName" + # commit msi update txt file + if ((Test-Path -Path "$releaseFolder\$msiUpdateFileName") -and (-not [string]::IsNullOrEmpty($WebsiteTargetRepository))) { + Write-Output "Publish $msiUpdateFileName to $WebsiteTargetRepository" + $update_file_content_string = Get-Content "$releaseFolder\$msiUpdateFileName" | Out-String + Set-GitHubContent -OwnerName $WebsiteTargetOwner -RepositoryName $WebsiteTargetRepository -Path $msiUpdateFileName -CommitMessage "Updating $msiUpdateFileName" -Content $update_file_content_string -BranchName main + } } # build zip update file $releaseFolder = Join-Path -Path $PSScriptRoot -ChildPath "..\Release" -Resolve $zipFile = Get-ChildItem -Path "$releaseFolder\*.zip" -Exclude "*-symbols-*.zip" | Sort-Object LastWriteTime | Select-Object -last 1 if (![string]::IsNullOrEmpty($zipFile)) { - $zipUpdateContents = New-ZipUpdateFileContent -ZipFile $zipFile -TagName $TagName + $zipUpdateContents = New-ZipUpdateFileContent -ZipFile $zipFile -TagName $ModifiedTagName $zipUpdateFileName = Resolve-UpdateCheckFileName -UpdateChannel $UpdateChannel -Type Portable Write-Output "`n`nZip Update Check File Contents ($zipUpdateFileName)`n------------------------------" Tee-Object -InputObject $zipUpdateContents -FilePath "$releaseFolder\$zipUpdateFileName" write-host "zipUpdateFileName $releaseFolder\$zipUpdateFileName" + # commit zip update txt file + if ((Test-Path -Path "$releaseFolder\$zipUpdateFileName") -and (-not [string]::IsNullOrEmpty($WebsiteTargetRepository))) { + Write-Output "Publish $zipUpdateFileName to $WebsiteTargetRepository" + $update_file_content_string = Get-Content "$releaseFolder\$zipUpdateFileName" | Out-String + Set-GitHubContent -OwnerName $WebsiteTargetOwner -RepositoryName $WebsiteTargetRepository -Path $zipUpdateFileName -CommitMessage "Updating $zipUpdateFileName" -Content $update_file_content_string -BranchName main + } } } else { write-host "BuildFolder not found" } + Write-Output "End create_upg_chk_files.ps1" diff --git a/Tools/github_functions.ps1 b/Tools/github_functions.ps1 index f4b3881a3..aa1b07f52 100644 --- a/Tools/github_functions.ps1 +++ b/Tools/github_functions.ps1 @@ -2,6 +2,22 @@ $githubUrl = 'https://api.github.com' # GitHub doesn't support the default powershell protocol (TLS 1.0) [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + +Install-Module -Name PowerShellForGitHub +Set-GitHubConfiguration -DisableTelemetry +$PSDefaultParameterValues["*-GitHub*:AccessToken"] = "$env:ACCESS_TOKEN" +#$CURRENT_GITHUB_USER = $(Get-GitHubUser -Current).UserName +$CURRENT_GITHUB_USER = $env:APPVEYOR_REPO_NAME.Split("/")[0] + + +Function ConvertFrom-Base64($base64) { + return [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($base64)) +} + +Function ConvertTo-Base64($plain) { + return [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($plain)) +} + function Publish-GitHubRelease { param ( [string] diff --git a/Tools/postbuild_installer.ps1 b/Tools/postbuild_installer.ps1 index fc01cdd90..7c5856bab 100644 --- a/Tools/postbuild_installer.ps1 +++ b/Tools/postbuild_installer.ps1 @@ -25,6 +25,8 @@ param ( $ExcludeFromSigning ) +. "$PSScriptRoot\github_functions.ps1" + Write-Output "+===========================================================================================+" Write-Output "| Beginning mRemoteNG Installer Post Build |" Write-Output "+===========================================================================================+" @@ -39,7 +41,13 @@ Format-Table -AutoSize -Wrap -InputObject @{ & "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir -& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir -& "$PSScriptRoot\rename_and_copy_installer.ps1" -SolutionDir $SolutionDir -BuildConfiguration $ConfigurationName.Trim() -& "$PSScriptRoot\create_upg_chk_files.ps1" -TagName $env:APPVEYOR_BUILD_VERSION -ProjectName $env:APPVEYOR_PROJECT_NAME +& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir + +& "$PSScriptRoot\rename_and_copy_installer.ps1" -SolutionDir $SolutionDir -BuildConfiguration $ConfigurationName.Trim() + +& "$PSScriptRoot\create_upg_chk_files.ps1" -WebsiteTargetOwner $CURRENT_GITHUB_USER -WebsiteTargetRepository $env:WEBSITE_TARGET_REPOSITORY -PreTagName $env:NightlyBuildTagName -TagName $env:APPVEYOR_BUILD_VERSION -ProjectName $env:APPVEYOR_PROJECT_NAME + +#& "$PSScriptRoot\update_and_upload_website_release_json_file.ps1" -WebsiteTargetOwner $CURRENT_GITHUB_USER -WebsiteTargetRepository $env:WEBSITE_TARGET_REPOSITORY -PreTagName $env:NightlyBuildTagName -TagName $env:APPVEYOR_BUILD_VERSION -ProjectName $env:APPVEYOR_PROJECT_NAME + +Write-Output "End mRemoteNG Installer Post Build" diff --git a/Tools/postbuild_mremoteng.ps1 b/Tools/postbuild_mremoteng.ps1 index 697b909a9..d1de47e0b 100644 --- a/Tools/postbuild_mremoteng.ps1 +++ b/Tools/postbuild_mremoteng.ps1 @@ -25,6 +25,8 @@ param ( $ExcludeFromSigning ) +. "$PSScriptRoot\github_functions.ps1" + Write-Output "+===========================================================================================+" Write-Output "| Beginning mRemoteNG Post Build |" Write-Output "+===========================================================================================+" @@ -54,10 +56,19 @@ Format-Table -AutoSize -Wrap -InputObject @{ ### & "$PSScriptRoot\set_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName -& "$PSScriptRoot\verify_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName -& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir -& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir -& "$PSScriptRoot\zip_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName -& "$PSScriptRoot\create_upg_chk_files.ps1" -TagName $env:APPVEYOR_BUILD_VERSION -ProjectName $env:APPVEYOR_PROJECT_NAME +& "$PSScriptRoot\verify_LargeAddressAware.ps1" -TargetDir $TargetDir -TargetFileName $TargetFileName + +& "$PSScriptRoot\tidy_files_for_release.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName + +& "$PSScriptRoot\sign_binaries.ps1" -TargetDir $TargetDir -CertificatePath $CertificatePath -CertificatePassword $CertificatePassword -ConfigurationName $ConfigurationName -Exclude $ExcludeFromSigning -SolutionDir $SolutionDir + +& "$PSScriptRoot\verify_binary_signatures.ps1" -TargetDir $TargetDir -ConfigurationName $ConfigurationName -CertificatePath $CertificatePath -SolutionDir $SolutionDir + +& "$PSScriptRoot\zip_files.ps1" -SolutionDir $SolutionDir -TargetDir $TargetDir -ConfigurationName $ConfigurationName + +& "$PSScriptRoot\create_upg_chk_files.ps1" -WebsiteTargetOwner $CURRENT_GITHUB_USER -WebsiteTargetRepository $env:WEBSITE_TARGET_REPOSITORY -PreTagName $env:NightlyBuildTagName -TagName $env:APPVEYOR_BUILD_VERSION -ProjectName $env:APPVEYOR_PROJECT_NAME + +#& "$PSScriptRoot\update_and_upload_website_release_json_file.ps1" -WebsiteTargetOwner $CURRENT_GITHUB_USER -WebsiteTargetRepository $env:WEBSITE_TARGET_REPOSITORY -PreTagName $env:NightlyBuildTagName -TagName $env:APPVEYOR_BUILD_VERSION -ProjectName $env:APPVEYOR_PROJECT_NAME + +Write-Output "End mRemoteNG Post Build" diff --git a/Tools/update_and_upload_website_release_json_file.ps1 b/Tools/update_and_upload_website_release_json_file.ps1 new file mode 100644 index 000000000..3efb1a22a --- /dev/null +++ b/Tools/update_and_upload_website_release_json_file.ps1 @@ -0,0 +1,166 @@ +#Requires -Version 4.0 +param ( + [string] + [Parameter(Mandatory=$true)] + $WebsiteTargetOwner, + + [string] + [Parameter(Mandatory=$true)] + $WebsiteTargetRepository, + + [string] + [Parameter(Mandatory=$false)] + $PreTagName = "", + + [string] + [Parameter(Mandatory=$true)] + $TagName, + + [string] + [Parameter(Mandatory=$true)] + $ProjectName +) + + +Write-Output "Begin create_website_release_json_file.ps1" + + +# determine update channel +if ($env:APPVEYOR_PROJECT_NAME -match "(Nightly)") { + write-host "UpdateChannel = Nightly" + $UpdateChannel = "Nightly" +} elseif ($env:APPVEYOR_PROJECT_NAME -match "(Preview)") { + write-host "UpdateChannel = Preview" + $UpdateChannel = "Preview" +} elseif ($env:APPVEYOR_PROJECT_NAME -match "(Stable)") { + write-host "UpdateChannel = Stable" + $UpdateChannel = "Stable" +} else { + $UpdateChannel = "" +} + +$buildFolder = Join-Path -Path $PSScriptRoot -ChildPath "..\mRemoteNG\bin\x64\Release" -Resolve -ErrorAction Ignore + +if ($UpdateChannel -ne "" -and $buildFolder -ne "") { + + $releaseFolder = Join-Path -Path $PSScriptRoot -ChildPath "..\Release" -Resolve + $published_at = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ") + + #$websiteJsonReleaseFile = Join-Path -Path $PSScriptRoot -ChildPath "..\..\mRemoteNG.github.io\_data\releases.json" -Resolve + + # get releases.json from github + $releases_json = Get-GitHubContent -OwnerName $WebsiteTargetOwner -RepositoryName $WebsiteTargetRepository -Path _data\releases.json + ConvertFrom-Base64($releases_json.content) | Out-File -FilePath "$releaseFolder\releases.json" + $websiteJsonReleaseFile = Get-ChildItem -Path "$releaseFolder\releases.json" + + # installer + $msiFile = Get-ChildItem -Path "$buildFolder\*.msi" | Sort-Object LastWriteTime | Select-Object -last 1 + if (![string]::IsNullOrEmpty($msiFile)) { + $checksum = (Get-FileHash $msiFile -Algorithm SHA512).Hash + $file_size = (Get-ChildItem $msiFile).Length + $a = Get-Content $websiteJsonReleaseFile | ConvertFrom-Json + switch ($UpdateChannel) { + "Nightly" { + $GithubTag = "$((Get-Date).ToUniversalTime().ToString("yyyyMMdd"))-$TagName-NB" + $html_url = "https://github.com/mRemoteNG/mRemoteNG/releases/tag/$GithubTag" + $browser_download_url = "https://github.com/mRemoteNG/mRemoteNG/releases/download/$GithubTag/$($msiFile.Name)" + $a.nightlybuild.name = "v$TagName" + $a.nightlybuild.published_at = $published_at + $a.nightlybuild.html_url = $html_url + $a.nightlybuild.assets.installer.browser_download_url = $browser_download_url + $a.nightlybuild.assets.installer.checksum = $checksum + $a.nightlybuild.assets.installer.size = $file_size + break + } + "Preview" { + $GithubTag = "$TagName-PB" + $html_url = "https://github.com/mRemoteNG/mRemoteNG/releases/tag/$GithubTag" + $browser_download_url = "https://github.com/mRemoteNG/mRemoteNG/releases/download/$GithubTag/$($msiFile.Name)" + $a.prerelease.name = "v$TagName" + $a.prerelease.published_at = $published_at + $a.prerelease.html_url = $html_url + $a.prerelease.assets.installer.browser_download_url = $browser_download_url + $a.prerelease.assets.installer.checksum = $checksum + $a.prerelease.assets.installer.size = $file_size + break + } + "Stable" { + $GithubTag = "$TagName" + $html_url = "https://github.com/mRemoteNG/mRemoteNG/releases/tag/$GithubTag" + $browser_download_url = "https://github.com/mRemoteNG/mRemoteNG/releases/download/$GithubTag/$($msiFile.Name)" + $a.stable.name = "v$TagName" + $a.stable.published_at = $published_at + $a.stable.html_url = $html_url + $a.stable.assets.installer.browser_download_url = $browser_download_url + $a.stable.assets.installer.checksum = $checksum + $a.stable.assets.installer.size = $file_size + break + } + } + } + + # https://github.com/BlueBlock/mRemoteNG/releases/tag/20230218-1.77.3.405-NB + # https://github.com/mRemoteNG/mRemoteNG/releases/download//mRemoteNG-Installer-1.77.3.405.msi + + + # portable + $zipFile = Get-ChildItem -Path "$releaseFolder\*.zip" -Exclude "*-symbols-*.zip" | Sort-Object LastWriteTime | Select-Object -last 1 + if (![string]::IsNullOrEmpty($zipFile)) { + $checksum = (Get-FileHash $zipFile -Algorithm SHA512).Hash + $file_size = (Get-ChildItem $zipFile).Length + $a = Get-Content $websiteJsonReleaseFile | ConvertFrom-Json + switch ($UpdateChannel) { + "Nightly" { + $GithubTag = "$((Get-Date).ToUniversalTime().ToString("yyyyMMdd"))-$TagName-NB" + $html_url = "https://github.com/mRemoteNG/mRemoteNG/releases/tag/$GithubTag" + $browser_download_url = "https://github.com/mRemoteNG/mRemoteNG/releases/download/$GithubTag/$($zipFile.Name)" + $a.nightlybuild.name = "v$TagName" + $a.nightlybuild.published_at = $published_at + $a.nightlybuild.html_url = $html_url + $a.nightlybuild.assets.portable.browser_download_url = $browser_download_url + $a.nightlybuild.assets.portable.checksum = $checksum + $a.nightlybuild.assets.portable.size = $file_size + break + } + "Preview" { + $GithubTag = "$TagName-PB" + $html_url = "https://github.com/mRemoteNG/mRemoteNG/releases/tag/$GithubTag" + $browser_download_url = "https://github.com/mRemoteNG/mRemoteNG/releases/download/$GithubTag/$($zipFile.Name)" + $a.prerelease.name = "v$TagName" + $a.prerelease.published_at = $published_at + $a.prerelease.html_url = $html_url + $a.prerelease.assets.portable.browser_download_url = $browser_download_url + $a.prerelease.assets.portable.checksum = $checksum + $a.prerelease.assets.portable.size = $file_size + break + } + "Stable" { + $GithubTag = "$TagName" + $html_url = "https://github.com/mRemoteNG/mRemoteNG/releases/tag/$GithubTag" + $browser_download_url = "https://github.com/mRemoteNG/mRemoteNG/releases/download/$GithubTag/$($zipFile.Name)" + $a.stable.name = "v$TagName" + $a.stable.published_at = $published_at + $a.stable.html_url = $html_url + $a.stable.assets.portable.browser_download_url = $browser_download_url + $a.stable.assets.portable.checksum = $checksum + $a.stable.assets.portable.size = $file_size + break + } + } + } + + $a | ConvertTo-Json -Depth 10 | set-content $websiteJsonReleaseFile + + # commit releases.json change + Write-Output "publish releases.json" + if (Test-Path -Path "$releaseFolder\releases.json") { + $releases_json_string = Get-Content "$releaseFolder\releases.json" | Out-String + Set-GitHubContent -OwnerName $WebsiteTargetOwner -RepositoryName $WebsiteTargetRepository -Path _data\releases.json -CommitMessage 'Updating releases.json' -Content $releases_json_string -BranchName main + } + +} else { + write-host "BuildFolder not found" +} + + +Write-Output "End create_website_release_json_file.ps1"