Williamhe/1854105 add dotnet8 preview7 (#2098)

* Revert "Add new dotnet SDK versions"

This reverts commit a45589e3a0.

* Create dotnet 8 image based on debian-bullseye-slim

* Update space

* Update image tag

* Add bookworm to dotnet runtime

* Add bookworm to dotnet sdk

* Add bookworm to dotnet sdk

* Add bookworm versionsToBuild

* Rename dockerfile

* Update runtime version

* Upadte dotnet8 image name

* Upadte dotnet8 image name

* Remove dependency

* Update dotnet monitor version

* Add openssl

* Remove cacertificate installation

* Update dockerfile

* Add bookworm dependency

* Update libicu

* Update libicu and libssl

* Update ca-certificate version

* Update build images

* Add dotnet8 sample app

* Add bookworm to tests

* Upgrade to dotnet8 preview7

* Add bookworm ostype

* Update generateDockerfile

* Update versions to build

* Restore newline

* Update runtime tag

* Update to bullseye

* Update to libicu

* Update to libicu

* Update to libicu

* Update certs

* Update certs

* Update to correct os

* Upadte libcurl

* Update base Dockerfile bookworm sdk and dotnet monitor

* Revert os

* Revert sdk version

* Revert libcurl version

* Remove sha

* Add note for dotnet monitor

* Add sha back

* Update default version

* Update supported bookworm versions

* Add bookworm in more places in vsts

* Add boomworm runtime for dotnet

* Update runtime tag

* Add bookworm to golang runtime image, since dotnet needs it when building runtime images, because runtime images are golang based

* Update runtime tag

* Update test to specify bookworm

* Update golang base iamge version to bookworm, since 1.18 is not compatible with bookworm

* Remove eol versions to avoid hitting memory space limit

* Test updating agent version. If this works I'll update the other pipelines

* Update the version of docker

* Revert "Test updating agent version. If this works I'll update the other pipelines"

This reverts commit 6537d83e1b.

* Remove duplicates

* Revert "Revert "Test updating agent version. If this works I'll update the other pipelines""

This reverts commit 3b2e7da7b8.

* Revert "Test updating agent version. If this works I'll update the other pipelines"

This reverts commit 6537d83e1b.

* Update docker for the remaining part of the Oryx repo

* Downgrade docker installation version, because now docker does not seem to be opening ports properly with the newer version. See corresponding commit log for more details

* Add logging

* Update docker version

* Update port mapping parsing

* Update port extraction

* Update runtime tag

---------

Co-authored-by: Wiktor Kopec <wiktork@microsoft.com>
This commit is contained in:
william-msft 2023-08-25 14:16:23 -07:00 коммит произвёл GitHub
Родитель 331d29afb0
Коммит ec53236cb1
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
85 изменённых файлов: 40366 добавлений и 73 удалений

1
.gitignore поставляемый
Просмотреть файл

@ -265,6 +265,7 @@ images/runtime/dotnetcore/*/Dockerfile
images/runtime/dotnetcore/*/buster.Dockerfile
images/runtime/dotnetcore/*/stretch.Dockerfile
images/runtime/dotnetcore/*/bullseye.Dockerfile
images/runtime/dotnetcore/*/bookworm.Dockerfile
images/runtime/python/*/Dockerfile
images/runtime/python/*/buster.Dockerfile
images/runtime/python/*/stretch.Dockerfile

Просмотреть файл

@ -1,6 +1,6 @@
# This file was auto-generated from 'constants.yaml'. Changes may be overridden.
DOT_NET_CORE_RUNTIME_BASE_TAG='20230823.2'
DOT_NET_CORE_RUNTIME_BASE_TAG='20230825.1'
NET_CORE_APP_10='1.0.16'
NET_CORE_APP_11='1.1.13'
NET_CORE_APP_20='2.0.9'
@ -30,3 +30,7 @@ NET_CORE_APP_70='7.0.10'
NET_CORE_APP_70_SHA='f15b6bf0ef0ce48901880bd89a5fa4b3ae6f6614ab416b23451567844448f2510cf5beeeef6c2ac33400ea013cda7b6d2a4477e7aa0f36461b94741161424c3e'
ASPNET_CORE_APP_70='7.0.10'
ASPNET_CORE_APP_70_SHA='580fdda88824bde6b2d5c09eb009fef64e89705a8aa096dc71338a549969842dff8d9f6d4bb4651e60b38e44ed0910ec18982a062b471ace18c2e22348de11ab'
NET_CORE_APP_80='8.0.0-preview.7.23375.6'
NET_CORE_APP_80_SHA='bfd8491550178b86a7a72fe06bdc82f0dd66771d5b60d7e4e1133cdde29f84bd57857d846722e027bd209db087123b2d12b2e23590d77991052269fa265814e1'
ASPNET_CORE_APP_80='8.0.0-preview.7.23375.9'
ASPNET_CORE_APP_80_SHA='b8c8a5cd579a8ee1e082363a73a05a745499365445f784e6ff87547f9acdbe8b7ba525140ef10555bc2802c13af131c2d568ec6af020bd0dd2fdf82d4c258442'

Просмотреть файл

@ -10,3 +10,4 @@ DOT_NET_50_SDK_VERSION='5.0.408'
DOT_NET_60_SDK_VERSION='6.0.413'
DOT_NET_60_RTM_SDK_VERSION='6-0-100-rtm-21527-11'
DOT_NET_70_SDK_VERSION='7.0.400'
DOT_NET_80_SDK_VERSION='8.0.100-preview.7.23376.3'

Просмотреть файл

@ -42,6 +42,7 @@ declare -r BUILD_IMAGES_GITHUB_RUNNERS_BUILDPACKDEPS_STRETCH_DOCKERFILE="$REPO_D
declare -r BUILD_IMAGES_GITHUB_RUNNERS_BUILDPACKDEPS_FOCAL_DOCKERFILE="$REPO_DIR/images/build/Dockerfiles/gitHubRunners.BuildPackDepsFocal.Dockerfile"
declare -r BUILD_IMAGES_GITHUB_RUNNERS_BUILDPACKDEPS_BUSTER_DOCKERFILE="$REPO_DIR/images/build/Dockerfiles/gitHubRunners.BuildPackDepsBuster.Dockerfile"
declare -r BUILD_IMAGES_GITHUB_RUNNERS_BUILDPACKDEPS_BULLSEYE_DOCKERFILE="$REPO_DIR/images/build/Dockerfiles/gitHubRunners.BuildPackDepsBullseye.Dockerfile"
declare -r BUILD_IMAGES_GITHUB_RUNNERS_BUILDPACKDEPS_BOOKWORM_DOCKERFILE="$REPO_DIR/images/build/Dockerfiles/gitHubRunners.BuildPackDepsBookworm.Dockerfile"
declare -r RUNTIME_BASE_IMAGE_DOCKERFILE_PATH="$RUNTIME_IMAGES_SRC_DIR/commonbase/Dockerfile"
declare -r RUNTIME_BASE_IMAGE_NAME="oryx-run-base"
declare -r RUNTIME_BUSTER_BASE_IMAGE_NAME="oryx-run-base-buster"

Просмотреть файл

@ -141,6 +141,14 @@ function buildGitHubRunnersBullseyeBaseImage() {
.
}
function buildGitHubRunnersBookwormBaseImage() {
echo
echo "----Building the image which uses GitHub runners' buildpackdeps-bookworm-scm specific digest----------"
docker build -t "oryxdevmcr.azurecr.io/private/oryx/githubrunners-buildpackdeps-bookworm" \
-f "$BUILD_IMAGES_GITHUB_RUNNERS_BUILDPACKDEPS_BOOKWORM_DOCKERFILE" \
.
}
function buildGitHubRunnersBusterBaseImage() {
echo
@ -163,6 +171,7 @@ function buildTemporaryFilesImage() {
buildGitHubRunnersBusterBaseImage
buildGitHubRunnersUbuntuBaseImage
buildGitHubRunnersBullseyeBaseImage
buildGitHubRunnersBookwormBaseImage
# Create the following image so that it's contents can be copied to the rest of the images below
echo
@ -530,6 +539,7 @@ function buildBuildPackImage() {
}
if [ -z "$imageTypeToBuild" ]; then
buildGitHubActionsImage "bookworm"
buildGitHubActionsImage "bullseye"
buildGitHubActionsImage "buster"
buildGitHubActionsImage
@ -552,6 +562,9 @@ elif [ "$imageTypeToBuild" == "githubactions" ]; then
buildGitHubActionsImage
buildGitHubActionsImage "buster"
buildGitHubActionsImage "bullseye"
buildGitHubActionsImage "bookworm"
elif [ "$imageTypeToBuild" == "githubactions-bookworm" ]; then
buildGitHubActionsImage "bookworm"
elif [ "$imageTypeToBuild" == "githubactions-buster" ]; then
buildGitHubActionsImage "buster"
elif [ "$imageTypeToBuild" == "githubactions-bullseye" ]; then

Просмотреть файл

@ -46,7 +46,7 @@ fi
retrieveSastokenFromKeyvault $PRIVATE_STAGING_SDK_STORAGE_BASE_URL
echo
echo "Building the common base image wih bullseye and buster flavor '$RUNTIME_BASE_IMAGE_NAME'..."
echo "Building the common base image wih bullseye, buster, and bookworm flavor '$RUNTIME_BASE_IMAGE_NAME'..."
echo
# Build the common base image first, so other images that depend on it get the latest version.
# We don't retrieve this image from a repository but rather build locally to make sure we get
@ -65,6 +65,13 @@ docker build \
-t "oryxdevmcr.azurecr.io/private/oryx/$RUNTIME_BASE_IMAGE_NAME-bullseye" \
$REPO_DIR
docker build \
--pull \
--build-arg DEBIAN_FLAVOR=bookworm \
-f "$RUNTIME_BASE_IMAGE_DOCKERFILE_PATH" \
-t "oryxdevmcr.azurecr.io/private/oryx/$RUNTIME_BASE_IMAGE_NAME-bookworm" \
$REPO_DIR
labels="--label com.microsoft.oryx.git-commit=$GIT_COMMIT"
labels="$labels --label com.microsoft.oryx.build-number=$BUILD_NUMBER"

Просмотреть файл

@ -107,6 +107,13 @@ docker build \
--build-arg DEBIAN_FLAVOR=bullseye \
$REPO_DIR
docker build \
--pull \
-f "$RUNTIME_BASE_IMAGE_DOCKERFILE_PATH" \
-t "oryxdevmcr.azurecr.io/private/oryx/$RUNTIME_BASE_IMAGE_NAME-bookworm" \
--build-arg DEBIAN_FLAVOR=bookworm \
$REPO_DIR
execAllGenerateDockerfiles "$runtimeImagesSourceDir" "generateDockerfiles.sh" "$runtimeImageDebianFlavor"
# The common base image is built separately, so we ignore it

Просмотреть файл

@ -138,6 +138,39 @@ if [ -z "$buildImageTagFilter" ] || [ "$buildImageTagFilter" == "github-actions-
echo
fi
# Build GitHub Actions bookworm build image and helper build images
if [ -z "$buildImageTagFilter" ] || [ "$buildImageTagFilter" == "github-actions-debian-bookworm" ];then
echo "Building bookworm based GitHub Action image for tests..."
docker build \
-t "$ORYXTESTS_BUILDIMAGE_REPO:github-actions-debian-bookworm" \
--build-arg PARENT_IMAGE_BASE=github-actions-debian-bookworm \
-f "$ORYXTESTS_GITHUB_ACTIONS_BUILDIMAGE_DOCKERFILE" \
.
echo
echo
echo "Building image that uses bookworm based GitHub Action as a base but doesn't have all required environment variables..."
docker build \
-t "$ORYXTESTS_BUILDIMAGE_REPO:github-actions-debian-bookworm-base" \
--build-arg PARENT_IMAGE_BASE=github-actions-debian-bookworm \
-f "$ORYXTESTS_GITHUB_ACTIONS_ASBASE_BUILDIMAGE_DOCKERFILE" \
.
echo
echo
echo "Building image that uses bookworm based GitHub Action as a base and has all required environment variables..."
docker build \
-t "$ORYXTESTS_BUILDIMAGE_REPO:github-actions-debian-bookworm-base-withenv" \
--build-arg PARENT_IMAGE_BASE=github-actions-debian-bookworm \
--build-arg DEBIAN_FLAVOR=bookworm \
-f "$ORYXTESTS_GITHUB_ACTIONS_ASBASE_WITHENV_BUILDIMAGE_DOCKERFILE" \
.
echo
fi
# Build latest stretch build image
if [ -z "$buildImageTagFilter" ] || [ "$buildImageTagFilter" == "debian-stretch" ];then
echo "Building stretch based full build image for tests..."

Просмотреть файл

@ -47,12 +47,14 @@
dot-net-60-sdk-version: 6.0.413
dot-net-60-rtm-sdk-version: 6-0-100-rtm-21527-11
dot-net-70-sdk-version: 7.0.400
dot-net-80-sdk-version: 8.0.100-preview.7.23376.3
runtime-versions:
3.0: debian-buster
3.1: debian-buster
5.0: debian-buster
6.0: debian-buster
7.0: debian-buster
8.0: debian-bookworm
dynamic: debian-buster
outputs:
- type: csharp
@ -63,7 +65,7 @@
file-name-prefix: __
- name: dot-net-core-run-time-versions
constants:
dot-net-core-runtime-base-tag: 20230823.2
dot-net-core-runtime-base-tag: 20230825.1
net-core-app-10: 1.0.16
net-core-app-11: 1.1.13
net-core-app-20: 2.0.9
@ -93,6 +95,10 @@
net-core-app-70-sha: f15b6bf0ef0ce48901880bd89a5fa4b3ae6f6614ab416b23451567844448f2510cf5beeeef6c2ac33400ea013cda7b6d2a4477e7aa0f36461b94741161424c3e
aspnet-core-app-70: 7.0.10
aspnet-core-app-70-sha: 580fdda88824bde6b2d5c09eb009fef64e89705a8aa096dc71338a549969842dff8d9f6d4bb4651e60b38e44ed0910ec18982a062b471ace18c2e22348de11ab
net-core-app-80: 8.0.0-preview.7.23375.6
net-core-app-80-sha: bfd8491550178b86a7a72fe06bdc82f0dd66771d5b60d7e4e1133cdde29f84bd57857d846722e027bd209db087123b2d12b2e23590d77991052269fa265814e1
aspnet-core-app-80: 8.0.0-preview.7.23375.9
aspnet-core-app-80-sha: b8c8a5cd579a8ee1e082363a73a05a745499365445f784e6ff87547f9acdbe8b7ba525140ef10555bc2802c13af131c2d568ec6af020bd0dd2fdf82d4c258442
outputs:
- type: csharp
directory: src/BuildScriptGenerator/DotNetCore
@ -263,6 +269,7 @@
- name: os-types
constants:
debian-stretch: stretch
debian-bookworm: bookworm
debian-bullseye: bullseye
debian-buster: buster
ubuntu-focal-scm: focal-scm

Просмотреть файл

@ -2,6 +2,11 @@
## dotnet
### bookworm
- 8.0.100-preview.6.23330.14
- 8.0.100-preview.7.23376.3
### bullseye
- 3.1.404

Просмотреть файл

@ -58,7 +58,16 @@ RUN apt-get update \
# This is the folder containing 'links' to benv and build script generator
&& mkdir -p /opt/oryx
RUN if [ "${DEBIAN_FLAVOR}" = "bullseye" ]; then \
RUN if [ "${DEBIAN_FLAVOR}" = "bookworm" ]; then \
apt-get update \
&& apt-get install -y --no-install-recommends \
libicu72 \
libcurl4 \
libssl3 \
libyaml-dev \
libxml2 \
&& rm -rf /var/lib/apt/lists/* ; \
elif [ "${DEBIAN_FLAVOR}" = "bullseye" ]; then \
apt-get update \
&& apt-get install -y --no-install-recommends \
libicu67 \
@ -127,7 +136,7 @@ RUN ${IMAGES_DIR}/retry.sh "curl -o /usr/local/share/ca-certificates/verisign.cr
&& echo "value of DEBIAN_FLAVOR is ${DEBIAN_FLAVOR}"
# Install PHP pre-reqs # Install PHP pre-reqs
RUN if [ "${DEBIAN_FLAVOR}" = "buster" ] || [ "${DEBIAN_FLAVOR}" = "bullseye" ]; then \
RUN if [ "${DEBIAN_FLAVOR}" = "buster" ] || [ "${DEBIAN_FLAVOR}" = "bullseye" ] || [ "${DEBIAN_FLAVOR}" = "bookworm" ]; then \
apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \

Просмотреть файл

@ -0,0 +1,3 @@
# https://github.com/actions/virtual-environments/blob/master/images/linux/Ubuntu1804-README.md
# DisableDockerDetector "Need to determine correct way of handling hashes in mirror registry"
FROM buildpack-deps:bookworm@sha256:af1d6cabbfa6bb5e8897a4fba5442451b77aecc090f35508a45d087a0a69eec2

Просмотреть файл

@ -0,0 +1,64 @@
# dotnet tools are currently available as part of SDK so we need to create them in an sdk image
# and copy them to our final runtime image
FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS tools-install
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-sos
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-trace
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-dump
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-counters
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-gcdump
# Update dotnet-monitor after .NET is out of preview to:
# dotnet-monitor --version 8.*
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-monitor --version 8.0.0-preview.7.23402
FROM mcr.microsoft.com/mirror/docker/library/debian:bullseye-slim
ARG BUILD_DIR=/tmp/oryx/build
ADD build ${BUILD_DIR}
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
# .NET Core dependencies
libc6 \
libgcc1 \
libgssapi-krb5-2 \
libicu67 \
libssl1.1 \
libstdc++6 \
zlib1g \
lldb \
curl \
file \
libgdiplus \
&& apt-get upgrade --assume-yes \
&& rm -rf /var/lib/apt/lists/*
# Configure web servers to bind to port 80 when present
ENV ASPNETCORE_URLS=http://+:80 \
# Enable detection of running in a container
DOTNET_RUNNING_IN_CONTAINER=true \
PATH="/opt/dotnetcore-tools:${PATH}"
COPY --from=tools-install /dotnetcore-tools /opt/dotnetcore-tools
# Install .NET Core
RUN set -ex \
# based on resolution on https://github.com/NuGet/Announcements/issues/49#issue-795386700
&& apt-get remove ca-certificates -y \
&& apt-get purge ca-certificates -y \
&& apt-get update \
&& apt-get install -f ca-certificates=20210119 -y --no-install-recommends \
&& . ${BUILD_DIR}/__dotNetCoreRunTimeVersions.sh \
&& curl -SL --output dotnet.tar.gz https://dotnetcli.azureedge.net/dotnet/Runtime/$NET_CORE_APP_80/dotnet-runtime-$NET_CORE_APP_80-linux-x64.tar.gz \
&& echo "$NET_CORE_APP_80_SHA dotnet.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -zxf dotnet.tar.gz -C /usr/share/dotnet \
&& rm dotnet.tar.gz \
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet \
# Install ASP.NET Core
&& . ${BUILD_DIR}/__dotNetCoreRunTimeVersions.sh \
&& curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNET_CORE_APP_80/aspnetcore-runtime-$ASPNET_CORE_APP_80-linux-x64.tar.gz \
&& echo "$ASPNET_CORE_APP_80_SHA aspnetcore.tar.gz" | sha512sum -c - \
&& mkdir -p /usr/share/dotnet \
&& tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet ./shared/Microsoft.AspNetCore.App \
&& rm aspnetcore.tar.gz \
&& dotnet-sos install \
&& rm -rf ${BUILD_DIR}

Просмотреть файл

@ -25,12 +25,15 @@ declare -r DOTNET_VERSION_PLACEHOLDER="%DOTNET_VERSION%"
# Please make sure that any changes to debian flavors supported here are also reflected in build/constants.yaml
declare -r NETCORE_BUSTER_VERSION_ARRAY=($NET_CORE_APP_30 $NET_CORE_APP_31 $NET_CORE_APP_50 $NET_CORE_APP_60 $NET_CORE_APP_70)
declare -r NETCORE_BULLSEYE_VERSION_ARRAY=()
declare -r NETCORE_BOOKWORM_VERSION_ARRAY=($NET_CORE_APP_80)
cd $DIR
VERSIONS_DIRECTORY=()
if [ "$ImageDebianFlavor" == "buster" ];then
if [ "$ImageDebianFlavor" == "bookworm" ];then
VERSIONS_DIRECTORY=("${NETCORE_BOOKWORM_VERSION_ARRAY[@]}")
elif [ "$ImageDebianFlavor" == "buster" ];then
VERSIONS_DIRECTORY=("${NETCORE_BUSTER_VERSION_ARRAY[@]}")
elif [ "$ImageDebianFlavor" == "bullseye" ];then
VERSIONS_DIRECTORY=("${NETCORE_BULLSEYE_VERSION_ARRAY[@]}")

Просмотреть файл

@ -2,7 +2,7 @@
# the above line allows this dockerfile to use the secrets functionality
ARG DEBIAN_FLAVOR
# Startup script generator
FROM mcr.microsoft.com/oss/go/microsoft/golang:1.18-${DEBIAN_FLAVOR} as startupCmdGen
FROM mcr.microsoft.com/oss/go/microsoft/golang:1.19-${DEBIAN_FLAVOR} as startupCmdGen
# GOPATH is set to "/go" in the base image
WORKDIR /go/src

Просмотреть файл

@ -0,0 +1 @@
8.0

Просмотреть файл

@ -0,0 +1,4 @@
# NOTE: Make sure to set the default version in 'defaultVersion.txt' file
# version, sha, download url
8.0.100-preview.6.23330.14, ef568a1ecf6140237249544673a52dc496cff682d1a078e9309d195d78e632b3870b7fb23eb38cae7b0638c564f6aa340ca2e209c4ae4fbcddb84073138e8a08,
8.0.100-preview.7.23376.3, 8bc71a586382f0e264024707f2f3af9a2f675dd5d4fbdd4bced7ab207141fb74d7c6492dfd94373505962b8597ae379259d152e4ace93a65dad0f89600afecd8,

Просмотреть файл

@ -5,6 +5,7 @@ namespace Microsoft.Oryx.BuildScriptGenerator.Common
public static class OsTypes
{
public const string DebianStretch = "stretch";
public const string DebianBookworm = "bookworm";
public const string DebianBullseye = "bullseye";
public const string DebianBuster = "buster";
public const string UbuntuFocalScm = "focal-scm";

Просмотреть файл

@ -4,7 +4,7 @@ namespace Microsoft.Oryx.BuildScriptGenerator.DotNetCore
{
public static class DotNetCoreRunTimeVersions
{
public const string DotNetCoreRuntimeBaseTag = "20230823.2";
public const string DotNetCoreRuntimeBaseTag = "20230825.1";
public const string NetCoreApp10 = "1.0.16";
public const string NetCoreApp11 = "1.1.13";
public const string NetCoreApp20 = "2.0.9";
@ -34,5 +34,9 @@ namespace Microsoft.Oryx.BuildScriptGenerator.DotNetCore
public const string NetCoreApp70Sha = "f15b6bf0ef0ce48901880bd89a5fa4b3ae6f6614ab416b23451567844448f2510cf5beeeef6c2ac33400ea013cda7b6d2a4477e7aa0f36461b94741161424c3e";
public const string AspnetCoreApp70 = "7.0.10";
public const string AspnetCoreApp70Sha = "580fdda88824bde6b2d5c09eb009fef64e89705a8aa096dc71338a549969842dff8d9f6d4bb4651e60b38e44ed0910ec18982a062b471ace18c2e22348de11ab";
public const string NetCoreApp80 = "8.0.0-preview.7.23375.6";
public const string NetCoreApp80Sha = "bfd8491550178b86a7a72fe06bdc82f0dd66771d5b60d7e4e1133cdde29f84bd57857d846722e027bd209db087123b2d12b2e23590d77991052269fa265814e1";
public const string AspnetCoreApp80 = "8.0.0-preview.7.23375.9";
public const string AspnetCoreApp80Sha = "b8c8a5cd579a8ee1e082363a73a05a745499365445f784e6ff87547f9acdbe8b7ba525140ef10555bc2802c13af131c2d568ec6af020bd0dd2fdf82d4c258442";
}
}

Просмотреть файл

@ -16,6 +16,7 @@ namespace Microsoft.Oryx.BuildScriptGenerator.DotNetCore
public const string DotNet60SdkVersion = "6.0.413";
public const string DotNet60RtmSdkVersion = "6-0-100-rtm-21527-11";
public const string DotNet70SdkVersion = "7.0.400";
public static readonly Dictionary<string, string> RuntimeVersions = new Dictionary<string, string> { { "3.0", "debian-buster" }, { "3.1", "debian-buster" }, { "5.0", "debian-buster" }, { "6.0", "debian-buster" }, { "7.0", "debian-buster" }, { "dynamic", "debian-buster" } };
public const string DotNet80SdkVersion = "8.0.100-preview.7.23376.3";
public static readonly Dictionary<string, string> RuntimeVersions = new Dictionary<string, string> { { "3.0", "debian-buster" }, { "3.1", "debian-buster" }, { "5.0", "debian-buster" }, { "6.0", "debian-buster" }, { "7.0", "debian-buster" }, { "8.0", "debian-bookworm" }, { "dynamic", "debian-buster" } };
}
}

Просмотреть файл

@ -3,6 +3,7 @@
package consts
const DebianStretch string = "stretch"
const DebianBookworm string = "bookworm"
const DebianBullseye string = "bullseye"
const DebianBuster string = "buster"
const UbuntuFocalScm string = "focal-scm"

Просмотреть файл

@ -19,6 +19,7 @@ namespace Microsoft.Oryx.BuildImage.Tests
public class BaseImageTest : SampleAppsTestBase
{
protected const string NetCoreApp31MvcApp = "NetCoreApp31.MvcApp";
protected const string NetCore8PreviewMvcApp = "NetCore8PreviewMvcApp";
public BaseImageTest(ITestOutputHelper output) : base(output)
{
@ -45,20 +46,27 @@ namespace Microsoft.Oryx.BuildImage.Tests
imageHelper.GetGitHubActionsAsBaseBuildImage(),
"stretch");
//buster
// buster
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp31,
NetCoreApp31MvcApp,
imageHelper.GetGitHubActionsAsBaseBuildImage(ImageTestHelperConstants.GitHubActionsBusterBase),
"buster");
//bullseye
// bullseye
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp31,
NetCoreApp31MvcApp,
imageHelper.GetGitHubActionsAsBaseBuildImage(ImageTestHelperConstants.GitHubActionsBullseyeBase),
"bullseye");
// bookworm
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp80,
NetCore8PreviewMvcApp,
imageHelper.GetGitHubActionsAsBaseBuildImage(ImageTestHelperConstants.GitHubActionsBookwormBase),
"bookworm");
return data;
}
}

Просмотреть файл

@ -28,6 +28,7 @@ namespace Microsoft.Oryx.BuildImage.Tests
protected const string NetCoreApp50MvcApp = "NetCoreApp50MvcApp";
protected const string NetCore6PreviewWebApp = "NetCore6PreviewWebApp";
protected const string NetCore7PreviewMvcApp = "NetCore7PreviewMvcApp";
protected const string NetCore8PreviewMvcApp = "NetCore8PreviewMvcApp";
protected const string NetCoreApp70WebApp = "NetCore7WebApp";
protected const string DefaultWebApp = "DefaultWebApp";
@ -557,31 +558,6 @@ namespace Microsoft.Oryx.BuildImage.Tests
var imageHelper = new ImageTestHelper();
// stretch
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp11,
DotNetCoreSdkVersions.DotNetCore11SdkVersion,
NetCoreApp11WebApp,
imageHelper.GetGitHubActionsBuildImage());
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp22,
DotNetCoreSdkVersions.DotNetCore22SdkVersion,
NetCoreApp22WebApp,
imageHelper.GetGitHubActionsBuildImage());
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp30,
DotNetCoreSdkVersions.DotNetCore30SdkVersion,
NetCoreApp30WebApp,
imageHelper.GetGitHubActionsBuildImage());
data.Add(
FinalStretchVersions.FinalStretchDotNetCoreApp31RunTimeVersion,
FinalStretchVersions.FinalStretchDotNetCore31SdkVersion,
NetCoreApp31MvcApp,
imageHelper.GetGitHubActionsBuildImage());
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp50,
DotNetCoreSdkVersions.DotNet50SdkVersion,
NetCoreApp50MvcApp,
imageHelper.GetGitHubActionsBuildImage());
data.Add(
FinalStretchVersions.FinalStretchDotNetCoreApp60RunTimeVersion,
FinalStretchVersions.FinalStretchDotNet60SdkVersion,
@ -593,22 +569,7 @@ namespace Microsoft.Oryx.BuildImage.Tests
NetCore7PreviewMvcApp,
imageHelper.GetGitHubActionsBuildImage());
//buster
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp21,
DotNetCoreSdkVersions.DotNetCore21SdkVersion,
NetCoreApp21WebApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBuster));
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp31,
DotNetCoreSdkVersions.DotNetCore31SdkVersion,
NetCoreApp31MvcApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBuster));
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp50,
DotNetCoreSdkVersions.DotNet50SdkVersion,
NetCoreApp50MvcApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBuster));
// buster
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp60,
DotNetCoreSdkVersions.DotNet60SdkVersion,
@ -620,12 +581,7 @@ namespace Microsoft.Oryx.BuildImage.Tests
NetCore7PreviewMvcApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBuster));
//bullseye
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp31,
DotNetCoreSdkVersions.DotNetCore31SdkVersion,
NetCoreApp31MvcApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBullseye));
// bullseye
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp60,
DotNetCoreSdkVersions.DotNet60SdkVersion,
@ -636,7 +592,14 @@ namespace Microsoft.Oryx.BuildImage.Tests
DotNetCoreSdkVersions.DotNet70SdkVersion,
NetCore7PreviewMvcApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBullseye));
// bookworm
data.Add(
DotNetCoreRunTimeVersions.NetCoreApp80,
DotNetCoreSdkVersions.DotNet80SdkVersion,
NetCore8PreviewMvcApp,
imageHelper.GetGitHubActionsBuildImage(ImageTestHelperConstants.GitHubActionsBookworm));
return data;
}
}

Просмотреть файл

@ -7,6 +7,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Reflection;
using System.Threading.Tasks;
@ -412,17 +413,19 @@ namespace Microsoft.Oryx.Tests.Common
await Task.Delay(DelayBetweenRetries);
// Example output from `docker port <container-name> <container-port>`:
// "0.0.0.0:32774"
// "0.0.0.0:32785:::32785"
var getPortMappingResult = dockerCli.GetPortMapping(containerName, portInContainer);
if (getPortMappingResult.ExitCode == 0)
{
var stdOut = getPortMappingResult.StdOut?.Trim().ReplaceNewLine();
Console.WriteLine("stdOut: " + stdOut);
var portMapping = stdOut?.Split(":");
Console.WriteLine("portMapping: " + portMapping);
Assert.NotNull(portMapping);
Assert.True(
(portMapping.Length == 2),
(portMapping.Length > 1),
"Did not get the port mapping in expected format. StdOut: " + getPortMappingResult.StdOut);
var hostPort = Convert.ToInt32(portMapping[1]);
var hostPort = Convert.ToInt32(portMapping.Last());
return hostPort;
}
else if (getPortMappingResult.StdErr.Contains("No such container") || (getPortMappingResult.HasExited && getPortMappingResult.ExitCode != 0))

Просмотреть файл

@ -35,12 +35,15 @@ namespace Microsoft.Oryx.Tests.Common
private const string _gitHubActionsStretch = ImageTestHelperConstants.GitHubActionsStretch;
private const string _gitHubActionsBuster = ImageTestHelperConstants.GitHubActionsBuster;
private const string _gitHubActionsBullseye = ImageTestHelperConstants.GitHubActionsBullseye;
private const string _gitHubActionsBookworm = ImageTestHelperConstants.GitHubActionsBookworm;
private const string _gitHubActionsStretchBase = ImageTestHelperConstants.GitHubActionsStretchBase;
private const string _gitHubActionsBusterBase = ImageTestHelperConstants.GitHubActionsBusterBase;
private const string _gitHubActionsBullseyeBase = ImageTestHelperConstants.GitHubActionsBullseyeBase;
private const string _gitHubActionsBookwormBase = ImageTestHelperConstants.GitHubActionsBookwormBase;
private const string _gitHubActionsStretchBaseWithEnv = ImageTestHelperConstants.GitHubActionsStretchBaseWithEnv;
private const string _gitHubActionsBusterBaseWithEnv = ImageTestHelperConstants.GitHubActionsBusterBaseWithEnv;
private const string _gitHubActionsBullseyeBaseWithEnv = ImageTestHelperConstants.GitHubActionsBullseyeBaseWithEnv;
private const string _gitHubActionsBookwormBaseWithEnv = ImageTestHelperConstants.GitHubActionsBookwormBaseWithEnv;
private const string _vso = ImageTestHelperConstants.Vso;
private const string _vsoUbuntu = ImageTestHelperConstants.VsoFocal;
private const string _vsoBullseye = ImageTestHelperConstants.VsoBullseye;
@ -315,6 +318,10 @@ namespace Microsoft.Oryx.Tests.Common
{
return $"{_repoPrefix}/{_buildRepository}:{_gitHubActionsBuster}{_tagSuffix}";
}
else if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBookworm))
{
return $"{_repoPrefix}/{_buildRepository}:{_gitHubActionsBookworm}{_tagSuffix}";
}
else if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBullseye))
{
return $"{_repoPrefix}/{_buildRepository}:{_gitHubActionsBullseye}{_tagSuffix}";
@ -327,7 +334,11 @@ namespace Microsoft.Oryx.Tests.Common
public string GetGitHubActionsAsBaseBuildImage(string debianFlavor = null)
{
if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBusterBase))
if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBookwormBase))
{
return $"{_restrictedPermissionsImageRepoPrefix}/{_buildRepository}:{_gitHubActionsBookwormBase}";
}
else if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBusterBase))
{
return $"{_restrictedPermissionsImageRepoPrefix}/{_buildRepository}:{_gitHubActionsBusterBase}";
}
@ -343,7 +354,11 @@ namespace Microsoft.Oryx.Tests.Common
public string GetGitHubActionsAsBaseWithEnvBuildImage(string debianFlavor = null)
{
if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBusterBaseWithEnv))
if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBookwormBaseWithEnv))
{
return $"{_restrictedPermissionsImageRepoPrefix}/{_buildRepository}:{_gitHubActionsBookwormBaseWithEnv}";
}
else if (!string.IsNullOrEmpty(debianFlavor) && string.Equals(debianFlavor.ToLower(), _gitHubActionsBusterBaseWithEnv))
{
return $"{_restrictedPermissionsImageRepoPrefix}/{_buildRepository}:{_gitHubActionsBusterBaseWithEnv}";
}
@ -499,12 +514,15 @@ namespace Microsoft.Oryx.Tests.Common
public const string GitHubActionsStretch = "github-actions-debian-stretch";
public const string GitHubActionsBuster = "github-actions-debian-buster";
public const string GitHubActionsBullseye = "github-actions-debian-bullseye";
public const string GitHubActionsBookworm = "github-actions-debian-bookworm";
public const string GitHubActionsStretchBase = "github-actions-debian-stretch-base";
public const string GitHubActionsBusterBase = "github-actions-debian-buster-base";
public const string GitHubActionsBullseyeBase = "github-actions-debian-bullseye-base";
public const string GitHubActionsBookwormBase = "github-actions-debian-bookworm-base";
public const string GitHubActionsStretchBaseWithEnv = "github-actions-debian-stretch-base-withenv";
public const string GitHubActionsBusterBaseWithEnv = "github-actions-debian-buster-base-withenv";
public const string GitHubActionsBullseyeBaseWithEnv = "github-actions-debian-bullseye-base-withenv";
public const string GitHubActionsBookwormBaseWithEnv = "github-actions-debian-bookworm-base-withenv";
public const string Vso = "vso";
public const string VsoFocal = "vso-ubuntu-focal";
public const string VsoBullseye = "vso-debian-bullseye";

Просмотреть файл

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using NetCore8PreviewMvcApp.Models;
namespace NetCore8PreviewMvcApp.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

Просмотреть файл

@ -0,0 +1,11 @@
using System;
namespace NetCore8PreviewMvcApp.Models
{
public class ErrorViewModel
{
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}

Просмотреть файл

@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
</Project>

Просмотреть файл

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace NetCore8PreviewMvcApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}

Просмотреть файл

@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace NetCore8PreviewMvcApp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}

Просмотреть файл

@ -0,0 +1,8 @@
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome to ASP.NET Core MVC!</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

Просмотреть файл

@ -0,0 +1,6 @@
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>

Просмотреть файл

@ -0,0 +1,25 @@
@model ErrorViewModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

Просмотреть файл

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - NetCore8PreviewMvcApp</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">NetCore8PreviewMvcApp</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
&copy; 2021 - NetCore8PreviewMvcApp - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Просмотреть файл

@ -0,0 +1,2 @@
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

Просмотреть файл

@ -0,0 +1,3 @@
@using NetCore8PreviewMvcApp
@using NetCore8PreviewMvcApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Просмотреть файл

@ -0,0 +1,3 @@
@{
Layout = "_Layout";
}

Просмотреть файл

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}

Просмотреть файл

@ -0,0 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

Просмотреть файл

@ -0,0 +1,71 @@
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
for details on configuring this project to bundle and minify static web assets. */
a.navbar-brand {
white-space: normal;
text-align: center;
word-break: break-all;
}
/* Provide sufficient contrast against white background */
a {
color: #0366d6;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
font-size: 14px;
}
@media (min-width: 768px) {
html {
font-size: 16px;
}
}
.border-top {
border-top: 1px solid #e5e5e5;
}
.border-bottom {
border-bottom: 1px solid #e5e5e5;
}
.box-shadow {
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
}
button.accept-policy {
font-size: 1rem;
line-height: inherit;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
position: relative;
min-height: 100%;
}
body {
/* Margin bottom by footer height */
margin-bottom: 60px;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
white-space: nowrap;
line-height: 60px; /* Vertically center the text there */
}

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 5.3 KiB

Просмотреть файл

@ -0,0 +1,4 @@
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
// for details on configuring this project to bundle and minify static web assets.
// Write your JavaScript code.

Просмотреть файл

@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2011-2018 Twitter, Inc.
Copyright (c) 2011-2018 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,331 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
a:hover {
color: #0056b3;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg {
overflow: hidden;
vertical-align: middle;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
select {
word-wrap: normal;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button:not(:disabled),
[type="button"]:not(:disabled),
[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,12 @@
Copyright (c) .NET Foundation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
these files except in compliance with the License. You may obtain a copy of the
License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

Просмотреть файл

@ -0,0 +1,432 @@
// Unobtrusive validation support library for jQuery and jQuery Validate
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// @version v3.2.11
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS-like environments that support module.exports
module.exports = factory(require('jquery-validation'));
} else {
// Browser global
jQuery.validator.unobtrusive = factory(jQuery);
}
}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
function setValidationValues(options, ruleName, value) {
options.rules[ruleName] = value;
if (options.message) {
options.messages[ruleName] = options.message;
}
}
function splitAndTrim(value) {
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
}
function escapeAttributeValue(value) {
// As mentioned on http://api.jquery.com/category/selectors/
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
}
function getModelPrefix(fieldName) {
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
}
function appendModelPrefix(value, prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.", prefix);
}
return value;
}
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}
function onErrors(event, validator) { // 'this' is the form element
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer");
if (container) {
var replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
container.addClass("field-validation-valid").removeClass("field-validation-error");
error.removeData("unobtrusiveContainer");
if (replace) {
container.empty();
}
}
}
function onReset(event) { // 'this' is the form element
var $form = $(this),
key = '__jquery_unobtrusive_validation_form_reset';
if ($form.data(key)) {
return;
}
// Set a flag that indicates we're currently resetting the form.
$form.data(key, true);
try {
$form.data("validator").resetForm();
} finally {
$form.removeData(key);
}
$form.find(".validation-summary-errors")
.addClass("validation-summary-valid")
.removeClass("validation-summary-errors");
$form.find(".field-validation-error")
.addClass("field-validation-valid")
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
.removeData("unobtrusiveContainer");
}
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form),
defaultOptions = $jQval.unobtrusive.options || {},
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
};
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: defaultOptions.errorClass || "input-validation-error",
errorElement: defaultOptions.errorElement || "span",
errorPlacement: function () {
onError.apply(form, arguments);
execInContext("errorPlacement", arguments);
},
invalidHandler: function () {
onErrors.apply(form, arguments);
execInContext("invalidHandler", arguments);
},
messages: {},
rules: {},
success: function () {
onSuccess.apply(form, arguments);
execInContext("success", arguments);
}
},
attachValidation: function () {
$form
.off("reset." + data_validation, onResetProxy)
.on("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
$jQval.unobtrusive = {
adapters: [],
parseElement: function (element, skipAttach) {
/// <summary>
/// Parses a single HTML element for unobtrusive validation attributes.
/// </summary>
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
/// validation to the form. If parsing just this single element, you should specify true.
/// If parsing several elements, you should specify false, and manually attach the validation
/// to the form when you are finished. The default is false.</param>
var $element = $(element),
form = $element.parents("form")[0],
valInfo, rules, messages;
if (!form) { // Cannot do client-side validation without a form
return;
}
valInfo = validationInfo(form);
valInfo.options.rules[element.name] = rules = {};
valInfo.options.messages[element.name] = messages = {};
$.each(this.adapters, function () {
var prefix = "data-val-" + this.name,
message = $element.attr(prefix),
paramValues = {};
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
prefix += "-";
$.each(this.params, function () {
paramValues[this] = $element.attr(prefix + this);
});
this.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
}
});
$.extend(rules, { "__dummy__": true });
if (!skipAttach) {
valInfo.attachValidation();
}
},
parse: function (selector) {
/// <summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
.addBack()
.filter("form")
.add($selector.find("form"))
.has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
}
};
adapters = $jQval.unobtrusive.adapters;
adapters.add = function (adapterName, params, fn) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
/// mmmm is the parameter name).</param>
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
/// attributes into jQuery Validate rules and/or messages.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
if (!fn) { // Called with no params, just a function
fn = params;
params = [];
}
this.push({ name: adapterName, params: params, adapt: fn });
return this;
};
adapters.addBool = function (adapterName, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has no parameter values.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, function (options) {
setValidationValues(options, ruleName || adapterName, true);
});
};
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a minimum value.</param>
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a maximum value.</param>
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
/// have both a minimum and maximum value.</param>
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the minimum value. The default is "min".</param>
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the maximum value. The default is "max".</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
var min = options.params.min,
max = options.params.max;
if (min && max) {
setValidationValues(options, minMaxRuleName, [min, max]);
}
else if (min) {
setValidationValues(options, minRuleName, min);
}
else if (max) {
setValidationValues(options, maxRuleName, max);
}
});
};
adapters.addSingleVal = function (adapterName, attribute, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has a single value.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
/// The default is "val".</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [attribute || "val"], function (options) {
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
});
};
$jQval.addMethod("__dummy__", function (value, element, params) {
return true;
});
$jQval.addMethod("regex", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
match = new RegExp(params).exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
var match;
if (nonalphamin) {
match = value.match(/\W/g);
match = match && match.length >= nonalphamin;
}
return match;
});
if ($jQval.methods.extension) {
adapters.addSingleVal("accept", "mimtype");
adapters.addSingleVal("extension", "extension");
} else {
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
// validating the extension, and ignore mime-type validations as they are not supported.
adapters.addSingleVal("extension", "extension", "accept");
}
adapters.addSingleVal("regex", "pattern");
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
setValidationValues(options, "equalTo", element);
});
adapters.add("required", function (options) {
// jQuery Validate equates "required" with "mandatory" for checkbox elements
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
setValidationValues(options, "required", true);
}
});
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = appendModelPrefix(fieldName, prefix);
value.data[paramName] = function () {
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
// For checkboxes and radio buttons, only pick up values from checked fields.
if (field.is(":checkbox")) {
return field.filter(":checked").val() || field.filter(":hidden").val() || '';
}
else if (field.is(":radio")) {
return field.filter(":checked").val() || '';
}
return field.val();
};
});
setValidationValues(options, "remote", value);
});
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
if (options.params.min) {
setValidationValues(options, "minlength", options.params.min);
}
if (options.params.nonalphamin) {
setValidationValues(options, "nonalphamin", options.params.nonalphamin);
}
if (options.params.regex) {
setValidationValues(options, "regex", options.params.regex);
}
});
adapters.add("fileextensions", ["extensions"], function (options) {
setValidationValues(options, "extension", options.params.extensions);
});
$(function () {
$jQval.unobtrusive.parse(document);
});
return $jQval.unobtrusive;
}));

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,22 @@
The MIT License (MIT)
=====================
Copyright Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,36 @@
Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -10,6 +10,19 @@ parameters:
stages:
- stage: Build
jobs:
- job: DotNetCore_Bookworm
timeoutInMinutes: 250
pool:
name: AzurePipelines-EO
demands:
- ImageOverride -equals AzurePipelinesUbuntu20.04compliant
steps:
- template: ../templates/_platformBinariesTemplate.yml
parameters:
platformName: 'dotnet'
debianFlavor: 'bookworm'
destinationSdkStorageAccountName: '${{ parameters.destinationStorageAccountName }}'
- job: DotNetCore_Bullseye
timeoutInMinutes: 250
pool:

