diff --git a/README.md b/README.md index cf8a7eb08..79c92534b 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,46 @@ # GitHub Actions Virtual Environments -This repository contains the code that we use to create the GitHub Actions [virtual environments](https://help.github.com/en/articles/software-in-virtual-environments-for-github-actions). -Please use the issue templates to submit requests and bug reports related to the installed software. +This repository contains the source used to create the [virtual environments](https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners) for GitHub Actions hosted runners. To file bug reports, or request that tools be added/updated, please [open an issue using the appropriate template](https://github.com/actions/virtual-environments/issues/new/choose). To build a VM machine from this repo's source, see the [instructions](./help/CreateImageAndAzureResources.md). -If you need help with how to set up your workflow file or use a specific tool, -check out the [GitHub Actions Community Forum](https://github.community/t5/GitHub-Actions/bd-p/actions). +For general questions about using the virtual environments or writing your Actions workflow, please open requests in the [GitHub Actions Community Forum](https://github.community/t5/GitHub-Actions/bd-p/actions). -If you need help with how to build VM machine from source code, check out the [documentation](./help/CreateImageAndAzureResources.md). +## Available Environments +| Environment | YAML Label | Included Software | Latest Release & Rollout Progress | +| --------------------|---------------------|--------------------|---------------------| +| Ubuntu 18.04 | `ubuntu-latest` or `ubuntu-18.04` | [ubuntu-18.04] | [![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu18&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu18&redirect=1) +| Ubuntu 16.04 | `ubuntu-16.04` | [ubuntu-16.04] | [![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu16&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu16&redirect=1) | +| macOS 10.15 | `macos-latest` or `macos-10.15` | [macOS-10.15] | *Coming soon* | +| Windows Server 2019 | `windows-latest` or `windows-2019` | [windows-2019] | [![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2019&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2019&redirect=1) +| Windows Server 2016 | `windows-2016` | [windows-2016] | [![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2016&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2016&redirect=1) -## OS's offered -We currently offer Linux, macOS, and Windows virtual environments: +***Looking for other Linux distributions?*** We do not plan to offer other Linux distributions. We recommend using Docker if you'd like to build using other distributions with the hosted virtual environments. Alternatively, you can leverage [self-hosted runners] and fully customize your environment to your needs. -[![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu18&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu18&redirect=1) -[![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu16&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=ubuntu16&redirect=1) -[![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2016&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2016&redirect=1) -[![](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2019&badge=1)](https://actionvirtualenvironmentsstatus.azurewebsites.net/api/status?imageName=windows-2019&redirect=1) +***Where is the macOS source?*** We are in the process of preparing our macOS source to live in this repo so we can take contributions from the community. Until then, we appreciate your patience and ask you continue to make tool requests by filing issues. -- **Linux**. We offer Ubuntu 16.04 and Ubuntu 18.04. We do not plan to offer other Linux distributions. If you want to build using other distributions with the hosted virtual environments, we suggest you use Docker. Alternatively, you can host your own VMs and make use of self-hosted runners. -- **macOS**. We offer macOS Catalina 10.15. -- **Windows**. We offer Windows Server 2016 and Windows Server 2019. +## Software Guidelines +In general, these are the guidelines we consider when deciding what to pre-install: -## Guidelines for what's installed -We follow these rough guidelines when deciding what to pre-install: - -- Tools and ecosystems that are more popular and widely-used will be given priority. -- More recent versions of tools will be given priority over older versions. +- Tools and ecosystems that are broadly popular and widely-used will be given priority. +- Recent versions of tools will be given priority over older versions. - Tools and versions that are deprecated or have reached end-of-life will not be added. -- Tools and versions will be removed 6 months after they are deprecated or have reached end-of-life. +- Tools and versions will typically be removed 6 months after they are deprecated or have reached end-of-life. - If a tool can be installed during the build, we will evaluate how much time is saved -and how much space is used by having the tool pre-installed. + and how much space is used by having the tool pre-installed. -## Updates to the virtual environments -_Cadence_ +## Updates to virtual environments +*Cadence* -You can expect approximately weekly updates to the software on the virtual environments. +We typically deploy weekly updates to the software on the virtual environments. For some tools, we always install the latest at the time of the deployment; for others, we pin the tool to specific version(s). -_Notifications_ +*Following Along / Change Notifications* -Right now, we don't have a great way for you to know when updates to the images are coming. -When we have the code available here, you can watch the Releases for when we generate -candidate environments, and when we deploy new ones. +* **High Impact Changes** (ex. breaking changes, new or deprecated environments) will be posted to the GitHub Changelog on our [blog](https://github.blog/changelog/) and on [twitter](https://twitter.com/GHchangelog). +* **Regular Weekly Rhythm** can be followed by watching [Releases](https://github.com/actions/virtual-environments/releases) to see when we generate candidate environments or deploy new ones. You can also track upcoming changes on the [virtual environment project](https://github.com/actions/virtual-environments/projects/1) to see which issues are under development. + +[ubuntu-18.04]: https://github.com/actions/virtual-environments/blob/master/images/linux/Ubuntu1804-README.md +[ubuntu-16.04]: https://github.com/actions/virtual-environments/blob/master/images/linux/Ubuntu1604-README.md +[Windows-2019]: https://github.com/actions/virtual-environments/blob/master/images/win/Windows2019-Readme.md +[windows-2016]: https://github.com/actions/virtual-environments/blob/master/images/win/Windows2016-Readme.md +[macOS-10.15]: https://github.com/actions/virtual-environments/blob/master/images/macos/macos-10.15-Readme.md +[self-hosted runners]: https://help.github.com/en/actions/hosting-your-own-runners \ No newline at end of file diff --git a/images.CI/azure-pipelines/image-generation.yml b/images.CI/azure-pipelines/image-generation.yml new file mode 100644 index 000000000..332f34add --- /dev/null +++ b/images.CI/azure-pipelines/image-generation.yml @@ -0,0 +1,69 @@ +# Ideally we would use GitHub Actions for this, but since we use self-hosted machines to run image builds +# we need the following features to use GitHub Actions for Images CI: +# - https://github.community/t5/GitHub-Actions/Make-secrets-available-to-builds-of-forks/m-p/30678#M508 +# - https://github.community/t5/GitHub-Actions/GitHub-Actions-Manual-Trigger-Approvals/td-p/31504 +# - https://github.community/t5/GitHub-Actions/Protecting-github-workflows/td-p/30290 + +jobs: +- job: + pool: ci-agent-pool + timeoutInMinutes: 600 + variables: + - group: Image Generation Variables + + steps: + - task: PowerShell@2 + displayName: 'Download custom repository' + condition: and(ne(variables['CUSTOM_REPOSITORY_URL'], ''), ne(variables['CUSTOM_REPOSITORY_BRANCH'], '')) + inputs: + targetType: 'inline' + script: | + Write-Host "Clean up default repository" + Remove-Item -path './*' -Recurse -Force + Write-Host "Download $(CUSTOM_REPOSITORY_BRANCH) branch from $(CUSTOM_REPOSITORY_URL)" + $env:GIT_REDIRECT_STDERR = '2>&1' + git clone $(CUSTOM_REPOSITORY_URL) . -b $(CUSTOM_REPOSITORY_BRANCH) --single-branch --depth 1 + + - task: PowerShell@2 + displayName: 'Build VM' + inputs: + targetType: filePath + filePath: ./images.CI/build-image.ps1 + arguments: -ResourcesNamePrefix $(Build.BuildId) ` + -ClientId $(CLIENT_ID) ` + -ClientSecret $(CLIENT_SECRET) ` + -Image ${{ parameters.image_type }} ` + -ResourceGroup $(AZURE_RESOURCE_GROUP) ` + -StorageAccount $(AZURE_STORAGE_ACCOUNT) ` + -SubscriptionId $(AZURE_SUBSCRIPTION) ` + -TenantId $(AZURE_TENANT) ` + -Location $(AZURE_LOCATION) ` + -VirtualNetworkName $(BUILD_AGENT_VNET_NAME) ` + -VirtualNetworkRG $(BUILD_AGENT_VNET_RESOURCE_GROUP) ` + -VirtualNetworkSubnet $(BUILD_AGENT_SUBNET_NAME) ` + -GitHubFeedToken $(GITHUB_TOKEN) + + - task: PowerShell@2 + displayName: 'Create release for VM deployment' + inputs: + targetType: filePath + filePath: ./images.CI/create-release.ps1 + arguments: -BuildId $(Build.BuildId) ` + -Organization $(RELEASE_TARGET_ORGANIZATION) ` + -DefinitionId $(RELEASE_TARGET_DEFINITION_ID) ` + -Project $(RELEASE_TARGET_PROJECT) ` + -ImageName ${{ parameters.image_type }} ` + -AccessToken $(RELEASE_TARGET_TOKEN) + + - task: PowerShell@2 + displayName: 'Clean up resources' + condition: always() + inputs: + targetType: filePath + filePath: ./images.CI/cleanup.ps1 + arguments: -ResourcesNamePrefix $(Build.BuildId) ` + -ClientId $(CLIENT_ID) ` + -ClientSecret $(CLIENT_SECRET) ` + -Image ${{ parameters.image_type }} ` + -SubscriptionId $(AZURE_SUBSCRIPTION) ` + -TenantId $(AZURE_TENANT) \ No newline at end of file diff --git a/images.CI/azure-pipelines/ubuntu1604.yml b/images.CI/azure-pipelines/ubuntu1604.yml new file mode 100644 index 000000000..8f6dcef22 --- /dev/null +++ b/images.CI/azure-pipelines/ubuntu1604.yml @@ -0,0 +1,19 @@ +schedules: +- cron: "0 0 * * *" + displayName: Daily + branches: + include: + - master + always: true + +trigger: none +pr: + autoCancel: true + branches: + include: + - master + +jobs: +- template: image-generation.yml + parameters: + image_type: ubuntu1604 \ No newline at end of file diff --git a/images.CI/azure-pipelines/ubuntu1804.yml b/images.CI/azure-pipelines/ubuntu1804.yml new file mode 100644 index 000000000..998ba42e6 --- /dev/null +++ b/images.CI/azure-pipelines/ubuntu1804.yml @@ -0,0 +1,19 @@ +schedules: +- cron: "0 0 * * *" + displayName: Daily + branches: + include: + - master + always: true + +trigger: none +pr: + autoCancel: true + branches: + include: + - master + +jobs: +- template: image-generation.yml + parameters: + image_type: ubuntu1804 \ No newline at end of file diff --git a/images.CI/azure-pipelines/windows2016.yml b/images.CI/azure-pipelines/windows2016.yml new file mode 100644 index 000000000..667b30bd7 --- /dev/null +++ b/images.CI/azure-pipelines/windows2016.yml @@ -0,0 +1,19 @@ +schedules: +- cron: "0 0 * * *" + displayName: Daily + branches: + include: + - master + always: true + +trigger: none +pr: + autoCancel: true + branches: + include: + - master + +jobs: +- template: image-generation.yml + parameters: + image_type: Windows2016-Azure \ No newline at end of file diff --git a/images.CI/azure-pipelines/windows2019.yml b/images.CI/azure-pipelines/windows2019.yml new file mode 100644 index 000000000..508fa12b3 --- /dev/null +++ b/images.CI/azure-pipelines/windows2019.yml @@ -0,0 +1,19 @@ +schedules: +- cron: "0 0 * * *" + displayName: Daily + branches: + include: + - master + always: true + +trigger: none +pr: + autoCancel: true + branches: + include: + - master + +jobs: +- template: image-generation.yml + parameters: + image_type: Windows2019-Azure \ No newline at end of file diff --git a/images.CI/build-image.ps1 b/images.CI/build-image.ps1 new file mode 100644 index 000000000..54748e417 --- /dev/null +++ b/images.CI/build-image.ps1 @@ -0,0 +1,60 @@ +param( + [String] [Parameter (Mandatory=$true)] $Image, + [String] [Parameter (Mandatory=$true)] $ClientId, + [String] [Parameter (Mandatory=$true)] $ClientSecret, + [String] [Parameter (Mandatory=$true)] $GitHubFeedToken, + [String] [Parameter (Mandatory=$true)] $ResourcesNamePrefix, + [String] [Parameter (Mandatory=$true)] $Location, + [String] [Parameter (Mandatory=$true)] $ResourceGroup, + [String] [Parameter (Mandatory=$true)] $StorageAccount, + [String] [Parameter (Mandatory=$true)] $SubscriptionId, + [String] [Parameter (Mandatory=$true)] $TenantId, + [String] [Parameter (Mandatory=$true)] $VirtualNetworkName, + [String] [Parameter (Mandatory=$true)] $VirtualNetworkRG, + [String] [Parameter (Mandatory=$true)] $VirtualNetworkSubnet +) + +$TemplatePath = (Get-ChildItem -Path "images" -Include "$Image.json" -Recurse -Depth 2).FullName +if (-not $TemplatePath) +{ + Write-Error "'-Image' parameter is not valid. You have to specify correct image type." + exit 1 +} + +$TempResourceGroupName = "${ResourcesNamePrefix}_${Image}" +$InstallPassword = [System.GUID]::NewGuid().ToString().ToUpper() + +packer validate -syntax-only $TemplatePath + +$SensitiveData = @( + 'OSType', + 'StorageAccountLocation', + 'OSDiskUri', + 'OSDiskUriReadOnlySas', + 'TemplateUri', + 'TemplateUriReadOnlySas', + ': ->' +) + +Write-Host "Build $Image VM" +packer build -var "capture_name_prefix=$ResourcesNamePrefix" ` + -var "client_id=$ClientId" ` + -var "client_secret=$ClientSecret" ` + -var "install_password=$InstallPassword" ` + -var "github_feed_token=$GitHubFeedToken" ` + -var "location=$Location" ` + -var "resource_group=$ResourceGroup" ` + -var "storage_account=$StorageAccount" ` + -var "subscription_id=$SubscriptionId" ` + -var "temp_resource_group_name=$TempResourceGroupName" ` + -var "tenant_id=$TenantId" ` + -var "virtual_network_name=$VirtualNetworkName" ` + -var "virtual_network_resource_group_name=$VirtualNetworkRG" ` + -var "virtual_network_subnet_name=$VirtualNetworkSubnet" ` + $TemplatePath ` + | Where-Object { + #Filter sensitive data from Packer logs + $currentString = $_ + $sensitiveString = $SensitiveData | Where-Object { $currentString -match $_ } + $sensitiveString -eq $null + } \ No newline at end of file diff --git a/images.CI/cleanup.ps1 b/images.CI/cleanup.ps1 new file mode 100644 index 000000000..00050d551 --- /dev/null +++ b/images.CI/cleanup.ps1 @@ -0,0 +1,21 @@ +param( + [String] [Parameter (Mandatory=$true)] $Image, + [String] [Parameter (Mandatory=$true)] $ResourcesNamePrefix, + [String] [Parameter (Mandatory=$true)] $ClientId, + [String] [Parameter (Mandatory=$true)] $ClientSecret, + [String] [Parameter (Mandatory=$true)] $SubscriptionId, + [String] [Parameter (Mandatory=$true)] $TenantId +) + +az login --service-principal --username $ClientId --password $ClientSecret --tenant $TenantId | Out-Null + +$TempResourceGroupName = "${ResourcesNamePrefix}_${Image}" + +$groupExist = az group exists --name $TempResourceGroupName --subscription $SubscriptionId | Out-Null +if ($groupExist -eq "true") { + Write-Host "Found a match, deleting temporary files" + az group delete --name $TempResourceGroupName --subscription $SubscriptionId --yes | Out-Null + Write-Host "Temporary group was deleted succesfully" -ForegroundColor Green +} else { + Write-Host "No temporary groups found" +} \ No newline at end of file diff --git a/images.CI/create-release.ps1 b/images.CI/create-release.ps1 new file mode 100644 index 000000000..72d0db4e1 --- /dev/null +++ b/images.CI/create-release.ps1 @@ -0,0 +1,31 @@ +param( + [UInt32] [Parameter (Mandatory)] $BuildId, + [String] [Parameter (Mandatory)] $Organization, + [String] [Parameter (Mandatory)] $Project, + [String] [Parameter (Mandatory)] $ImageName, + [String] [Parameter (Mandatory)] $DefinitionId, + [String] [Parameter (Mandatory)] $AccessToken +) + +$Body = @{ + definitionId = $DefinitionId + variables = @{ + ImageBuildId = @{ + value = $BuildId + } + ImageName = @{ + value = $ImageName + } + } + isDraft = "false" +} | ConvertTo-Json -Depth 3 + +$URL = "https://vsrm.dev.azure.com/$Organization/$Project/_apis/release/releases?api-version=5.1" +$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("'':${AccessToken}")) +$headers = @{ + Authorization = "Basic ${base64AuthInfo}" +} + +$NewRelease = Invoke-RestMethod $URL -Body $Body -Method "POST" -Headers $headers -ContentType "application/json" + +Write-Host "Created release: $($NewRelease._links.web.href)" \ No newline at end of file diff --git a/images/linux/scripts/base/repos.sh b/images/linux/scripts/base/repos.sh index f8280cc06..4ecd2028c 100644 --- a/images/linux/scripts/base/repos.sh +++ b/images/linux/scripts/base/repos.sh @@ -9,7 +9,11 @@ LSB_RELEASE=$(lsb_release -rs) # Install Microsoft repository wget https://packages.microsoft.com/config/ubuntu/$LSB_RELEASE/packages-microsoft-prod.deb dpkg -i packages-microsoft-prod.deb -apt-get update +apt-get install -y apt-transport-https ca-certificates curl software-properties-common # Install Microsoft GPG public key curl -L https://packages.microsoft.com/keys/microsoft.asc | apt-key add - + +curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg +mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg +apt-get update \ No newline at end of file diff --git a/images/linux/scripts/installers/1604/basic.sh b/images/linux/scripts/installers/1604/basic.sh index fffeba833..99c80a313 100644 --- a/images/linux/scripts/installers/1604/basic.sh +++ b/images/linux/scripts/installers/1604/basic.sh @@ -31,11 +31,12 @@ apt-fast install -y --no-install-recommends \ sudo \ telnet \ time \ + tzdata \ unzip \ upx \ wget \ zip \ - tzdata + zstd # Electron / VSCode / GitHub Desktop prereqs apt-fast install -y --no-install-recommends \ @@ -86,8 +87,9 @@ DocumentInstalledItemIndent "shellcheck" DocumentInstalledItemIndent "sudo" DocumentInstalledItemIndent "telnet" DocumentInstalledItemIndent "time" +DocumentInstalledItemIndent "tzdata" DocumentInstalledItemIndent "unzip" DocumentInstalledItemIndent "upx" DocumentInstalledItemIndent "wget" DocumentInstalledItemIndent "zip" -DocumentInstalledItemIndent "tzdata" +DocumentInstalledItemIndent "zstd" diff --git a/images/linux/scripts/installers/1604/dotnetcore-sdk.sh b/images/linux/scripts/installers/1604/dotnetcore-sdk.sh deleted file mode 100644 index 7db727558..000000000 --- a/images/linux/scripts/installers/1604/dotnetcore-sdk.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -################################################################################ -## File: dotnetcore-sdk.sh -## Desc: Installs .NET Core SDK -################################################################################ - -source $HELPER_SCRIPTS/apt.sh -source $HELPER_SCRIPTS/document.sh - -LATEST_DOTNET_PACKAGES=("dotnet-sdk-3.0" "dotnet-sdk-3.1") - -LSB_RELEASE=$(lsb_release -rs) - -mksamples() -{ - sdk=$1 - sample=$2 - mkdir "$sdk" - cd "$sdk" || exit - set -e - dotnet help - dotnet new globaljson --sdk-version "$sdk" - dotnet new "$sample" - dotnet restore - dotnet build - set +e - cd .. || exit - rm -rf "$sdk" -} - -set -e - -for latest_package in ${LATEST_DOTNET_PACKAGES[@]}; do - echo "Determing if .NET Core ($latest_package) is installed" - if ! IsInstalled $latest_package; then - echo "Could not find .NET Core ($latest_package), installing..." - apt-get install $latest_package -y - else - echo ".NET Core ($latest_package) is already installed" - fi -done - -# Get list of all released SDKs from channels which are not end-of-life or preview -release_urls=("https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/2.1/releases.json" "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/2.2/releases.json" "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/3.0/releases.json" "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/3.1/releases.json") -sdks=() -for release_url in ${release_urls[@]}; do - echo "${release_url}" - releases=$(curl "${release_url}") - sdks=("${sdks[@]}" $(echo "${releases}" | jq '.releases[]' | jq '.sdk.version')) - sdks=("${sdks[@]}" $(echo "${releases}" | jq '.releases[]' | jq '.sdks[]?' | jq '.version')) -done - -sortedSdks=$(echo ${sdks[@]} | tr ' ' '\n' | grep -v preview | grep -v rc | grep -v display | cut -d\" -f2 | sort -u -r) - -for sdk in $sortedSdks; do - url="https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$sdk/dotnet-sdk-$sdk-linux-x64.tar.gz" - echo "$url" >> urls - echo "Adding $url to list to download later" -done - -# Download additional SDKs -echo "Downloading release tarballs..." -cat urls | xargs -n 1 -P 16 wget -q -for tarball in *.tar.gz; do - dest="./tmp-$(basename -s .tar.gz $tarball)" - echo "Extracting $tarball to $dest" - mkdir "$dest" && tar -C "$dest" -xzf "$tarball" - rsync -qav "$dest/shared/" /usr/share/dotnet/shared/ - rsync -qav "$dest/host/" /usr/share/dotnet/host/ - rsync -qav "$dest/sdk/" /usr/share/dotnet/sdk/ - rm -rf "$dest" - rm "$tarball" -done -rm urls - -DocumentInstalledItem ".NET Core SDK:" -# Smoke test each SDK -for sdk in $sortedSdks; do - mksamples "$sdk" "console" - mksamples "$sdk" "mstest" - mksamples "$sdk" "xunit" - mksamples "$sdk" "web" - mksamples "$sdk" "mvc" - mksamples "$sdk" "webapi" - DocumentInstalledItemIndent "$sdk" -done - -# NuGetFallbackFolder at /usr/share/dotnet/sdk/NuGetFallbackFolder is warmed up by smoke test -# Additional FTE will just copy to ~/.dotnet/NuGet which provides no benefit on a fungible machine -echo "DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1" | tee -a /etc/environment -echo 'export PATH="$PATH:$HOME/.dotnet/tools"' | tee -a /etc/skel/.bashrc diff --git a/images/linux/scripts/installers/1604/powershellcore.sh b/images/linux/scripts/installers/1604/powershellcore.sh index 8ace4742c..5c615ae31 100644 --- a/images/linux/scripts/installers/1604/powershellcore.sh +++ b/images/linux/scripts/installers/1604/powershellcore.sh @@ -7,8 +7,6 @@ # Source the helpers for use with the script source $HELPER_SCRIPTS/document.sh -LSB_RELEASE=$(lsb_release -rs) - # Install Powershell apt-get install -y powershell diff --git a/images/linux/scripts/installers/1804/azpowershell.sh b/images/linux/scripts/installers/1804/azpowershell.sh deleted file mode 100644 index 73d229458..000000000 --- a/images/linux/scripts/installers/1804/azpowershell.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -################################################################################ -## File: azpowershell.sh -## Desc: Installed Azure PowerShell -################################################################################ - -# Source the helpers for use with the script -source $HELPER_SCRIPTS/document.sh - -# Install Azure CLI (instructions taken from https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) -sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_1.0.0 -RequiredVersion 1.0.0 -Force' -sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_1.6.0 -RequiredVersion 1.6.0 -Force' -sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_2.3.2 -RequiredVersion 2.3.2 -Force' -sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_2.6.0 -RequiredVersion 2.6.0 -Force' -sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_2.8.0 -RequiredVersion 2.8.0 -Force' -sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_3.1.0 -RequiredVersion 3.1.0 -Force' - -# Run tests to determine that the software installed as expected -echo "Testing to make sure that script performed as expected, and basic scenarios work" -if ! pwsh -Command '$actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_1.0.0:" + $env:PSModulePath; - if (!(get-module -listavailable -name Az.accounts)) { - Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 - } - $env:PSModulePath = $actualPSModulePath - $actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_1.6.0:" + $env:PSModulePath; - if (!(get-module -listavailable -name Az.accounts)) { - Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 - } - $env:PSModulePath = $actualPSModulePath - $actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_2.3.2:" + $env:PSModulePath; - if (!(get-module -listavailable -name Az.accounts)) { - Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 - } - $env:PSModulePath = $actualPSModulePath - $actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_2.6.0:" + $env:PSModulePath; - if (!(get-module -listavailable -name Az.accounts)) { - Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 - } - $env:PSModulePath = $actualPSModulePath - $actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_2.8.0:" + $env:PSModulePath; - if (!(get-module -listavailable -name Az.accounts)) { - Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 - } - $env:PSModulePath = $actualPSModulePath - $actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_3.1.0:" + $env:PSModulePath; - if (!(get-module -listavailable -name Az.accounts)) { - Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 - } - $env:PSModulePath = $actualPSModulePath'; then - exit 1 -fi - -# Document what was added to the image -echo "Lastly, documenting what we added to the metadata file" -DocumentInstalledItem "Az Module (1.0.0)" -DocumentInstalledItem "Az Module (1.6.0)" -DocumentInstalledItem "Az Module (2.3.2)" -DocumentInstalledItem "Az Module (2.6.0)" -DocumentInstalledItem "Az Module (2.8.0)" -DocumentInstalledItem "Az Module (3.1.0)" \ No newline at end of file diff --git a/images/linux/scripts/installers/1804/basic.sh b/images/linux/scripts/installers/1804/basic.sh index 043400f8b..c12c7a819 100644 --- a/images/linux/scripts/installers/1804/basic.sh +++ b/images/linux/scripts/installers/1804/basic.sh @@ -58,6 +58,9 @@ apt-get install -y --no-install-recommends telnet echo "Install time" apt-get install -y --no-install-recommends time +echo "Install tzdata" +apt-get install -y --no-install-recommends tzdata + echo "Install unzip" apt-get install -y --no-install-recommends unzip @@ -70,8 +73,8 @@ apt-get install -y --no-install-recommends wget echo "Install zip" apt-get install -y --no-install-recommends zip -echo "Install tzdata" -apt-get install -y --no-install-recommends tzdata +echo "Install zstd" +apt-get install -y --no-install-recommends zstd echo "Install libxkbfile" apt-get install -y --no-install-recommends libxkbfile-dev @@ -155,8 +158,9 @@ DocumentInstalledItemIndent "shellcheck" DocumentInstalledItemIndent "sudo" DocumentInstalledItemIndent "telnet" DocumentInstalledItemIndent "time" +DocumentInstalledItemIndent "tzdata" DocumentInstalledItemIndent "unzip" DocumentInstalledItemIndent "upx" DocumentInstalledItemIndent "wget" DocumentInstalledItemIndent "zip" -DocumentInstalledItemIndent "tzdata" +DocumentInstalledItemIndent "zstd" diff --git a/images/linux/scripts/installers/1804/powershellcore.sh b/images/linux/scripts/installers/1804/powershellcore.sh index 0a5f21081..2f1922493 100644 --- a/images/linux/scripts/installers/1804/powershellcore.sh +++ b/images/linux/scripts/installers/1804/powershellcore.sh @@ -7,14 +7,14 @@ # Source the helpers for use with the script source $HELPER_SCRIPTS/document.sh -LSB_RELEASE=$(lsb_release -rs) +# libicu64, which comes with php-intl module, has powershell breaking issue https://github.com/PowerShell/PowerShell/issues/9746 +# Fix - install additional libicu65 where the issue is fixed +echo "install libicu65" +apt get install libicu65 # Install Powershell apt-get install -y powershell -# Temp fix based on: https://github.com/PowerShell/PowerShell/issues/9746 -sudo apt remove libicu64 - # Run tests to determine that the software installed as expected echo "Testing to make sure that script performed as expected, and basic scenarios work" if ! command -v pwsh; then diff --git a/images/linux/scripts/installers/1604/azpowershell.sh b/images/linux/scripts/installers/azpowershell.sh similarity index 86% rename from images/linux/scripts/installers/1604/azpowershell.sh rename to images/linux/scripts/installers/azpowershell.sh index 74503d1eb..1e87d9b1e 100644 --- a/images/linux/scripts/installers/1604/azpowershell.sh +++ b/images/linux/scripts/installers/azpowershell.sh @@ -14,6 +14,7 @@ sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_2.3.2 -Requi sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_2.6.0 -RequiredVersion 2.6.0 -Force' sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_2.8.0 -RequiredVersion 2.8.0 -Force' sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_3.1.0 -RequiredVersion 3.1.0 -Force' +sudo pwsh -Command 'Save-Module -Name Az -LiteralPath /usr/share/az_3.5.0 -RequiredVersion 3.5.0 -Force' # Run tests to determine that the software installed as expected echo "Testing to make sure that script performed as expected, and basic scenarios work" @@ -46,6 +47,11 @@ if ! pwsh -Command '$actualPSModulePath = $env:PSModulePath ; $env:PSModulePath if (!(get-module -listavailable -name Az.accounts)) { Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 } + $env:PSModulePath = $actualPSModulePath + $actualPSModulePath = $env:PSModulePath ; $env:PSModulePath = "/usr/share/az_3.5.0:" + $env:PSModulePath; + if (!(get-module -listavailable -name Az.accounts)) { + Write-Host "Az Module was not installed"; $env:PSModulePath = $actualPSModulePath; exit 1 + } $env:PSModulePath = $actualPSModulePath'; then exit 1 fi @@ -58,3 +64,4 @@ DocumentInstalledItem "Az Module (2.3.2)" DocumentInstalledItem "Az Module (2.6.0)" DocumentInstalledItem "Az Module (2.8.0)" DocumentInstalledItem "Az Module (3.1.0)" +DocumentInstalledItem "Az Module (3.5.0)" diff --git a/images/linux/scripts/installers/azure-cli.sh b/images/linux/scripts/installers/azure-cli.sh index 665a188a8..713d23151 100644 --- a/images/linux/scripts/installers/azure-cli.sh +++ b/images/linux/scripts/installers/azure-cli.sh @@ -7,13 +7,8 @@ # Source the helpers for use with the script source $HELPER_SCRIPTS/document.sh -LSB_CODENAME=$(lsb_release -cs) - # Install Azure CLI (instructions taken from https://docs.microsoft.com/en-us/cli/azure/install-azure-cli) -echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $LSB_CODENAME main" | tee /etc/apt/sources.list.d/azure-cli.list -apt-key adv --keyserver packages.microsoft.com --recv-keys B02C46DF417A0893 -apt-get update -apt-get install -y --no-install-recommends apt-transport-https azure-cli +curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash # Run tests to determine that the software installed as expected echo "Testing to make sure that script performed as expected, and basic scenarios work" diff --git a/images/linux/scripts/installers/azure-devops-cli.sh b/images/linux/scripts/installers/azure-devops-cli.sh index 2529c53c2..e709243d6 100644 --- a/images/linux/scripts/installers/azure-devops-cli.sh +++ b/images/linux/scripts/installers/azure-devops-cli.sh @@ -7,6 +7,11 @@ # Source the helpers for use with the script source $HELPER_SCRIPTS/document.sh +# AZURE_EXTENSION_DIR shell variable defines where modules are installed +# https://docs.microsoft.com/en-us/cli/azure/azure-cli-extensions-overview +export AZURE_EXTENSION_DIR=/opt/az/azcliextensions +echo "AZURE_EXTENSION_DIR=$AZURE_EXTENSION_DIR" | tee -a /etc/environment + # install azure devops Cli extension az extension add -n azure-devops diff --git a/images/linux/scripts/installers/docker-moby.sh b/images/linux/scripts/installers/docker-moby.sh index 90eb04c33..312be56fd 100644 --- a/images/linux/scripts/installers/docker-moby.sh +++ b/images/linux/scripts/installers/docker-moby.sh @@ -15,10 +15,6 @@ if ! IsInstalled $docker_package; then echo "Docker ($docker_package) was not found. Installing..." apt-get remove -y moby-engine moby-cli apt-get update - apt-get install -y apt-transport-https ca-certificates curl software-properties-common - curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - - curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/microsoft-prod.list - apt-get update apt-get install -y moby-engine moby-cli else echo "Docker ($docker_package) is already installed" diff --git a/images/linux/scripts/installers/1804/dotnetcore-sdk.sh b/images/linux/scripts/installers/dotnetcore-sdk.sh similarity index 85% rename from images/linux/scripts/installers/1804/dotnetcore-sdk.sh rename to images/linux/scripts/installers/dotnetcore-sdk.sh index d1fb73ec3..d0e138103 100644 --- a/images/linux/scripts/installers/1804/dotnetcore-sdk.sh +++ b/images/linux/scripts/installers/dotnetcore-sdk.sh @@ -3,7 +3,6 @@ ## File: dotnetcore-sdk.sh ## Desc: Installs .NET Core SDK ################################################################################ - source $HELPER_SCRIPTS/apt.sh source $HELPER_SCRIPTS/document.sh @@ -37,12 +36,12 @@ for latest_package in ${LATEST_DOTNET_PACKAGES[@]}; do echo "Determing if .NET Core ($latest_package) is installed" if ! IsInstalled $latest_package; then echo "Could not find .NET Core ($latest_package), installing..." - curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg - mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg - sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-bionic-prod bionic main" > /etc/apt/sources.list.d/dotnetdev.list' - apt-get install apt-transport-https - apt-get update - apt-get install $latest_package -y + #temporary avoid 3.1.102 installation due to https://github.com/dotnet/aspnetcore/issues/19133 + if [ $latest_package != "dotnet-sdk-3.1" ]; then + apt-get install $latest_package -y + else + apt-get install dotnet-sdk-3.1=3.1.101-1 -y + fi else echo ".NET Core ($latest_package) is already installed" fi @@ -58,7 +57,8 @@ for release_url in ${release_urls[@]}; do sdks=("${sdks[@]}" $(echo "${releases}" | jq '.releases[]' | jq '.sdks[]?' | jq '.version')) done -sortedSdks=$(echo ${sdks[@]} | tr ' ' '\n' | grep -v preview | grep -v rc | grep -v display | cut -d\" -f2 | sort -u -r) +#temporary avoid 3.1.102 installation due to https://github.com/dotnet/aspnetcore/issues/19133 +sortedSdks=$(echo ${sdks[@]} | tr ' ' '\n' | grep -v 3.1.102 | grep -v preview | grep -v rc | grep -v display | cut -d\" -f2 | sort -u -r) for sdk in $sortedSdks; do url="https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$sdk/dotnet-sdk-$sdk-linux-x64.tar.gz" diff --git a/images/linux/scripts/installers/julia.sh b/images/linux/scripts/installers/julia.sh new file mode 100644 index 000000000..1ca450320 --- /dev/null +++ b/images/linux/scripts/installers/julia.sh @@ -0,0 +1,62 @@ +#!/bin/bash +################################################################################ +## File: julia.sh +## Desc: Installs Julia, and adds Julia to the path +################################################################################ + +# Source the helpers for use with the script +source $HELPER_SCRIPTS/document.sh + +# This function fetches the latest Julia release from the GitHub API +# Based on https://gist.github.com/lukechilds/a83e1d7127b78fef38c2914c4ececc3c +function GetLatestJuliaRelease () { + curl --silent "https://api.github.com/repos/julialang/julia/releases/latest" | + grep '"tag_name":' | + sed -E 's/.*"([^"]+)".*/\1/' | + sed 's/v//' # remove v prefix +} + + +# This function installs Julia using the specified arguments: +# $1=MajorAndMinorVersion (1.3.1) +# $2=IsDefaultVersion (true or false) + +function InstallJulia () { + # Extract Major and Minor version from full version string + juliaMajorAndMinorVersion="$(sed 's/\.[^.]*$//' <<< $1)" + + curl -sL "https://julialang-s3.julialang.org/bin/linux/x64/$juliaMajorAndMinorVersion/julia-$1-linux-x86_64.tar.gz" -o "julia-$1-linux-x86_64.tar.gz" + mkdir -p "/usr/local/julia$juliaMajorAndMinorVersion" + tar -C "/usr/local/julia$juliaMajorAndMinorVersion" -xzf "julia-$1-linux-x86_64.tar.gz" --strip-components=1 julia + rm "julia-$1-linux-x86_64.tar.gz" + + # If this version of Julia is to be the default version, + # symlink it into the path + if [ "$2" = true ]; then + ln -s "/usr/local/julia$juliaMajorAndMinorVersion/bin/julia" /usr/bin/julia + fi + + # Run tests to determine that the software installed as expected + echo "Testing to make sure that script performed as expected, and basic scenarios work" + + # If this version of Julia is to be the default version, + # check that it has been added to PATH + if [ "$2" = true ]; then + if ! command -v julia; then + echo "Julia was not installed or found on PATH" + exit 1 + fi + fi + + # Verify output of julia --version + if [ ! "$(/usr/local/julia"$juliaMajorAndMinorVersion"/bin/julia --version)" = "julia version $1" ]; then + echo "Julia was not installed correctly" + exit 1 + fi + + # Document what was added to the image + echo "Lastly, documenting what we added to the metadata file" + DocumentInstalledItem "Julia ($(julia --version))" +} + +InstallJulia "$(GetLatestJuliaRelease)" true diff --git a/images/linux/ubuntu1604.json b/images/linux/ubuntu1604.json index ae2ac159e..e303746be 100644 --- a/images/linux/ubuntu1604.json +++ b/images/linux/ubuntu1604.json @@ -131,7 +131,7 @@ "{{template_dir}}/scripts/installers/docker-compose.sh", "{{template_dir}}/scripts/installers/docker-moby.sh", "{{template_dir}}/scripts/installers/docker.sh", - "{{template_dir}}/scripts/installers/1604/dotnetcore-sdk.sh", + "{{template_dir}}/scripts/installers/dotnetcore-sdk.sh", "{{template_dir}}/scripts/installers/erlang.sh", "{{template_dir}}/scripts/installers/firefox.sh", "{{template_dir}}/scripts/installers/gcc.sh", @@ -186,7 +186,7 @@ "type": "shell", "scripts":[ "{{template_dir}}/scripts/installers/1604/android.sh", - "{{template_dir}}/scripts/installers/1604/azpowershell.sh", + "{{template_dir}}/scripts/installers/azpowershell.sh", "{{template_dir}}/scripts/helpers/containercache.sh", "{{template_dir}}/scripts/installers/hosted-tool-cache.sh", "{{template_dir}}/scripts/installers/python.sh", diff --git a/images/linux/ubuntu1804.json b/images/linux/ubuntu1804.json index 3c7ce3279..1492d4b54 100644 --- a/images/linux/ubuntu1804.json +++ b/images/linux/ubuntu1804.json @@ -134,7 +134,7 @@ "{{template_dir}}/scripts/installers/docker-compose.sh", "{{template_dir}}/scripts/installers/docker-moby.sh", "{{template_dir}}/scripts/installers/docker.sh", - "{{template_dir}}/scripts/installers/1804/dotnetcore-sdk.sh", + "{{template_dir}}/scripts/installers/dotnetcore-sdk.sh", "{{template_dir}}/scripts/installers/erlang.sh", "{{template_dir}}/scripts/installers/firefox.sh", "{{template_dir}}/scripts/installers/gcc.sh", @@ -188,7 +188,7 @@ "type": "shell", "scripts":[ "{{template_dir}}/scripts/installers/1804/android.sh", - "{{template_dir}}/scripts/installers/1804/azpowershell.sh", + "{{template_dir}}/scripts/installers/azpowershell.sh", "{{template_dir}}/scripts/helpers/containercache.sh", "{{template_dir}}/scripts/installers/hosted-tool-cache.sh", "{{template_dir}}/scripts/installers/python.sh", diff --git a/images/win/Windows2016-Azure.json b/images/win/Windows2016-Azure.json index aed834d57..60d72a9d3 100644 --- a/images/win/Windows2016-Azure.json +++ b/images/win/Windows2016-Azure.json @@ -504,6 +504,12 @@ "{{ template_dir }}/scripts/Installers/Install-Jq.ps1" ] }, + { + "type": "powershell", + "scripts":[ + "{{ template_dir }}/scripts/Installers/Install-Zstd.ps1" + ] + }, { "type": "powershell", "scripts":[ @@ -765,6 +771,12 @@ "{{ template_dir }}/scripts/Installers/Validate-Jq.ps1" ] }, + { + "type": "powershell", + "scripts":[ + "{{ template_dir }}/scripts/Installers/Validate-Zstd.ps1" + ] + }, { "type": "powershell", "scripts":[ diff --git a/images/win/Windows2016-Readme.md b/images/win/Windows2016-Readme.md index 7bf8c199b..688cd1de7 100644 --- a/images/win/Windows2016-Readme.md +++ b/images/win/Windows2016-Readme.md @@ -1,6 +1,6 @@ # Windows Server 2016 -The following software is installed on machines with the 20200211.1 update. +The following software is installed on machines with the 20200217.1 update. Components marked with **\*** have been upgraded since the previous version of the image. @@ -19,7 +19,7 @@ _Environment:_ ## Docker-compose -_Version:_ 1.25.3
+_Version:_ 1.25.4
_Environment:_ * PATH: contains location of docker-compose.exe @@ -30,9 +30,9 @@ _Version:_ 6.2.4
## Docker images The following container images have been cached: -* mcr.microsoft.com/windows/servercore:ltsc2016 (Digest: sha256:10ea07b6576daae149fe5ec7d0dddc8da673f77d171e2143addeae0b5577a12e) * mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsservercore-ltsc2016 (Digest: sha256:a1bd1a6dc00f2734b5071b9295f715f36a653e4b2d259c1a4a4d9e8cd6f3ade8) * mcr.microsoft.com/dotnet/framework/runtime:4.8-windowsservercore-ltsc2016 (Digest: sha256:7e81f462be36ba1362062306426c65547e6d63b2eab0b5583808581081393a79) +* mcr.microsoft.com/windows/servercore:ltsc2016 (Digest: sha256:42be24b8810c861cc1b3fe75c5e99f75061cb45fdbae1de46d151c18cc8e6a9a) * microsoft/aspnetcore-build:1.0-2.0 (Digest: sha256:9ecc7c5a8a7a11dca5f08c860165646cb30d084606360a3a72b9cbe447241c0c) * mcr.microsoft.com/windows/nanoserver:10.0.14393.953 (Digest: sha256:fc60bd5ae0e61b334ce1cf1bcbf20c10c36b4c5482a01da319c9c989f9e6e268) @@ -482,12 +482,12 @@ _Environment:_ ## Google Chrome _version:_ -80.0.3987.100 +80.0.3987.106 ## Microsoft Edge _version:_ -80.0.361.50 +80.0.361.54 ## Mozilla Firefox @@ -516,7 +516,7 @@ _Environment:_ #### IE Driver _version:_ -80.0.3987.16 +80.0.3987.106 _Environment:_ * IEWebDriver: location of IEDriverServer.exe @@ -532,7 +532,7 @@ _Environment:_ ## Node.js -_Version:_ 12.15.0
+_Version:_ 12.16.0
_Architecture:_ x64
_Environment:_ * PATH: contains location of node.exe
diff --git a/images/win/scripts/Installers/Install-DotnetSDK.ps1 b/images/win/scripts/Installers/Install-DotnetSDK.ps1 index f7c9a9e23..996887885 100644 --- a/images/win/scripts/Installers/Install-DotnetSDK.ps1 +++ b/images/win/scripts/Installers/Install-DotnetSDK.ps1 @@ -66,7 +66,8 @@ function InstallAllValidSdks() Invoke-WebRequest -Uri $dotnetChannel.'releases.json' -UseBasicParsing -OutFile "releases-$channelVersion.json" $currentReleases = Get-Content -Path "releases-$channelVersion.json" | ConvertFrom-Json # filtering out the preview/rc releases - $currentReleases = $currentReleases.'releases' | Where-Object { !$_.'release-version'.Contains('-') } | Sort-Object { [Version] $_.'release-version' } + # Remove version 3.1.102 from install list, .NET gave a heads-up that this might cause issues and they are working on a fix. https://github.com/dotnet/aspnetcore/issues/19133 + $currentReleases = $currentReleases.'releases' | Where-Object { !$_.'release-version'.Contains('-') -and !$_.'release-version'.Contains('3.1.2') } | Sort-Object { [Version] $_.'release-version' } ForEach ($release in $currentReleases) { if ($release.'sdks'.Count -gt 0) @@ -77,6 +78,7 @@ function InstallAllValidSdks() # Remove duplicate entries & preview/rc version from download list # Sort the sdks on version $sdks = @($release.'sdk'); + $sdks += $release.'sdks' | Where-Object { !$_.'version'.Contains('-') -and !$_.'version'.Equals($release.'sdk'.'version') } $sdks = $sdks | Sort-Object { [Version] $_.'version' } diff --git a/images/win/scripts/Installers/Install-JavaTools.ps1 b/images/win/scripts/Installers/Install-JavaTools.ps1 index 7b8cdd135..68c0209fd 100644 --- a/images/win/scripts/Installers/Install-JavaTools.ps1 +++ b/images/win/scripts/Installers/Install-JavaTools.ps1 @@ -62,7 +62,7 @@ setx JAVA_HOME_11_X64 $latestJava11Install /M # Install Java tools # Force chocolatey to ignore dependencies on Ant and Maven or else they will download the Oracle JDK choco install ant -y -i -choco install maven -y -i --version=3.6.2 +choco install maven -y -i --version=3.6.3 choco install gradle -y # Move maven variables to Machine. They may not be in the environment for this script so we need to read them from the registry. diff --git a/images/win/scripts/Installers/Install-Julia.ps1 b/images/win/scripts/Installers/Install-Julia.ps1 new file mode 100644 index 000000000..90547472b --- /dev/null +++ b/images/win/scripts/Installers/Install-Julia.ps1 @@ -0,0 +1,6 @@ +################################################################################ +## File: Install-Julia.ps1 +## Desc: Install Julia +################################################################################ + +choco install julia -y --ia "/D=C:\Julia" diff --git a/images/win/scripts/Installers/Install-Zstd.ps1 b/images/win/scripts/Installers/Install-Zstd.ps1 new file mode 100644 index 000000000..098334ebe --- /dev/null +++ b/images/win/scripts/Installers/Install-Zstd.ps1 @@ -0,0 +1,6 @@ +################################################################################ +## File: Install-zstd.ps1 +## Desc: Install zstd +################################################################################ + +choco install zstandard -y diff --git a/images/win/scripts/Installers/Validate-DACFx.ps1 b/images/win/scripts/Installers/Validate-DACFx.ps1 index fb815c10e..c7def3ef4 100644 --- a/images/win/scripts/Installers/Validate-DACFx.ps1 +++ b/images/win/scripts/Installers/Validate-DACFx.ps1 @@ -15,6 +15,15 @@ else throw "DACFx is not installed!" } +if(Get-Command -Name 'SqlLocalDB') +{ + $localDbPath = (Get-Command -Name 'SqlLocalDB').Source +} +else +{ + throw "SqlLocalDB is not installed!" +} + function Get-DacFxVersion { $regKey = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Data-Tier Application Framework\CurrentVersion" @@ -28,6 +37,7 @@ $SoftwareName = "SQL Server Data Tier Application Framework (x64)" $Description = @" _Version:_ $(Get-DacFxVersion)
+* SQL Server Express LocalDB is available at $localDbPath "@ Add-SoftwareDetailsToMarkdown -SoftwareName $SoftwareName -DescriptionMarkdown $Description diff --git a/images/win/scripts/Installers/Validate-Julia.ps1 b/images/win/scripts/Installers/Validate-Julia.ps1 new file mode 100644 index 000000000..e31bd39f6 --- /dev/null +++ b/images/win/scripts/Installers/Validate-Julia.ps1 @@ -0,0 +1,25 @@ +################################################################################ +## File: Validate-Julia.ps1 +## Desc: Validate Julia +################################################################################ + +# Verify that julia.exe is on the path +if(Get-Command -Name 'julia') +{ + Write-Host "$(julia --version) is on the path." +} +else +{ + Write-Host "Julia is not on the path." + exit 1 +} + +# Add description of the software to Markdown +$SoftwareName = "Julia (x64)" +$juliaVersion = $(julia --version).split() -match "\d+\.\d+\.\d+" + +$Description = @" +_Version:_ $juliaVersion
+"@ + +Add-SoftwareDetailsToMarkdown -SoftwareName $SoftwareName -DescriptionMarkdown $Description diff --git a/images/win/scripts/Installers/Validate-Zstd.ps1 b/images/win/scripts/Installers/Validate-Zstd.ps1 new file mode 100644 index 000000000..18f3a3343 --- /dev/null +++ b/images/win/scripts/Installers/Validate-Zstd.ps1 @@ -0,0 +1,24 @@ +################################################################################ +## File: Validate-zstd.ps1 +## Desc: Validate zstd +################################################################################ + +if (Get-Command -Name 'zstd') +{ + Write-Host "zstd on path" +} +else +{ + Write-Host 'zstd is not on path' + exit 1 +} + +# Adding description of the software to Markdown +$SoftwareName = "zstd" +$zstdVersion = $(zstd --version).Split(' ')[6].Split(',')[0] + +$Description = @" +_Version:_ $zstdVersion
+"@ + +Add-SoftwareDetailsToMarkdown -SoftwareName $SoftwareName -DescriptionMarkdown $Description