From 0e435a51432121f6c71fde081e2d18e0038b0e8a Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Thu, 21 May 2020 18:47:54 -0700 Subject: [PATCH] Add GitHub action for PR creation and `Wix` file generation logic (#12748) --- .github/workflows/daily.yml | 54 ++++++++++++++ tools/UpdateDotnetRuntime.ps1 | 132 +++++++++++++++++++++++---------- tools/packaging/packaging.psm1 | 1 + 3 files changed, 149 insertions(+), 38 deletions(-) create mode 100644 .github/workflows/daily.yml diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 0000000000..a8e5e56342 --- /dev/null +++ b/.github/workflows/daily.yml @@ -0,0 +1,54 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT license. + +name: PowerShell Daily +on: + schedule: + # At 13:00 UTC every day. + - cron: '0 13 * * *' + +defaults: + run: + shell: pwsh + +env: + DOTNET_CLI_TELEMETRY_OPTOUT: 1 + POWERSHELL_TELEMETRY_OPTOUT: 1 + +jobs: + update-dotnet-preview: + name: Update .NET preview + timeout-minutes: 15 + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Sync tags + run: | + git fetch --prune --unshallow --tags + - name: Execute Update .NET script + run: | + $currentVersion = (Get-Content .\global.json | ConvertFrom-Json).sdk.version + Write-Verbose "name=OLD_VERSION::$currentVersion" -Verbose + Write-Host "::set-env name=OLD_VERSION::$currentVersion" + + ./tools/UpdateDotnetRuntime.ps1 -UpdateMSIPackaging + $newVersion = (Get-Content .\global.json | ConvertFrom-Json).sdk.version + Write-Verbose "name=NEW_VERSION::$newVersion" -Verbose + Write-Host "::set-env name=NEW_VERSION::$newVersion" + + if ($currentVersion -ne $newVersion) { + Write-Verbose "name=CREATE_PR::true" -Verbose + Write-Host "::set-env name=CREATE_PR::true" + } + - name: Create Pull Request + uses: peter-evans/create-pull-request@v2 + id: cpr + if: env.CREATE_PR == 'true' + with: + commit-message: "Update .NET SDK version from `${{ env.OLD_VERSION }}` to `${{ env.NEW_VERSION }}`" + title: "Update .NET SDK version from `${{ env.OLD_VERSION }}` to `${{ env.NEW_VERSION }}`" + base: master + branch: dotnet_update + + diff --git a/tools/UpdateDotnetRuntime.ps1 b/tools/UpdateDotnetRuntime.ps1 index dd1b168d91..b9ea0add9b 100644 --- a/tools/UpdateDotnetRuntime.ps1 +++ b/tools/UpdateDotnetRuntime.ps1 @@ -4,7 +4,10 @@ [CmdletBinding()] param ( [Parameter()] - [string]$SDKVersionOverride + [string]$SDKVersionOverride, + + [Parameter()] + [switch]$UpdateMSIPackaging ) <# @@ -61,7 +64,7 @@ function Update-PackageVersion { "$PSScriptRoot/../test/tools/" ) - Get-ChildItem -Path $paths -Recurse -Filter "*.csproj" -Exclude 'PSGalleryModules.csproj','PSGalleryTestModules.csproj' | ForEach-Object { + Get-ChildItem -Path $paths -Recurse -Filter "*.csproj" -Exclude 'PSGalleryModules.csproj', 'PSGalleryTestModules.csproj' | ForEach-Object { Write-Verbose -Message "Reading - $($_.FullName)" -Verbose $prj = [xml] (Get-Content $_.FullName -Raw) $pkgRef = $prj.Project.ItemGroup.PackageReference @@ -70,8 +73,7 @@ function Update-PackageVersion { if ($null -ne $p -and -not $skipModules.Contains($p.Include)) { if (-not $packages.ContainsKey($p.Include)) { $packages.Add($p.Include, @([PkgVer]::new($p.Include, $p.Version, $null, $_.FullName))) - } - else { + } else { $packages[$p.Include] += [PkgVer]::new($p.Include, $p.Version, $null, $_.FullName) } } @@ -127,49 +129,103 @@ function Update-CsprojFile([string] $path, $values) { } } -$dotnetMetadataPath = "$PSScriptRoot/../DotnetRuntimeMetadata.json" -$dotnetMetadataJson = Get-Content $dotnetMetadataPath -Raw | ConvertFrom-Json +function Get-DotnetUpdate { + try { + $dotnetMetadataPath = "$PSScriptRoot/../DotnetRuntimeMetadata.json" + $nextChannel = (Get-Content $dotnetMetadataPath -Raw | ConvertFrom-Json).sdk.nextChannel + $latestSDKversion = [System.Management.Automation.SemanticVersion] (Invoke-RestMethod -Uri "http://aka.ms/dotnet/$nextChannel/Sdk/productVersion.txt" -ErrorAction Stop | ForEach-Object { $_.Trim() }) + $currentVersion = [System.Management.Automation.SemanticVersion] (( Get-Content -Path "$PSScriptRoot/../global.json" -Raw | ConvertFrom-Json).sdk.version) -# Channel is like: $Channel = "5.0.1xx-preview2" -$Channel = $dotnetMetadataJson.sdk.channel + if ($latestSDKversion -gt $currentVersion) { + $shouldUpdate = $true + $newVersion = $latestSDKversion + } else { + $shouldUpdate = $false + $newVersion = $null + } + } catch { + Write-Verbose -Verbose "Error occured: $_.message" + $shouldUpdate = $false + $newVersion = $null + Write-Error "Error while checking .NET SDK update: $($_.message)" + } -Import-Module "$PSScriptRoot/../build.psm1" -Force - -Find-Dotnet - -if(-not (Get-PackageSource -Name 'dotnet5' -ErrorAction SilentlyContinue)) -{ - $nugetFeed = ([xml](Get-Content .\nuget.config -Raw)).Configuration.packagesources.add | Where-Object { $_.Key -eq 'dotnet5' } | Select-Object -ExpandProperty Value - Register-PackageSource -Name 'dotnet5' -Location $nugetFeed -ProviderName NuGet - Write-Verbose -Message "Register new package source 'dotnet5'" -Verbose + return @{ + ShouldUpdate = $shouldUpdate + NewVersion = $newVersion + Message = $Message + } } -## Install latest version from the channel +$dotnetUpdate = Get-DotnetUpdate -$sdkVersion = if ($SDKVersionOverride) { $SDKVersionOverride } else { "latest" } +if ($dotnetUpdate.ShouldUpdate) { -Install-Dotnet -Channel "$Channel" -Version $sdkVersion + $dotnetMetadataPath = "$PSScriptRoot/../DotnetRuntimeMetadata.json" + $dotnetMetadataJson = Get-Content $dotnetMetadataPath -Raw | ConvertFrom-Json -Write-Verbose -Message "Installing .NET SDK completed." -Verbose + # Channel is like: $Channel = "5.0.1xx-preview2" + $Channel = $dotnetMetadataJson.sdk.channel -$isWindowsEnv = [System.Environment]::OSVersion.Platform -eq [System.PlatformID]::Win32NT + Import-Module "$PSScriptRoot/../build.psm1" -Force -$dotnetPath = if ($IsWindowsEnv) { "$env:LocalAppData\Microsoft\dotnet" } else { "$env:HOME/.dotnet" } + Find-Dotnet -$pathSep = [System.IO.Path]::PathSeparator + if (-not (Get-PackageSource -Name 'dotnet5' -ErrorAction SilentlyContinue)) { + $nugetFeed = ([xml](Get-Content .\nuget.config -Raw)).Configuration.packagesources.add | Where-Object { $_.Key -eq 'dotnet5' } | Select-Object -ExpandProperty Value + Register-PackageSource -Name 'dotnet5' -Location $nugetFeed -ProviderName NuGet + Write-Verbose -Message "Register new package source 'dotnet5'" -verbose + } -if (-not (($ENV:PATH -split $pathSep) -contains "$dotnetPath")) { - $env:PATH = "$dotnetPath" + $pathSep + "$ENV:PATH" + ## Install latest version from the channel + + $sdkVersion = if ($SDKVersionOverride) { $SDKVersionOverride } else { $dotnetUpdate.NewVersion } + + Install-Dotnet -Channel "$Channel" -Version $sdkVersion + + Write-Verbose -Message "Installing .NET SDK completed." -Verbose + + $environment = Get-EnvironmentInformation + + $dotnetPath = if ($environment.IsWindows) { "$env:LocalAppData\Microsoft\dotnet" } else { "$env:HOME/.dotnet" } + + $pathSep = [System.IO.Path]::PathSeparator + + if (-not (($ENV:PATH -split $pathSep) -contains "$dotnetPath")) { + $env:PATH = "$dotnetPath" + $pathSep + "$ENV:PATH" + } + + $latestSdkVersion = (dotnet --list-sdks | Select-Object -Last 1 ).Split() | Select-Object -First 1 + + Write-Verbose -Message "Installing .NET SDK completed, version - $latestSdkVersion" -Verbose + + Update-GlobalJson -Version $latestSdkVersion + + Write-Verbose -Message "Updating global.json completed." -Verbose + + Update-PackageVersion + + Write-Verbose -Message "Updating project files completed." -Verbose + + if ($UpdateMSIPackaging) { + if (-not $environment.IsWindows) { + throw "UpdateMSIPackaging can only be done on Windows" + } + + Import-Module "$PSScriptRoot/../build.psm1" -Force + Import-Module "$PSScriptRoot/packaging" -Force + Start-PSBootstrap -Package + Start-PSBuild -Clean -Configuration Release -CrossGen + + try { + Start-PSPackage -Type msi -SkipReleaseChecks -InformationVariable wxsData + } catch { + if ($_.Exception.Message -like "Current files to not match *") { + Copy-Item -Path $($wxsData.MessageData.NewFile) -Destination ($wxsData.MessageData.FilesWxsPath) + Write-Verbose -Message "Updating files.wxs file completed." -Verbose + } else { + throw $_ + } + } + } } - -$latestSdkVersion = (dotnet --list-sdks | Select-Object -Last 1 ).Split() | Select-Object -First 1 - -Write-Verbose -Message "Installing .NET SDK completed, version - $latestSdkVersion" -Verbose - -Update-GlobalJson -Version $latestSdkVersion - -Write-Verbose -Message "Updating global.json completed." -Verbose - -Update-PackageVersion - -Write-Verbose -Message "Updating project files completed." -Verbose diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 507d8fe902..1673abf409 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -3383,6 +3383,7 @@ function Test-FileWxs $newXml | Out-File -FilePath $newXmlFileName -Encoding ascii Write-Log -message "Updated xml saved to $newXmlFileName." Write-Log -message "If component files were intentionally changed, such as due to moving to a newer .NET Core runtime, update '$FilesWxsPath' with the content from '$newXmlFileName'." + Write-Information -MessageData @{FilesWxsPath = $FilesWxsPath; NewFile = $newXmlFileName} -Tags 'PackagingWxs' if ($env:TF_BUILD) { Write-Host "##vso[artifact.upload containerfolder=wix;artifactname=wix]$newXmlFileName"