Просмотреть файл

@ -28,10 +28,20 @@ jobs:
artifactsFileName: dotnetcore-runtimeimage-bases-bullseye.txt
jobName: Build_DotNetCore_BaseImage_Bullseye
- template: ../templates/_buildimageBasesJobTemplate.yml
parameters:
displayName: Build DotNetCore runtime bookworm base images
scriptPath: ./build/buildRunTimeImageBases.sh
imageDir: dotnetcore
imageDebianFlavor: bookworm
artifactsFileName: dotnetcore-runtimeimage-bases-bookworm.txt
jobName: Build_DotNetCore_BaseImage_Bookworm
- job: Release_DotNetCoreRuntimeBaseImage
dependsOn:
- Build_DotNetCore_BaseImage_Buster
- Build_DotNetCore_BaseImage_Bullseye
- Build_DotNetCore_BaseImage_Bookworm
displayName: Push images to MCR
timeoutInMinutes: 250
pool:

Просмотреть файл

@ -109,20 +109,29 @@ steps:
args: -s $(storageAccountUrl) bullseye
condition: and(succeeded(), eq(variables['BuildRuntimeImages'], 'true'))
- task: ShellScript@2
displayName: 'Build Bookworm runtime images'
env:
ORYX_SDK_STORAGE_ACCOUNT_ACCESS_TOKEN: $(ORYX-SDK-STAGING-PRIVATE-SAS-TOKEN)
inputs:
scriptPath: ./build/buildRunTimeImages.sh
args: -s $(storageAccountUrl) bookworm
condition: and(succeeded(), eq(variables['BuildRuntimeImages'], 'true'))
- script: |
docker images && docker system prune -f && df -h && echo
displayName: 'clean docker unknown layers'
- script: |
docker -v
echo "Installing stable version of Docker CE................"
echo "Installing Docker CE version 24.0.5................"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce=5:20.10.5~3-0~ubuntu-focal docker-ce-cli=5:20.10.5~3-0~ubuntu-focal containerd.io
sudo apt-get install docker-ce=5:24.0.5~3-0~ubuntu-focal docker-ce-cli=5:24.0.5~3-0~ubuntu-focal containerd.io
echo "After installing ................"
docker -v
displayName: 'Install Docker 20.10.5'
displayName: 'Install Docker 24.0.5'
condition: true
- task: ShellScript@2
@ -207,9 +216,10 @@ steps:
AdditionalComponentDetectorArgs: '--DirectoryExclusionList **/SampleApps/**'
- script: |
echo "Merging bullseye, buster based runtime image tags in one single file"
echo "Merging bookworm, bullseye, buster based runtime image tags in one single file"
cat $(Build.ArtifactStagingDirectory)/images/runtime-images-acr.buster.txt >> '$(Build.ArtifactStagingDirectory)/images/runtime-images-acr.txt'
cat $(Build.ArtifactStagingDirectory)/images/runtime-images-acr.bullseye.txt >> '$(Build.ArtifactStagingDirectory)/images/runtime-images-acr.txt'
cat $(Build.ArtifactStagingDirectory)/images/runtime-images-acr.bookworm.txt >> '$(Build.ArtifactStagingDirectory)/images/runtime-images-acr.txt'
displayName: 'Merge runtime image tags in one single file'
condition: and(succeeded(), eq(variables['BuildRuntimeImages'], 'true'))

