diff --git a/.dependabot/config.yml b/.dependabot/config.yml index 8f7a4d5e1..501804a21 100644 --- a/.dependabot/config.yml +++ b/.dependabot/config.yml @@ -4,7 +4,7 @@ version: 1 update_configs: - package_manager: "docker" - directory: "/release/preview/alpine/dependabot" + directory: "/release/preview/alpine39/dependabot" update_schedule: "daily" - package_manager: "docker" @@ -16,7 +16,7 @@ update_configs: update_schedule: "daily" - package_manager: "docker" - directory: "/release/preview/fedora28/dependabot" + directory: "/release/preview/fedora/dependabot" update_schedule: "daily" - package_manager: "docker" diff --git a/build.ps1 b/build.ps1 index 13610a28e..4b901c8d4 100644 --- a/build.ps1 +++ b/build.ps1 @@ -441,11 +441,11 @@ End { if($GenerateTagsYaml.IsPresent) { Write-Output "repos:" - foreach($repo in $tagGroups.Keys) + foreach($repo in $tagGroups.Keys | Sort-Object) { Write-Output " - repoName: $repo" Write-Output " tagGroups:" - foreach($tag in $tagGroups.$repo) + foreach($tag in $tagGroups.$repo | Sort-Object -Property dockerfile) { Write-Output " - tags: [$($tag.Tags -join ', ')]" Write-Output " osVersion: $($tag.osVersion)" diff --git a/release/preview/alpine/docker/Dockerfile b/release/preview/alpine38/docker/Dockerfile similarity index 100% rename from release/preview/alpine/docker/Dockerfile rename to release/preview/alpine38/docker/Dockerfile diff --git a/release/preview/alpine/getLatestTag.ps1 b/release/preview/alpine38/getLatestTag.ps1 similarity index 72% rename from release/preview/alpine/getLatestTag.ps1 rename to release/preview/alpine38/getLatestTag.ps1 index 16be03136..bc836c038 100644 --- a/release/preview/alpine/getLatestTag.ps1 +++ b/release/preview/alpine38/getLatestTag.ps1 @@ -1,9 +1,9 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -# return objects representing the tags we need to base the xenial image on +# return objects representing the tags we need to base the Alpine image on -# The versions of xenial we care about +# The versions of Alpine we care about, for this dockerfile $shortTags = @('3.8') $parent = Join-Path -Path $PSScriptRoot -ChildPath '..' @@ -11,4 +11,4 @@ $repoRoot = Join-Path -path (Join-Path -Path $parent -ChildPath '..') -ChildPath $modulePath = Join-Path -Path $repoRoot -ChildPath 'tools\getDockerTags' Import-Module $modulePath -Get-DockerTags -ShortTags $shortTags -Image "alpine" -FullTagFilter '^3.8$' -OnlyShortTags +Get-DockerTags -ShortTags $shortTags -Image "alpine" -FullTagFilter '^3.\d$' -OnlyShortTags diff --git a/release/preview/alpine/meta.json b/release/preview/alpine38/meta.json similarity index 100% rename from release/preview/alpine/meta.json rename to release/preview/alpine38/meta.json diff --git a/release/preview/alpine/test-deps/docker/Dockerfile b/release/preview/alpine38/test-deps/docker/Dockerfile similarity index 100% rename from release/preview/alpine/test-deps/docker/Dockerfile rename to release/preview/alpine38/test-deps/docker/Dockerfile diff --git a/release/preview/alpine/test-deps/meta.json b/release/preview/alpine38/test-deps/meta.json similarity index 100% rename from release/preview/alpine/test-deps/meta.json rename to release/preview/alpine38/test-deps/meta.json diff --git a/release/preview/alpine/dependabot/Dockerfile b/release/preview/alpine39/dependabot/Dockerfile similarity index 88% rename from release/preview/alpine/dependabot/Dockerfile rename to release/preview/alpine39/dependabot/Dockerfile index 5ef7a1e2e..cf026e7c3 100644 --- a/release/preview/alpine/dependabot/Dockerfile +++ b/release/preview/alpine39/dependabot/Dockerfile @@ -3,4 +3,4 @@ # Dummy docker image to trigger dependabot PRs -FROM alpine:3.8 +FROM alpine:3.10.0 diff --git a/release/preview/alpine39/docker/Dockerfile b/release/preview/alpine39/docker/Dockerfile new file mode 100644 index 000000000..4c2a5b4e3 --- /dev/null +++ b/release/preview/alpine39/docker/Dockerfile @@ -0,0 +1,109 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +# Docker image file that describes an Alpine3.x image with PowerShell installed from .tar.gz file(s) + +# Define arg(s) needed for the From statement +ARG fromTag=3.9 +ARG imageRepo=alpine + +FROM ${imageRepo}:${fromTag} AS installer-env + +# Define Args for the needed to add the package +ARG PS_VERSION=6.2.0-preview.3 +ARG PS_PACKAGE=powershell-${PS_VERSION}-linux-alpine-x64.tar.gz +ARG PS_PACKAGE_URL=https://github.com/PowerShell/PowerShell/releases/download/v${PS_VERSION}/${PS_PACKAGE} +ARG PS_INSTALL_VERSION=7-preview + +# Download the Linux tar.gz and save it +ADD ${PS_PACKAGE_URL} /tmp/linux.tar.gz + +# define the folder we will be installing PowerShell to +ENV PS_INSTALL_FOLDER=/opt/microsoft/powershell/$PS_INSTALL_VERSION + +# Create the install folder +RUN mkdir -p ${PS_INSTALL_FOLDER} + +# Unzip the Linux tar.gz +RUN tar zxf /tmp/linux.tar.gz -C ${PS_INSTALL_FOLDER} + +# Start a new stage so we lose all the tar.gz layers from the final image +FROM ${imageRepo}:${fromTag} + +# Copy only the files we need from the previous stage +COPY --from=installer-env ["/opt/microsoft/powershell", "/opt/microsoft/powershell"] + +# Define Args and Env needed to create links +ARG PS_INSTALL_VERSION=7-preview +ENV PS_INSTALL_FOLDER=/opt/microsoft/powershell/$PS_INSTALL_VERSION \ + \ + # Define ENVs for Localization/Globalization + DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false \ + LC_ALL=en_US.UTF-8 \ + LANG=en_US.UTF-8 \ + # set a fixed location for the Module analysis cache + PSModuleAnalysisCachePath=/var/cache/microsoft/powershell/PSModuleAnalysisCache/ModuleAnalysisCache + +# Install dotnet dependencies and ca-certificates +RUN apk add --no-cache \ + ca-certificates \ + less \ + \ + # PSReadline/console dependencies + ncurses-terminfo-base \ + \ + # .NET Core dependencies + krb5-libs \ + libgcc \ + libintl \ + libssl1.1 \ + libstdc++ \ + tzdata \ + userspace-rcu \ + zlib \ + icu-libs \ + && apk -X https://dl-cdn.alpinelinux.org/alpine/edge/main add --no-cache \ + lttng-ust \ + \ + # Create the pwsh symbolic link that points to powershell + && ln -s ${PS_INSTALL_FOLDER}/pwsh /usr/bin/pwsh \ + \ + # Create the pwsh-preview symbolic link that points to powershell + && ln -s ${PS_INSTALL_FOLDER}/pwsh /usr/bin/pwsh-preview \ + # Give all user execute permissions and remove write permissions for others + && chmod a+x,o-w ${PS_INSTALL_FOLDER}/pwsh \ + # intialize powershell module cache + && pwsh \ + -NoLogo \ + -NoProfile \ + -Command " \ + \$ErrorActionPreference = 'Stop' ; \ + \$ProgressPreference = 'SilentlyContinue' ; \ + while(!(Test-Path -Path \$env:PSModuleAnalysisCachePath)) { \ + Write-Host "'Waiting for $env:PSModuleAnalysisCachePath'" ; \ + Start-Sleep -Seconds 6 ; \ + }" + +# Define args needed only for the labels +ARG PS_VERSION=6.2.0-preview.2 +ARG IMAGE_NAME=mcr.microsoft.com/powershell:preview-alpine-3.8 +ARG VCS_REF="none" + +# Add label last as it's just metadata and uses a lot of parameters +LABEL maintainer="PowerShell Team " \ + readme.md="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" \ + description="This Dockerfile will install the latest release of PowerShell." \ + org.label-schema.usage="https://github.com/PowerShell/PowerShell/tree/master/docker#run-the-docker-image-you-built" \ + org.label-schema.url="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" \ + org.label-schema.vcs-url="https://github.com/PowerShell/PowerShell-Docker" \ + org.label-schema.name="powershell" \ + org.label-schema.vendor="PowerShell" \ + org.label-schema.vcs-ref=${VCS_REF} \ + org.label-schema.version=${PS_VERSION} \ + org.label-schema.schema-version="1.0" \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ + org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" + +CMD [ "pwsh" ] diff --git a/release/preview/alpine39/getLatestTag.ps1 b/release/preview/alpine39/getLatestTag.ps1 new file mode 100644 index 000000000..bab6f5f80 --- /dev/null +++ b/release/preview/alpine39/getLatestTag.ps1 @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +# return objects representing the tags we need to base the Alpine image on + +# The versions of Alpine we care about, for this dockerfile +$shortTags = @('3.9','3.10') + +$parent = Join-Path -Path $PSScriptRoot -ChildPath '..' +$repoRoot = Join-Path -path (Join-Path -Path $parent -ChildPath '..') -ChildPath '..' +$modulePath = Join-Path -Path $repoRoot -ChildPath 'tools\getDockerTags' +Import-Module $modulePath + +Get-DockerTags -ShortTags $shortTags -Image "alpine" -FullTagFilter '^3.\d\d?$' -OnlyShortTags diff --git a/release/preview/alpine39/meta.json b/release/preview/alpine39/meta.json new file mode 100644 index 000000000..85f6c8894 --- /dev/null +++ b/release/preview/alpine39/meta.json @@ -0,0 +1,15 @@ +{ + "IsLinux" : true, + "UseLinuxVersion": false, + "PackageFormat": "powershell-${PS_VERSION}-linux-alpine-x64.tar.gz", + "osVersion": "Alpine", + "tagTemplates": [ + "#psversion#-alpine-#tag#", + "preview-alpine-#shorttag#" + ], + "SkipGssNtlmSspTests": true, + "SubImage": "test-deps", + "TestProperties": { + "size": 165 + } +} diff --git a/release/preview/alpine39/test-deps/docker/Dockerfile b/release/preview/alpine39/test-deps/docker/Dockerfile new file mode 100644 index 000000000..f7bb8a2d4 --- /dev/null +++ b/release/preview/alpine39/test-deps/docker/Dockerfile @@ -0,0 +1,57 @@ +# Docker image file that describes an Alpine image with PowerShell and test dependencies + +ARG BaseImage=mcr.microsoft.com/powershell:alpine-3.9 + +FROM node:10.15.3-alpine as node + +# Do nothing, just added to borrow the already built node files. + +FROM ${BaseImage} + +ENV NODE_VERSION 10.15.3 +ENV YARN_VERSION=1.13.0 +ENV NVM_DIR="/root/.nvm" + +# workaround for Alpine to run in Azure DevOps +ENV NODE_NO_WARNINGS=1 + +# Copy node and yarn into image +COPY --from=node /usr/local/bin/node /usr/local/bin/node +COPY --from=node /opt/yarn-v${YARN_VERSION} /opt/yarn-v${YARN_VERSION} + +RUN apk add --no-cache --virtual .pipeline-deps readline linux-pam \ + && apk add \ + bash \ + sudo \ + shadow \ + openssl \ + curl \ + && apk del .pipeline-deps \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ + && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg + +# Define args needed only for the labels +ARG VCS_REF="none" +ARG IMAGE_NAME=mcr.microsoft.com/powershell/test-deps:alpine-3.8 +ARG PS_VERSION=6.2.0 + +LABEL maintainer="PowerShell Team " \ + readme.md="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" \ + description="This Dockerfile will install the latest release of PowerShell and tools needed for runing CI/CD container jobs." \ + org.label-schema.usage="https://github.com/PowerShell/PowerShell/tree/master/docker#run-the-docker-image-you-built" \ + org.label-schema.url="https://github.com/PowerShell/PowerShell/blob/master/docker/README.md" \ + org.label-schema.vcs-url="https://github.com/PowerShell/PowerShell-Docker" \ + org.label-schema.name="powershell" \ + org.label-schema.vendor="PowerShell" \ + org.label-schema.version=${PS_VERSION} \ + org.label-schema.schema-version="1.0" \ + org.label-schema.vcs-ref=${VCS_REF} \ + org.label-schema.docker.cmd="docker run ${IMAGE_NAME} pwsh -c '$psversiontable'" \ + org.label-schema.docker.cmd.devel="docker run ${IMAGE_NAME}" \ + org.label-schema.docker.cmd.test="docker run ${IMAGE_NAME} pwsh -c Invoke-Pester" \ + org.label-schema.docker.cmd.help="docker run ${IMAGE_NAME} pwsh -c Get-Help" \ + com.azure.dev.pipelines.agent.handler.node.path="/usr/local/bin/node" + +# Use PowerShell as the default shell +# Use array to avoid Docker prepending /bin/sh -c +CMD [ "pwsh" ] diff --git a/release/preview/alpine39/test-deps/meta.json b/release/preview/alpine39/test-deps/meta.json new file mode 100644 index 000000000..3a5779890 --- /dev/null +++ b/release/preview/alpine39/test-deps/meta.json @@ -0,0 +1,16 @@ +{ + "IsLinux" : true, + "UseLinuxVersion": false, + "SkipGssNtlmSspTests": true, + "osVersion": "Alpine ${fromTag}", + "tagTemplates": [ + "preview-alpine-#shorttag#" + ], + "OptionalTests": [ + "test-deps", + "test-deps-musl" + ], + "TestProperties": { + "size": 212 + } +} diff --git a/release/preview/fedora/meta.json b/release/preview/fedora/meta.json index b708d6835..17e89619f 100644 --- a/release/preview/fedora/meta.json +++ b/release/preview/fedora/meta.json @@ -2,7 +2,7 @@ "IsLinux" : true, "UseLinuxVersion": false, "PackageFormat": "powershell${previewTag}-${PS_VERSION}-1.rhel.7.x86_64.rpm", - "osVersion": "Fedora 28", + "osVersion": "Fedora", "SkipGssNtlmSspTests": false, "tagTemplates": [ "#psversion#-fedora-#tag#", diff --git a/release/preview/fedora/test-deps/meta.json b/release/preview/fedora/test-deps/meta.json index 50371938a..e59800f34 100644 --- a/release/preview/fedora/test-deps/meta.json +++ b/release/preview/fedora/test-deps/meta.json @@ -1,7 +1,7 @@ { "IsLinux" : true, "UseLinuxVersion": false, - "osVersion": "Fedora 28", + "osVersion": "Fedora ${fromTag}", "SkipGssNtlmSspTests": false, "tagTemplates": [ "preview-fedora-#shorttag#" diff --git a/vsts-ci.yml b/vsts-ci.yml index c19ca0c29..09de7ef12 100644 --- a/vsts-ci.yml +++ b/vsts-ci.yml @@ -57,6 +57,20 @@ jobs: name: alpine imagename: alpine stable: true + preview: false + +- template: .vsts-ci/phase.yml + parameters: + name: alpine38 + imagename: alpine38 + stable: false + preview: true + +- template: .vsts-ci/phase.yml + parameters: + name: alpine39 + imagename: alpine39 + stable: false preview: true - template: .vsts-ci/phase.yml