diff --git a/images/linux/post-generation/homebrew-permissions.sh b/images/linux/post-generation/homebrew-permissions.sh index 1dbd043e2..edd15fb79 100644 --- a/images/linux/post-generation/homebrew-permissions.sh +++ b/images/linux/post-generation/homebrew-permissions.sh @@ -2,10 +2,13 @@ # Fix permissions for Homebrew # https://github.com/actions/virtual-environments/issues/1568 + brew_folder="/home/linuxbrew/" +homebrew_user=$(cut -d: -f1 /etc/passwd | tail -1) + if [ -d "$brew_folder" ]; then brew_folder_owner=$(ls -ld $brew_folder | awk '{print $3}') - if [ "$USER" != "$brew_folder_owner" ]; then - chown "$USER":docker -R $brew_folder + if [ "$homebrew_user" != "$brew_folder_owner" ]; then + chown "$homebrew_user":docker -R $brew_folder fi fi diff --git a/images/linux/post-generation/rust-permissions.sh b/images/linux/post-generation/rust-permissions.sh index 6673686bd..aff56ca17 100644 --- a/images/linux/post-generation/rust-permissions.sh +++ b/images/linux/post-generation/rust-permissions.sh @@ -2,10 +2,13 @@ # Fix permissions for the Rust folder # https://github.com/actions/virtual-environments/issues/572 + rust_folder="/usr/share/rust" +rust_user=$(cut -d: -f1 /etc/passwd | tail -1) + if [ -d "$rust_folder" ]; then rust_folder_owner=$(ls -ld $rust_folder | awk '{print $3}') - if [ "$USER" != "$rust_folder_owner" ]; then - chown "$USER":docker -R $rust_folder + if [ "$rust_user" != "$rust_folder_owner" ]; then + chown "$rust_user":docker -R $rust_folder fi fi diff --git a/images/linux/scripts/installers/post-deployment.sh b/images/linux/scripts/installers/post-deployment.sh index 95a2e2fa9..d427a172e 100644 --- a/images/linux/scripts/installers/post-deployment.sh +++ b/images/linux/scripts/installers/post-deployment.sh @@ -24,3 +24,7 @@ then echo "PATH = $PATH" exit 1 fi + +# Clean yarn and npm cache +yarn cache clean +npm cache clean --force \ No newline at end of file diff --git a/images/macos/provision/assets/select-xamarin-sdk.sh b/images/macos/provision/assets/select-xamarin-sdk.sh new file mode 100644 index 000000000..45adc969c --- /dev/null +++ b/images/macos/provision/assets/select-xamarin-sdk.sh @@ -0,0 +1,22 @@ +#!/bin/bash +if [ -z "$1" ]; then + echo "No Xamarin SDK specified." + exit 0 +fi + +XAMARIN_SDK=$1 + +echo "Set Xamarin SDK to ${XAMARIN_SDK}" +FOLDERS_LIST=( + '/Library/Frameworks/Mono.framework/Versions' + '/Library/Frameworks/Xamarin.iOS.framework/Versions' + '/Library/Frameworks/Xamarin.Android.framework/Versions' + '/Library/Frameworks/Xamarin.Mac.framework/Versions' + ) + +for FOLDER in "${FOLDERS_LIST[@]}" +do + echo "Set Current folder for ${FOLDER}" + sudo rm -f ${FOLDER}/Current + sudo ln -s ${FOLDER}/${XAMARIN_SDK} ${FOLDER}/Current +done \ No newline at end of file diff --git a/images/macos/provision/configuration/finalize-vm.sh b/images/macos/provision/configuration/finalize-vm.sh index b69751398..2cbcc2d36 100644 --- a/images/macos/provision/configuration/finalize-vm.sh +++ b/images/macos/provision/configuration/finalize-vm.sh @@ -16,9 +16,18 @@ fi # Put documentation to $HOME root cp $HOME/image-generation/output/software-report/systeminfo.txt $HOME/image-generation/output/software-report/systeminfo.md $HOME/ +# Put build vm assets scripts to proper directory +mkdir -p /usr/local/opt/$USER/scripts +mv $HOME/image-generation/assets/* /usr/local/opt/$USER/scripts + +find /usr/local/opt/$USER/scripts -type f -name "*\.sh" -exec chmod +x {} \; + # Clean up npm cache which collected during image-generation # we have to do that here because `npm install` is run in a few different places during image-generation npm cache clean --force +# Clean yarn cache +yarn cache clean + # Clean up temporary directories rm -rf ~/utils ~/image-generation \ No newline at end of file diff --git a/images/macos/provision/core/chrome.sh b/images/macos/provision/core/chrome.sh index 4a9deba1a..332a11d1b 100644 --- a/images/macos/provision/core/chrome.sh +++ b/images/macos/provision/core/chrome.sh @@ -1,7 +1,8 @@ #!/bin/bash -e -o pipefail +source ~/utils/utils.sh echo "Installing Chrome..." -brew cask install google-chrome +brew_cask_install_ignoring_sha256 "google-chrome" echo "Installing Chrome Driver" brew cask install chromedriver diff --git a/images/macos/provision/core/commonutils.sh b/images/macos/provision/core/commonutils.sh index c7e93496c..a479974cd 100644 --- a/images/macos/provision/core/commonutils.sh +++ b/images/macos/provision/core/commonutils.sh @@ -21,7 +21,6 @@ binst_common_utils=( gh p7zip ant - yamllint aria2 ) diff --git a/images/macos/provision/core/pipx-packages.sh b/images/macos/provision/core/pipx-packages.sh new file mode 100644 index 000000000..658600fad --- /dev/null +++ b/images/macos/provision/core/pipx-packages.sh @@ -0,0 +1,18 @@ +source ~/utils/utils.sh + +export PATH="$PATH:/opt/pipx_bin" + +toolset=$(get_toolset_path) +pipx_packages=$(jq -r ".pipx[] .package" $toolset) + +for package in $pipx_packages; do + python_version=$(jq -r ".pipx[] | select(.package == \"$package\") .python" $toolset) + if [ "$python_version" != "null" ]; then + python_path="$HOME/hostedtoolcache/Python/$python_version*/x64/bin/python$python_version" + echo "Install $package into python $python_path" + pipx install $package --python $python_path + else + echo "Install $package into default python" + pipx install $package + fi +done \ No newline at end of file diff --git a/images/macos/provision/core/python.sh b/images/macos/provision/core/python.sh index b4c641477..629220535 100755 --- a/images/macos/provision/core/python.sh +++ b/images/macos/provision/core/python.sh @@ -17,3 +17,13 @@ echo "Brew Installing Python 2" brew tap-new --no-git local/python2 FORMULA_PATH=$(brew extract python@2 local/python2 | grep "Homebrew/Library/Taps") brew install $FORMULA_PATH + +echo "Installing pipx" +export PIPX_BIN_DIR=/usr/local/opt/pipx_bin +export PIPX_HOME=/usr/local/opt/pipx + +brew install pipx + +echo "export PIPX_BIN_DIR=${PIPX_BIN_DIR}" >> "${HOME}/.bashrc" +echo "export PIPX_HOME=${PIPX_HOME}" >> "${HOME}/.bashrc" +echo 'export PATH="$PIPX_BIN_DIR:$PATH"' >> "${HOME}/.bashrc" diff --git a/images/macos/provision/utils/utils.sh b/images/macos/provision/utils/utils.sh index d2c393177..c43f4efee 100755 --- a/images/macos/provision/utils/utils.sh +++ b/images/macos/provision/utils/utils.sh @@ -107,4 +107,17 @@ get_default_xcode_from_toolset() { verlte() { sortedVersion=$(echo -e "$1\n$2" | sort -V | head -n1) [ "$1" = "$sortedVersion" ] +} + +brew_cask_install_ignoring_sha256() { + local TOOL_NAME=$1 + + CASK_DIR="$(brew --repo homebrew/cask)/Casks" + chmod a+w "$CASK_DIR/$TOOL_NAME.rb" + SHA=$(grep "sha256" "$CASK_DIR/$TOOL_NAME.rb" | awk '{print $2}') + sed -i '' "s/$SHA/:no_check/" "$CASK_DIR/$TOOL_NAME.rb" + brew cask install $TOOL_NAME + pushd $CASK_DIR + git checkout HEAD -- "$TOOL_NAME.rb" + popd } \ No newline at end of file diff --git a/images/macos/software-report/SoftwareReport.Common.psm1 b/images/macos/software-report/SoftwareReport.Common.psm1 index c3fe75171..7616b81b7 100644 --- a/images/macos/software-report/SoftwareReport.Common.psm1 +++ b/images/macos/software-report/SoftwareReport.Common.psm1 @@ -96,6 +96,11 @@ function Get-PipVersion { return "${versionPart1} ${versionPart2} ${versionPart3}" } +function Get-PipxVersion { + $pipxVersion = Run-Command "pipx --version" -SuppressStderr + return "Pipx $pipxVersion" +} + function Get-NVMNodeVersionList { $nvmPath = Join-Path $env:HOME ".nvm" "nvm.sh" $nvmInitCommand = ". ${nvmPath} > /dev/null 2>&1 || true" diff --git a/images/macos/software-report/SoftwareReport.Generator.ps1 b/images/macos/software-report/SoftwareReport.Generator.ps1 index 9bcef14ce..4eab767c4 100644 --- a/images/macos/software-report/SoftwareReport.Generator.ps1 +++ b/images/macos/software-report/SoftwareReport.Generator.ps1 @@ -83,6 +83,7 @@ $npmVersion = Run-Command "npm --version" $yarnVersion = Run-Command "yarn --version" $nugetVersion = Run-Command "nuget help" | Select-Object -First 1 | Take-Part -Part 2 $pip3Version = Get-PipVersion -Version 3 +$pipxVersion = Get-PipxVersion $condaVersion = Invoke-Expression "conda --version" $rubyGemsVersion = Run-Command "gem --version" $composerVersion = Run-Command "composer --version" | Take-Part -Part 2 @@ -99,6 +100,7 @@ if ($os.IsLessThanBigSur) { $markdown += New-MDList -Style Unordered -Lines @( "Pip ${pip3Version}", + $pipxVersion, $bundlerVersion, "Carthage ${carthageVersion}", "CocoaPods ${cocoaPodsVersion}", diff --git a/images/macos/templates/macOS-10.13.json b/images/macos/templates/macOS-10.13.json index 35c7ef3c7..3eda456d7 100644 --- a/images/macos/templates/macOS-10.13.json +++ b/images/macos/templates/macOS-10.13.json @@ -43,6 +43,11 @@ "type": "shell", "inline": "mkdir ~/image-generation" }, + { + "type": "file", + "source": "./provision/assets", + "destination": "~/image-generation/" + }, { "type": "file", "source": "./tests", @@ -181,7 +186,8 @@ "./provision/core/edge.sh", "./provision/core/firefox.sh", "./provision/core/toolcache-high-sierra.sh", - "./provision/core/pypy.sh" + "./provision/core/pypy.sh", + "./provision/core/pipx-packages.sh" ] }, { diff --git a/images/macos/templates/macOS-10.14.json b/images/macos/templates/macOS-10.14.json index 2687302e0..06e4dc7bd 100644 --- a/images/macos/templates/macOS-10.14.json +++ b/images/macos/templates/macOS-10.14.json @@ -43,6 +43,11 @@ "type": "shell", "inline": "mkdir ~/image-generation" }, + { + "type": "file", + "source": "./provision/assets", + "destination": "~/image-generation/" + }, { "type": "file", "source": "./tests", @@ -186,7 +191,8 @@ "./provision/core/miniconda.sh", "./provision/core/xcode-postbuild.sh", "./provision/core/toolcache.sh", - "./provision/core/pypy.sh" + "./provision/core/pypy.sh", + "./provision/core/pipx-packages.sh" ], "environment_vars": [ "GITHUB_FEED_TOKEN={{user `github_feed_token`}}" diff --git a/images/macos/templates/macOS-10.15.json b/images/macos/templates/macOS-10.15.json index a65bd72ac..554ad0268 100644 --- a/images/macos/templates/macOS-10.15.json +++ b/images/macos/templates/macOS-10.15.json @@ -43,6 +43,11 @@ "type": "shell", "inline": "mkdir ~/image-generation" }, + { + "type": "file", + "source": "./provision/assets", + "destination": "~/image-generation/" + }, { "type": "file", "source": "./tests", @@ -185,7 +190,8 @@ "./provision/core/firefox.sh", "./provision/core/xcode-postbuild.sh", "./provision/core/toolcache.sh", - "./provision/core/pypy.sh" + "./provision/core/pypy.sh", + "./provision/core/pipx-packages.sh" ], "environment_vars": [ "GITHUB_FEED_TOKEN={{user `github_feed_token`}}" diff --git a/images/macos/templates/macOS-11.0.json b/images/macos/templates/macOS-11.0.json index 27f39bfb0..2a9b691b5 100644 --- a/images/macos/templates/macOS-11.0.json +++ b/images/macos/templates/macOS-11.0.json @@ -43,6 +43,11 @@ "type": "shell", "inline": "mkdir ~/image-generation" }, + { + "type": "file", + "source": "./provision/assets", + "destination": "~/image-generation/" + }, { "type": "file", "source": "./tests", @@ -181,7 +186,8 @@ "./provision/core/chrome.sh", "./provision/core/edge.sh", "./provision/core/firefox.sh", - "./provision/core/toolcache.sh" + "./provision/core/toolcache.sh", + "./provision/core/pipx-packages.sh" ], "environment_vars": [ "GITHUB_FEED_TOKEN={{user `github_feed_token`}}" diff --git a/images/macos/tests/Linters.Tests.ps1 b/images/macos/tests/Linters.Tests.ps1 index 3b7b8e0df..31d3698cc 100644 --- a/images/macos/tests/Linters.Tests.ps1 +++ b/images/macos/tests/Linters.Tests.ps1 @@ -3,10 +3,6 @@ Import-Module "$PSScriptRoot/../helpers/Tests.Helpers.psm1" $os = Get-OSVersion Describe "Linters" { - It "yamllint" { - "yamllint --version" | Should -ReturnZeroExitCode - } - It "SwiftLint" -Skip:($os.IsHighSierra) { "swiftlint version" | Should -ReturnZeroExitCode } diff --git a/images/macos/tests/PipxPackages.Tests.ps1 b/images/macos/tests/PipxPackages.Tests.ps1 new file mode 100644 index 000000000..ed9819388 --- /dev/null +++ b/images/macos/tests/PipxPackages.Tests.ps1 @@ -0,0 +1,7 @@ +Describe "PipxPackages" { + $pipxToolset = Get-ToolsetValue "pipx" + $testCases = $pipxToolset | ForEach-Object { @{package = $_.package; cmd = $_.cmd} } + It "" -TestCases $testCases { + "$cmd" | Should -ReturnZeroExitCode + } +} \ No newline at end of file diff --git a/images/macos/tests/Python.Tests.ps1 b/images/macos/tests/Python.Tests.ps1 index 624609994..7a50a7ab8 100644 --- a/images/macos/tests/Python.Tests.ps1 +++ b/images/macos/tests/Python.Tests.ps1 @@ -32,6 +32,10 @@ Describe "Python" { "pip3 --version" | Should -ReturnZeroExitCode } + It "Pipx is available" { + "pipx --version" | Should -ReturnZeroExitCode + } + It "Pip 3 and Python 3 came from the same brew formula" { $pip3Path = Split-Path (readlink (which pip3)) $python3Path = Split-Path (readlink (which python3)) diff --git a/images/macos/toolsets/toolset-10.13.json b/images/macos/toolsets/toolset-10.13.json index 6c12251b8..3bf629685 100644 --- a/images/macos/toolsets/toolset-10.13.json +++ b/images/macos/toolsets/toolset-10.13.json @@ -194,5 +194,11 @@ "3.6" ] } + ], + "pipx": [ + { + "package": "yamllint", + "cmd": "yamllint --version" + } ] } \ No newline at end of file diff --git a/images/macos/toolsets/toolset-10.14.json b/images/macos/toolsets/toolset-10.14.json index 2abe98036..aa1b41019 100644 --- a/images/macos/toolsets/toolset-10.14.json +++ b/images/macos/toolsets/toolset-10.14.json @@ -254,5 +254,11 @@ "1.15.*" ] } + ], + "pipx": [ + { + "package": "yamllint", + "cmd": "yamllint --version" + } ] } \ No newline at end of file diff --git a/images/macos/toolsets/toolset-10.15.json b/images/macos/toolsets/toolset-10.15.json index fc0bf7983..e041c15e2 100644 --- a/images/macos/toolsets/toolset-10.15.json +++ b/images/macos/toolsets/toolset-10.15.json @@ -163,5 +163,11 @@ "1.15.*" ] } + ], + "pipx": [ + { + "package": "yamllint", + "cmd": "yamllint --version" + } ] } \ No newline at end of file diff --git a/images/macos/toolsets/toolset-11.0.json b/images/macos/toolsets/toolset-11.0.json index 5ff2280a2..cb14b3a0e 100644 --- a/images/macos/toolsets/toolset-11.0.json +++ b/images/macos/toolsets/toolset-11.0.json @@ -88,5 +88,11 @@ "1.15.*" ] } + ], + "pipx": [ + { + "package": "yamllint", + "cmd": "yamllint --version" + } ] } \ No newline at end of file diff --git a/images/win/Windows2016-Readme.md b/images/win/Windows2016-Readme.md index f184b50ab..05e7c2d64 100644 --- a/images/win/Windows2016-Readme.md +++ b/images/win/Windows2016-Readme.md @@ -1,10 +1,11 @@ | Announcements | |-| +| [[Ubuntu] [Windows] Boost 1.69.0 will be deprecated on November, 10](https://github.com/actions/virtual-environments/issues/1847) | | [[In Discussion] Git internal tools will be removed from PATH Windows images and replaced with MSYS2 tools](https://github.com/actions/virtual-environments/issues/1525) | *** # Microsoft Windows Server 2016 Datacenter -- OS Version: 10.0.14393 Build 3930 -- Image Version: 20201012.1 +- OS Version: 10.0.14393 Build 3986 +- Image Version: 20201020.1 ## Installed Software ### Language and Runtime @@ -14,7 +15,7 @@ - Java 13.0.2 - Python 3.7.9 - Ruby 2.5.8p224 -- Go 1.14.9 +- Go 1.14.10 - PHP 7.4.11 - Julia 1.5.2 - Perl 5.32.0 @@ -25,46 +26,46 @@ - Vcpkg 2020.06.15 - NPM 6.14.8 - Yarn 1.22.10 -- pip 20.2.3 (python 3.7) -- Miniconda 4.6.14 +- pip 20.2.4 (python 3.7) +- Miniconda 4.8.3 - RubyGems 3.1.4 - Helm 3.3.4 -- Composer 1.10.13 +- Composer 1.10.15 - NuGet 5.7.0.6726 ### Project Management - Ant 1.10.9 - Maven 3.6.3 -- Gradle 6.6 +- Gradle 6.7 - sbt 1.4.0 ### Tools - azcopy 10.6.0 -- Bazel 3.6.0 -- Bazelisk 1.7.1 +- Bazel 3.7.0 +- Bazelisk 1.7.3 - CMake 3.18.4 -- CodeQL Action Bundle 2.2.5 +- CodeQL Action Bundle 2.3.0 - R 4.0.3 - Docker 19.03.12 -- Docker-compose 1.27.2 -- Git 2.28.0 -- Git LFS 2.11.0 -- Google Cloud SDK 313.0.1 +- Docker-compose 1.27.4 +- Git 2.29.0 +- Git LFS 2.12.0 +- Google Cloud SDK 315.0.0 - InnoSetup 6.0.5 - jq 1.6 -- Kubectl 1.19.1 +- Kubectl 1.19.3 - Kind 0.9.0 - Mingw-w64 8.1.0 - Mercurial 5.0 - NSIS v3.06.1 - Newman 5.2.0 - OpenSSL 1.1.1 -- Packer 1.6.3 -- Pulumi v2.11.2 +- Packer 1.6.4 +- Pulumi v2.12.0 - Subversion (SVN) 1.14.0 - ghc 8.10.2 - Cabal 3.2.0.0 -- Stack 2.3.3 +- Stack 2.5.1 - WinAppDriver 1.1.1809.18001 - zstd 1.4.5 - VSWhere 2.8.4 @@ -72,12 +73,12 @@ - yamllint 1.25.0 ### CLI Tools -- Azure CLI 2.12.1 +- Azure CLI 2.13.0 - Azure DevOps CLI extension 0.18.0 - Azure Dev Spaces CLI 1.0.20200921.3 -- AWS CLI 2.0.56 +- AWS CLI 2.0.57 - AWS SAM CLI 1.6.2 -- AWS Session Manager CLI 1.1.61.0 +- AWS Session Manager CLI 1.2.7.0 - Alibaba Cloud CLI 3.0.60 - Cloud Foundry CLI 6.53.0 - Hub CLI 2.14.2 @@ -93,11 +94,11 @@ - cargo-outdated v0.9.11 ### Browsers and webdrivers -- Google Chrome 86.0.4240.75 +- Google Chrome 86.0.4240.111 - Chrome Driver 86.0.4240.22 -- Microsoft Edge 86.0.622.38 -- Microsoft Edge Driver 86.0.622.38 -- Mozilla Firefox 81.0.1 +- Microsoft Edge 86.0.622.48 +- Microsoft Edge Driver 86.0.622.48 +- Mozilla Firefox 82.0 - Gecko Driver 0.27.0 - IE Driver 3.150.1.0 @@ -137,8 +138,8 @@ Note: MSYS2 is pre-installed on image but not added to PATH. | 1.11.13 | x64 | GOROOT_1_11_X64 | | 1.12.17 | x64 | GOROOT_1_12_X64 | | 1.13.15 | x64 | GOROOT_1_13_X64 | -| 1.14.9 (Default) | x64 | GOROOT_1_14_X64 | -| 1.15.2 | x64 | GOROOT_1_15_X64 | +| 1.14.10 (Default) | x64 | GOROOT_1_14_X64 | +| 1.15.3 | x64 | GOROOT_1_15_X64 | #### Node @@ -147,7 +148,7 @@ Note: MSYS2 is pre-installed on image but not added to PATH. | 8.17.0 | x64 | | 10.22.1 | x64 | | 12.19.0 | x64 | -| 14.13.1 | x64 | +| 14.14.0 | x64 | #### Python @@ -158,6 +159,7 @@ Note: MSYS2 is pre-installed on image but not added to PATH. | 3.6.8 | x64, x86 | | 3.7.9 (Default) | x64, x86 | | 3.8.6 | x64, x86 | +| 3.9.0 | x64, x86 | #### Ruby @@ -200,6 +202,7 @@ Note: MSYS2 is pre-installed on image but not added to PATH. ### Database tools - Azure CosmosDb Emulator 2.11.6.0 +- DacFx 15.0.4897.1 - SQLPS 1.0 - MySQL 5.7.21.0 @@ -207,7 +210,7 @@ Note: MSYS2 is pre-installed on image but not added to PATH. ### Visual Studio Enterprise 2017 | Name | Version | Path | | ----------------------------- | --------------- | -------------------------------------------------------------- | -| Visual Studio Enterprise 2017 | 15.9.28307.1259 | C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise | +| Visual Studio Enterprise 2017 | 15.9.28307.1274 | C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise | #### Workloads, components and extensions: @@ -476,20 +479,20 @@ Note: MSYS2 is pre-installed on image but not added to PATH. ### .NET Core SDK `Location C:\Program Files\dotnet\sdk` -- 1.1.14 2.1.300 2.1.301 2.1.302 2.1.401 2.1.402 2.1.403 2.1.500 2.1.502 2.1.503 2.1.504 2.1.505 2.1.506 2.1.507 2.1.508 2.1.509 2.1.510 2.1.511 2.1.512 2.1.513 2.1.514 2.1.515 2.1.516 2.1.517 2.1.518 2.1.602 2.1.603 2.1.604 2.1.605 2.1.606 2.1.607 2.1.608 2.1.609 2.1.610 2.1.611 2.1.612 2.1.613 2.1.614 2.1.615 2.1.700 2.1.701 2.1.801 2.1.802 2.1.803 2.1.804 2.1.805 2.1.806 2.1.807 2.1.808 2.1.809 2.1.810 3.1.100 3.1.101 3.1.102 3.1.103 3.1.104 3.1.105 3.1.106 3.1.107 3.1.108 3.1.200 3.1.201 3.1.202 3.1.300 3.1.301 3.1.302 3.1.401 3.1.402 +- 1.1.14 2.1.300 2.1.301 2.1.302 2.1.401 2.1.402 2.1.403 2.1.500 2.1.502 2.1.503 2.1.504 2.1.505 2.1.506 2.1.507 2.1.508 2.1.509 2.1.510 2.1.511 2.1.512 2.1.513 2.1.514 2.1.515 2.1.516 2.1.517 2.1.518 2.1.519 2.1.602 2.1.603 2.1.604 2.1.605 2.1.606 2.1.607 2.1.608 2.1.609 2.1.610 2.1.611 2.1.612 2.1.613 2.1.614 2.1.615 2.1.616 2.1.700 2.1.701 2.1.801 2.1.802 2.1.803 2.1.804 2.1.805 2.1.806 2.1.807 2.1.808 2.1.809 2.1.810 2.1.811 3.1.100 3.1.101 3.1.102 3.1.103 3.1.104 3.1.105 3.1.106 3.1.107 3.1.108 3.1.109 3.1.200 3.1.201 3.1.202 3.1.300 3.1.301 3.1.302 3.1.401 3.1.402 3.1.403 ### .NET Core Runtime `Location: C:\Program Files\dotnet\shared\Microsoft.AspNetCore.All` -- 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.20 2.1.21 2.1.22 +- 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.20 2.1.21 2.1.22 2.1.23 `Location: C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App` -- 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.20 2.1.21 2.1.22 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 +- 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.20 2.1.21 2.1.22 2.1.23 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 `Location: C:\Program Files\dotnet\shared\Microsoft.NETCore.App` -- 1.0.16 1.1.13 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.20 2.1.21 2.1.22 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 +- 1.0.16 1.1.13 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.1.10 2.1.11 2.1.12 2.1.13 2.1.14 2.1.15 2.1.16 2.1.17 2.1.18 2.1.19 2.1.20 2.1.21 2.1.22 2.1.23 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 `Location: C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App` -- 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 +- 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 ### .NET Framework `Type: Developer Pack` @@ -518,7 +521,7 @@ All other versions are saved but not installed. | Pester | 3.4.0
5.0.4 | | PowerShellGet | 1.0.0.1
2.2.4.1
2.2.5 | | PSWindowsUpdate | 2.2.0.2 | -| SqlServer | 21.1.18228 | +| SqlServer | 21.1.18229 | | VSSetup | 2.2.16 | ### Android diff --git a/images/win/scripts/Installers/Configure-Shell.ps1 b/images/win/scripts/Installers/Configure-Shell.ps1 new file mode 100644 index 000000000..8eb163bcf --- /dev/null +++ b/images/win/scripts/Installers/Configure-Shell.ps1 @@ -0,0 +1,23 @@ +# Create shells folder +$shellPath = "C:\shells" +New-Item -Path $shellPath -ItemType Directory | Out-Null + +# sh and bash <--> C:\msys64\usr\bin\bash.exe +New-Item -ItemType SymbolicLink -Path "$shellPath\bash.exe" -Target "C:\msys64\usr\bin\bash.exe" | Out-Null +New-Item -ItemType SymbolicLink -Path "$shellPath\sh.exe" -Target "C:\msys64\usr\bin\sh.exe" | Out-Null + +# WSL is available on Windows Server 2019 +if (Test-IsWin19) +{ + # winbash <--> C:\Windows\System32\bash.exe + New-Item -ItemType SymbolicLink -Path "$shellPath\winbash.exe" -Target "$env:SystemRoot\System32\bash.exe" | Out-Null +} + +# gitbash <--> C:\Program Files\Git\bin\bash.exe +New-Item -ItemType SymbolicLink -Path "$shellPath\gitbash.exe" -Target "$env:ProgramFiles\Git\bin\bash.exe" | Out-Null + +# msysbash <--> C:\msys64\usr\bin\bash.exe +New-Item -ItemType SymbolicLink -Path "$shellPath\msysbash.exe" -Target "C:\msys64\usr\bin\bash.exe" | Out-Null + +# Add shells to PATH +Add-MachinePathItem $shellPath \ No newline at end of file diff --git a/images/win/scripts/Installers/Finalize-VM.ps1 b/images/win/scripts/Installers/Finalize-VM.ps1 index 4e7a260c4..d0bb3d26a 100644 --- a/images/win/scripts/Installers/Finalize-VM.ps1 +++ b/images/win/scripts/Installers/Finalize-VM.ps1 @@ -30,3 +30,7 @@ New-Item -Path $winInstallDir -ItemType Directory -Force # Remove AllUsersAllHosts profile Remove-Item $profile.AllUsersAllHosts -Force + +# Clean yarn and npm cache +yarn cache clean +npm cache clean --force \ No newline at end of file diff --git a/images/win/scripts/Installers/Install-Git.ps1 b/images/win/scripts/Installers/Install-Git.ps1 index 27a619695..6c89250e9 100644 --- a/images/win/scripts/Installers/Install-Git.ps1 +++ b/images/win/scripts/Installers/Install-Git.ps1 @@ -26,7 +26,7 @@ Install-Binary -Url $downloadUrl ` "/SP-", ` "/CLOSEAPPLICATIONS", ` "/RESTARTAPPLICATIONS", ` - "/o:PathOption=CmdTools", ` + "/o:PathOption=Cmd", ` "/o:BashTerminalOption=ConHost", ` "/o:EnableSymlinks=Enabled", ` "/COMPONENTS=gitlfs") @@ -36,15 +36,5 @@ Choco-Install -PackageName hub # Disable GCM machine-wide [Environment]::SetEnvironmentVariable("GCM_INTERACTIVE", "Never", [System.EnvironmentVariableTarget]::Machine) -Add-MachinePathItem "C:\Program Files\Git\bin" - -if (Test-IsWin16) { - $env:Path += ";$env:ProgramFiles\Git\usr\bin\" -} - -# Add well-known SSH host keys to ssh_known_hosts -ssh-keyscan -t rsa github.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" -ssh-keyscan -t rsa ssh.dev.azure.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" - Invoke-PesterTests -TestFile "Git" -TestName "Git" Invoke-PesterTests -TestFile "CLI.Tools" -TestName "Hub CLI" diff --git a/images/win/scripts/Installers/Install-Mingw64.ps1 b/images/win/scripts/Installers/Install-Mingw64.ps1 index b6c860485..2b999f450 100644 --- a/images/win/scripts/Installers/Install-Mingw64.ps1 +++ b/images/win/scripts/Installers/Install-Mingw64.ps1 @@ -7,7 +7,7 @@ Choco-Install -PackageName mingw # Make a copy of mingw32-make.exe to make.exe, which is a more discoverable name # and so the same command line can be used on Windows as on macOS and Linux -$path = where.exe mingw32-make.exe | Get-Item +$path = Get-Command mingw32-make.exe -CommandType All | Where-Object { $_.Path.Contains("C:\ProgramData\Chocolatey") } | Get-Item Copy-Item -Path $path -Destination (Join-Path $path.Directory 'make.exe') Invoke-PesterTests -TestFile "Tools" -TestName "Mingw64" diff --git a/images/win/scripts/Installers/Install-Msys2.ps1 b/images/win/scripts/Installers/Install-Msys2.ps1 index f0da38503..dea3b95d0 100644 --- a/images/win/scripts/Installers/Install-Msys2.ps1 +++ b/images/win/scripts/Installers/Install-Msys2.ps1 @@ -9,35 +9,19 @@ $dash = "-" * 40 -$origPath = $env:PATH -$gitPath = "$env:ProgramFiles\Git" - -$msys2_release = "https://api.github.com/repos/msys2/msys2-installer/releases/latest" - -$msys2Uri = ((Invoke-RestMethod $msys2_release).assets | Where-Object { - $_.name -match "x86_64" -and $_.name.EndsWith("tar.xz") }).browser_download_url - -# Download the latest msys2 x86_64, filename includes release date -Write-Host "Starting msys2 download using $($msys2Uri.split('/')[-1])" +# Downloading msys2 +$msys2Release = "https://api.github.com/repos/msys2/msys2-installer/releases/latest" +$msys2Uri = ((Invoke-RestMethod $msys2Release).assets | Where-Object { + $_.name -match "x86_64" -and $_.name.EndsWith("sfx.exe") }).browser_download_url $msys2File = Start-DownloadWithRetry -Url $msys2Uri -Write-Host "Finished download" -# nix style path for tar -$msys2FileU = "/$msys2File".replace(':', '').replace('\', '/') - -# Git tar needs exe's from mingw64\bin -$env:PATH = "$gitPath\usr\bin;$gitPath\mingw64\bin;$origPath" - -$tar = "$gitPath\usr\bin\tar.exe" - -# extract tar.xz to C:\ +# extract sfx.exe to C:\ Write-Host "Starting msys2 extraction" -&$tar -xJf $msys2FileU -C /c/ -Remove-Item $msys2File +& $msys2File -y -oC:\ Write-Host "Finished extraction" # Add msys2 bin tools folders to PATH temporary -$env:PATH = "C:\msys64\mingw64\bin;C:\msys64\usr\bin;$origPath" +$env:PATH = "C:\msys64\mingw64\bin;C:\msys64\usr\bin;$env:PATH" Write-Host "`n$dash bash pacman-key --init" bash.exe -c "pacman-key --init 2>&1" @@ -73,6 +57,10 @@ Write-Host "`n$dash Install mingw32 packages" $pre = "mingw-w64-i686-" pacman.exe -S --noconfirm --needed --noprogressbar $tools32.replace('___', $pre).split(' ') +# install openssh +Write-Host "`n$dash Install openssh package" +pacman.exe -S --noconfirm --needed --noprogressbar openssh + # clean all packages to decrease image size Write-Host "`n$dash Clean packages" pacman.exe -Scc --noconfirm @@ -88,4 +76,23 @@ pacman.exe -Q | grep -v ^mingw-w64- Write-Host "`nMSYS2 installation completed" +# Environment +# add C:\msys64\mingw64\bin and C:\msys64\usr\bin to PATH +# C:\msys64\mingw64\bin add after C:\Windows\System32 to not replace built-in tar.exe +$regEnvKey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\' +$pathValue = Get-ItemPropertyValue -Path $regEnvKey -Name 'Path' +$pathValue += ";C:\msys64\mingw64\bin;C:\msys64\usr\bin" +Set-ItemProperty -Path $regEnvKey -Name 'Path' -Value $pathValue + +# Add well-known SSH host keys to ssh_known_hosts to Msys2 +ssh-keyscan -t rsa github.com >> "C:\msys64\etc\ssh\ssh_known_hosts" +ssh-keyscan -t rsa ssh.dev.azure.com >> "C:\msys64\etc\ssh\ssh_known_hosts" + +# Add well-known SSH host keys to ssh_known_hosts to Git +if (Test-Path "C:\Program Files\Git\etc\ssh") +{ + ssh-keyscan -t rsa github.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" + ssh-keyscan -t rsa ssh.dev.azure.com >> "C:\Program Files\Git\etc\ssh\ssh_known_hosts" +} + Invoke-PesterTests -TestFile "MSYS2" diff --git a/images/win/scripts/Installers/Install-SQLPowerShellTools.ps1 b/images/win/scripts/Installers/Install-SQLPowerShellTools.ps1 index 60cbbefaf..37f5ece9b 100644 --- a/images/win/scripts/Installers/Install-SQLPowerShellTools.ps1 +++ b/images/win/scripts/Installers/Install-SQLPowerShellTools.ps1 @@ -3,7 +3,7 @@ ## Desc: Install SQL PowerShell tool ################################################################################ -$BaseUrl = "https://download.microsoft.com/download/8/7/2/872BCECA-C849-4B40-8EBE-21D48CDF1456/ENU/x64" +$BaseUrl = "https://download.microsoft.com/download/B/1/7/B1783FE9-717B-4F78-A39A-A2E27E3D679D/ENU/x64" # install required MSIs $SQLSysClrTypesName = "SQLSysClrTypes.msi" diff --git a/images/win/scripts/SoftwareReport/SoftwareReport.Common.psm1 b/images/win/scripts/SoftwareReport/SoftwareReport.Common.psm1 index 12f41061c..af9141e1d 100644 --- a/images/win/scripts/SoftwareReport/SoftwareReport.Common.psm1 +++ b/images/win/scripts/SoftwareReport/SoftwareReport.Common.psm1 @@ -271,6 +271,13 @@ function Get-PacmanVersion { return "- Pacman $pacmanVersion" } +function Get-ShellTarget { + $shells = Get-ChildItem C:\shells -File | Select-Object @{n="Name";e={ + $name = $_.Name + if ($name -eq 'bash.exe') {"$name (Default)"} else {$name}}},@{n="Target";e={@($_.Target)[0]}} | Sort-Object Name + $shells | New-MDTable -Columns ([ordered]@{Name = "left"; Target = "left";}) +} + function Get-YAMLLintVersion { yamllint --version } diff --git a/images/win/scripts/SoftwareReport/SoftwareReport.Generator.ps1 b/images/win/scripts/SoftwareReport/SoftwareReport.Generator.ps1 index 3a7a785e9..5649c8038 100644 --- a/images/win/scripts/SoftwareReport/SoftwareReport.Generator.ps1 +++ b/images/win/scripts/SoftwareReport/SoftwareReport.Generator.ps1 @@ -143,14 +143,22 @@ $markdown += New-MDList -Style Unordered -Lines @( (Get-SeleniumWebDriverVersion -Driver "iexplorer") ) +$markdown += New-MDHeader "Shells" -Level 3 +$markdown += Get-ShellTarget +$markdown += New-MDNewLine + $markdown += New-MDHeader "MSYS2" -Level 3 $markdown += Get-PacmanVersion $markdown += New-MDNewLine +$markdown += New-MDHeader "Notes:" -Level 5 $markdown += @' ``` Location: C:\msys64 -Note: MSYS2 is pre-installed on image but not added to PATH. +1. MSYS2 is pre-installed on image +2. C:\msys64\mingw64\bin is added to PATH and has lower precedence than C:\Windows\System32 +3. C:\msys64\usr\bin is added to PATH and has lower precedence than C:\Windows\System32 +4. Default bash.exe shell is set to the C:\msys64\usr\bin\bash.exe ``` '@ $markdown += New-MDNewLine diff --git a/images/win/scripts/Tests/Git.Tests.ps1 b/images/win/scripts/Tests/Git.Tests.ps1 index 8dd159fa4..e7675ee07 100644 --- a/images/win/scripts/Tests/Git.Tests.ps1 +++ b/images/win/scripts/Tests/Git.Tests.ps1 @@ -1,5 +1,5 @@ Describe "Git" { - $gitTools = 'bash', 'awk', 'git', 'git-lfs' + $gitTools = 'git', 'git-lfs' $gitTestCases = $gitTools | ForEach-Object { @{ toolName = $_ diff --git a/images/win/scripts/Tests/Shell.Tests.ps1 b/images/win/scripts/Tests/Shell.Tests.ps1 new file mode 100644 index 000000000..915940e2a --- /dev/null +++ b/images/win/scripts/Tests/Shell.Tests.ps1 @@ -0,0 +1,50 @@ +Describe "Shell" { + $shellTestCases = @( + @{Name = "C:\shells\bash.exe"; Target = "C:\msys64\usr\bin\bash.exe"}, + @{Name = "C:\shells\sh.exe"; Target = "C:\msys64\usr\bin\sh.exe"}, + @{Name = "C:\shells\gitbash.exe"; Target = "$env:ProgramFiles\Git\bin\bash.exe"}, + @{Name = "C:\shells\msysbash.exe"; Target = "C:\msys64\usr\bin\bash.exe"} + ) + + $pathTestCases = @( + @{Path = "C:\shells"}, + @{Path = "C:\msys64\mingw64\bin"}, + @{Path = "C:\msys64\usr\bin"} + ) + + $IsWin16 = Test-IsWin16 + + It "Default bash.exe from MSYS2" { + (Get-Command bash).Path | Should -BeExactly "C:\shells\bash.exe" + } + + It "Default sh.exe from MSYS2" { + (Get-Command sh).Path | Should -BeExactly "C:\shells\sh.exe" + } + + It "Folder C:\shells exists" { + "C:\shells" | Should -Exist + } + + It "C:\Windows\System32 before C:\msys64\mingw64\bin and C:\msys64\usr\bin" { + $path = $env:Path.Split(";").ToLower() + $indexOfSystem32 = $path.IndexOf("c:\windows\system32") + + $path.IndexOf("c:\msys64\mingw64\bin") | Should -BeGreaterThan $indexOfSystem32 + $path.IndexOf("c:\msys64\usr\bin") | Should -BeGreaterThan $indexOfSystem32 + } + + It "C:\shells\winbash.exe target to $env:SystemRoot\System32\bash.exe" -Skip:$IsWin16 { + $Name = "C:\shells\winbash.exe" + $Target = "$env:SystemRoot\System32\bash.exe" + (Get-Item $Name).Target | Should -BeExactly $Target + } + + It " target to " -TestCases $shellTestCases { + (Get-Item $Name).Target | Should -BeExactly $Target + } + + It " is in PATH" -TestCases $pathTestCases { + $env:Path.Split(";") | Should -Contain $Path + } +} \ No newline at end of file diff --git a/images/win/windows2016.json b/images/win/windows2016.json index 120e7ac96..8136ebd4d 100644 --- a/images/win/windows2016.json +++ b/images/win/windows2016.json @@ -333,7 +333,8 @@ "type": "powershell", "scripts": [ "{{ template_dir }}/scripts/Installers/Install-WindowsUpdates.ps1", - "{{ template_dir }}/scripts/Installers/Configure-DynamicPort.ps1" + "{{ template_dir }}/scripts/Installers/Configure-DynamicPort.ps1", + "{{ template_dir }}/scripts/Installers/Configure-Shell.ps1" ], "elevated_user": "{{user `install_user`}}", "elevated_password": "{{user `install_password`}}" diff --git a/images/win/windows2019.json b/images/win/windows2019.json index a27bf27d9..f20e050c6 100644 --- a/images/win/windows2019.json +++ b/images/win/windows2019.json @@ -331,7 +331,8 @@ "type": "powershell", "scripts": [ "{{ template_dir }}/scripts/Installers/Install-WindowsUpdates.ps1", - "{{ template_dir }}/scripts/Installers/Configure-DynamicPort.ps1" + "{{ template_dir }}/scripts/Installers/Configure-DynamicPort.ps1", + "{{ template_dir }}/scripts/Installers/Configure-Shell.ps1" ], "elevated_user": "{{user `install_user`}}", "elevated_password": "{{user `install_password`}}"