diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml new file mode 100644 index 00000000000..a8e5e563425 --- /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 dd1b168d91c..b9ea0add9b9 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) + + 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)" + } -# Channel is like: $Channel = "5.0.1xx-preview2" -$Channel = $dotnetMetadataJson.sdk.channel + return @{ + ShouldUpdate = $shouldUpdate + NewVersion = $newVersion + Message = $Message + } +} -Import-Module "$PSScriptRoot/../build.psm1" -Force +$dotnetUpdate = Get-DotnetUpdate -Find-Dotnet +if ($dotnetUpdate.ShouldUpdate) { -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 -} + $dotnetMetadataPath = "$PSScriptRoot/../DotnetRuntimeMetadata.json" + $dotnetMetadataJson = Get-Content $dotnetMetadataPath -Raw | ConvertFrom-Json -## Install latest version from the channel + # Channel is like: $Channel = "5.0.1xx-preview2" + $Channel = $dotnetMetadataJson.sdk.channel -$sdkVersion = if ($SDKVersionOverride) { $SDKVersionOverride } else { "latest" } + Import-Module "$PSScriptRoot/../build.psm1" -Force -Install-Dotnet -Channel "$Channel" -Version $sdkVersion + Find-Dotnet -Write-Verbose -Message "Installing .NET SDK completed." -Verbose + 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 + } -$isWindowsEnv = [System.Environment]::OSVersion.Platform -eq [System.PlatformID]::Win32NT + ## Install latest version from the channel -$dotnetPath = if ($IsWindowsEnv) { "$env:LocalAppData\Microsoft\dotnet" } else { "$env:HOME/.dotnet" } + $sdkVersion = if ($SDKVersionOverride) { $SDKVersionOverride } else { $dotnetUpdate.NewVersion } -$pathSep = [System.IO.Path]::PathSeparator + Install-Dotnet -Channel "$Channel" -Version $sdkVersion -if (-not (($ENV:PATH -split $pathSep) -contains "$dotnetPath")) { - $env:PATH = "$dotnetPath" + $pathSep + "$ENV:PATH" -} + Write-Verbose -Message "Installing .NET SDK completed." -Verbose + + $environment = Get-EnvironmentInformation -$latestSdkVersion = (dotnet --list-sdks | Select-Object -Last 1 ).Split() | Select-Object -First 1 + $dotnetPath = if ($environment.IsWindows) { "$env:LocalAppData\Microsoft\dotnet" } else { "$env:HOME/.dotnet" } -Write-Verbose -Message "Installing .NET SDK completed, version - $latestSdkVersion" -Verbose + $pathSep = [System.IO.Path]::PathSeparator -Update-GlobalJson -Version $latestSdkVersion + 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 -Write-Verbose -Message "Updating global.json completed." -Verbose + Update-GlobalJson -Version $latestSdkVersion -Update-PackageVersion + Write-Verbose -Message "Updating global.json completed." -Verbose -Write-Verbose -Message "Updating project files 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 $_ + } + } + } +} diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index 507d8fe902b..1673abf4095 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"