Просмотреть файл

@ -61,6 +61,9 @@ parameters:
- name: githubActions
type: object
default:
- name: 'github-actions-bookworm'
sourceTag: 'github-actions-debian-bookworm-Oryx-Nightly'
destinationTag: 'github-actions-debian-bookworm'
- name: 'github-actions-bullseye'
sourceTag: 'github-actions-debian-bullseye-Oryx-Nightly'
destinationTag: 'github-actions-debian-bullseye'

Просмотреть файл

@ -24,14 +24,14 @@ steps:
- script: |
docker -v
echo "Installing stable version of Docker CE................"
echo "Installing Docker CE version 24.0.5................"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce=5:20.10.5~3-0~ubuntu-focal docker-ce-cli=5:20.10.5~3-0~ubuntu-focal containerd.io
sudo apt-get install docker-ce=5:24.0.5~3-0~ubuntu-focal docker-ce-cli=5:24.0.5~3-0~ubuntu-focal containerd.io
echo "After installing ................"
docker -v
displayName: 'Install Docker 20.10.5'
displayName: 'Install Docker 24.0.5'
condition: true
- script: |
@ -46,9 +46,9 @@ steps:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce=5:20.10.5~3-0~ubuntu-focal docker-ce-cli=5:20.10.5~3-0~ubuntu-focal containerd.io
sudo apt-get install docker-ce=5:24.0.5~3-0~ubuntu-focal docker-ce-cli=5:24.0.5~3-0~ubuntu-focal containerd.io
docker -v
displayName: 'Install Docker 20.10.5'
displayName: 'Install Docker 24.0.5'
- checkout: self
clean: true

Просмотреть файл

@ -75,6 +75,7 @@ function copyPlatformBlobsToProd() {
copyPlatformBlobsToProdForDebianFlavor "$platformName" "stretch"
copyPlatformBlobsToProdForDebianFlavor "$platformName" "buster"
copyPlatformBlobsToProdForDebianFlavor "$platformName" "bullseye"
copyPlatformBlobsToProdForDebianFlavor "$platformName" "bookworm"
copyPlatformBlobsToProdForDebianFlavor "$platformName" "focal-scm"
}

Просмотреть файл

@ -104,6 +104,7 @@ tagBuildImageForIntegrationTest "$imagefilter/build" "azfunc-jamstack-debian-bul
tagBuildImageForIntegrationTest "$imagefilter/build" "github-actions-debian-stretch" "$buildImageFilter" "$buildImageTagFilter"
tagBuildImageForIntegrationTest "$imagefilter/build" "github-actions-debian-buster" "$buildImageFilter" "$buildImageTagFilter"
tagBuildImageForIntegrationTest "$imagefilter/build" "github-actions-debian-bullseye" "$buildImageFilter" "$buildImageTagFilter"
tagBuildImageForIntegrationTest "$imagefilter/build" "github-actions-debian-bookworm" "$buildImageFilter" "$buildImageTagFilter"
tagBuildImageForIntegrationTest "$imagefilter/build" "vso-ubuntu-focal" "$buildImageFilter" "$buildImageTagFilter"
tagBuildImageForIntegrationTest "$imagefilter/build" "vso-debian-bullseye" "$buildImageFilter" "$buildImageTagFilter"
tagBuildImageForIntegrationTest "$imagefilter/build" "full-debian-buster" "$buildImageFilter" "$buildImageTagFilter"

Просмотреть файл

@ -8,11 +8,21 @@ set -euo pipefail
# $1 > file that has all the tags
# e.g. /data/agent/_work/206/a/drop/images/yarn-cache-build/oryxmcr-base-images-mcr.txt
bookwormBaseImagesFile="$1"-bookworm-base-images-mcr.txt
bullseyeBaseImagesFile="$1"-bullseye-base-images-mcr.txt
busterBaseImagesFile="$1"-buster-base-images-mcr.txt
echo "base image tag file is in directory: $1"
if [ -f "$bookwormBaseImagesFile" ]; then
echo "$bookwormBaseImagesFile exists. pushing bookworm image tags ..."
while read imageName; do
# read the tags from file
echo "Pushing image $imageName ..."
docker push "$imageName"
done <"$bookwormBaseImagesFile"
fi
if [ -f "$bullseyeBaseImagesFile" ]; then
echo "$bullseyeBaseImagesFile exists. pushing bullseye image tags ..."
while read imageName; do

Просмотреть файл

@ -96,6 +96,7 @@ then
echo $imageName
retagImageWithStagingRepository dotnetcore-runtimeimage-bases-buster.txt $imageName buster
retagImageWithStagingRepository dotnetcore-runtimeimage-bases-bullseye.txt $imageName bullseye
retagImageWithStagingRepository dotnetcore-runtimeimage-bases-bookworm.txt $imageName bookworm
elif [ "$imageName" == "ruby" ]
then
echo ""

Просмотреть файл

@ -55,6 +55,7 @@ tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:azfunc-jamstack-debian-bu
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:github-actions-debian-stretch-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "github-actions-debian-stretch" "github-actions-debian-stretch-$RELEASE_TAG_NAME"
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:github-actions-debian-buster-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "github-actions-debian-buster" "github-actions-debian-buster-$RELEASE_TAG_NAME"
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:github-actions-debian-bullseye-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "github-actions-debian-bullseye" "github-actions-debian-bullseye-$RELEASE_TAG_NAME"
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:github-actions-debian-bookworm-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "github-actions-debian-bookworm" "github-actions-debian-bookworm-$RELEASE_TAG_NAME"
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:vso-ubuntu-focal-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "vso-ubuntu-focal" "vso-ubuntu-focal-$RELEASE_TAG_NAME"
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:vso-debian-bullseye-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "vso-debian-bullseye" "vso-debian-bullseye-$RELEASE_TAG_NAME"
tagBuildImage "oryxdevmcr.azurecr.io/public/oryx/build:full-debian-buster-$BUILD_DEFINITIONNAME.$RELEASE_TAG_NAME" "full-debian-buster" "full-debian-buster-$RELEASE_TAG_NAME"