Загрузка данных


1 dockerfile

ARG IMAGE_NAME__DOTNET_SDK
ARG IMAGE_TAG__DOTNET_SDK
ARG IMAGE_NAME__DOTNET_RUNTIME
ARG IMAGE_TAG__DOTNET_RUNTIME


FROM ${IMAGE_NAME__DOTNET_SDK}:${IMAGE_TAG__DOTNET_SDK} as deps
ARG NUGET_PROXY_REPO
ARG NUGET_REPO
WORKDIR /app/
COPY .sonarlint* /app/.sonarlint
COPY src /app/src
COPY tests* /app/tests
COPY *.sln /app/
COPY Directory.Build.props* /app/Directory.Build.props
RUN dotnet restore -r linux-musl-x64 --source=${NUGET_PROXY_REPO} --source=${NUGET_REPO} 


FROM deps as build
ARG CI_PROJECT_NAME
ARG CI_PROJECT_URL
ARG CI_PROJECT_TITLE
ARG ARTIFACT_VERSION
RUN dotnet build -c Release -p:Version=${ARTIFACT_VERSION} -p:OutputPath=/app/build --no-restore 



FROM build as test
WORKDIR /app
RUN dotnet test -c Release --runtime linux-musl-x64 --nologo --no-restore -v normal --results-directory test-results --collect:"XPlat Code Coverage" 
RUN count=0 && \
    total_coverage=0 && \
    for i in $(find ./test-results/ -name 'coverage.cobertura.xml'); \
    do \
        coverage="$(sed -nr 's/.*coverage line-rate="([^"]*)".*/\1/p' ${i})" && \
        coverage_percentage="$(printf "%.2f%%" $(echo "${coverage}*100" | bc))" && \
        total_coverage=$(echo "${total_coverage}+${coverage}" | bc) && \
        count=$(echo "${count}+1" | bc) && \
        printf 'Partial Coverage: %s\n' "${coverage_percentage}"; \
    done; \
    total_percentage="$(printf "%.2f%%" $(echo "${total_coverage}*100" | bc))" && \
    printf 'Found total of %s report(s)\n' "${count}"; \
    printf 'Total Coverage: %s\n' "${total_percentage}";



FROM build as package-lib
ARG CI_PROJECT_NAME
ARG CI_PROJECT_URL
ARG CI_PROJECT_TITLE
ARG ARTIFACT_VERSION
RUN dotnet pack -p:PackageOutputPath=/app/artifact -p:PackageVersion=${ARTIFACT_VERSION} /p:Version=${ARTIFACT_VERSION} --no-restore 


FROM package-lib as publish
ARG ARTIFACT_VERSION
RUN if cat /app/src/**/*.csproj | grep -qi "<IsPackable>true"; then \
        dotnet nuget push "/app/artifact/*.${ARTIFACT_VERSION}.nupkg" --source rshb-nexus; \
    fi


FROM publish as package
ARG CI_PROJECT_NAME
ARG CI_PROJECT_URL
ARG CI_PROJECT_TITLE
ARG ARTIFACT_VERSION
WORKDIR /app

# Выполняем публикацию не всего решения (.sln), а только исполняемого проекта (.csproj).
# Исполняемый модуль определяется по свойству <OutputType>, нас интересует 'Exe'.
# Согласно требованиям ожидаем в решении только один исполняемый проект.
# Сделано для того, чтобы избежать перезатирания одной зависимости разных версий.
RUN executable_csproj="" && \
    for csproj in $(dotnet sln list | grep csproj); do \
        echo "Найден проект: $csproj"; \
        if grep -q "<OutputType>Exe</OutputType>" "$csproj"; then \
            echo "Найден исполняемый (Exe) проект: $csproj"; \
            executable_csproj="$csproj"; \
            break; \
        fi \
    done; \
    if [ -z "$executable_csproj" ]; then \
        echo "Ошибка: не найден исполняемый (Exe) проект в решении, сборка будет прервана." >&2 \
        && exit 1; \
    fi; \
    dotnet publish $executable_csproj -c Release -p:Version=${ARTIFACT_VERSION} --self-contained=false -p:PublishDir=/app/publish ;

FROM ${IMAGE_NAME__DOTNET_RUNTIME}:${IMAGE_TAG__DOTNET_RUNTIME} as runtime

WORKDIR /app



COPY --from=package /app/publish .
USER 1000
ENTRYPOINT ["./cs-onboarding"]


2 dockerfile
ARG IMAGE_NAME__DOTNET_SDK
ARG IMAGE_TAG__DOTNET_SDK
ARG IMAGE_NAME__DOTNET_RUNTIME
ARG IMAGE_TAG__DOTNET_RUNTIME


FROM ${IMAGE_NAME__DOTNET_SDK}:${IMAGE_TAG__DOTNET_SDK} as deps
ARG NUGET_PROXY_REPO
ARG NUGET_REPO
WORKDIR /app/
COPY .sonarlint* /app/.sonarlint
COPY src /app/src
COPY tests* /app/tests
COPY *.sln /app/
COPY Directory.Build.props* /app/Directory.Build.props
RUN dotnet restore -r linux-musl-x64 --source=${NUGET_PROXY_REPO} --source=${NUGET_REPO} 


FROM deps as build
ARG CI_PROJECT_NAME
ARG CI_PROJECT_URL
ARG CI_PROJECT_TITLE
ARG ARTIFACT_VERSION
RUN dotnet build -c Release -p:Version=${ARTIFACT_VERSION} -p:OutputPath=/app/build --no-restore 



FROM build as test
WORKDIR /app
RUN dotnet test -c Release --runtime linux-musl-x64 --nologo --no-restore -v normal --results-directory test-results --collect:"XPlat Code Coverage" 
RUN count=0 && \
    total_coverage=0 && \
    for i in $(find ./test-results/ -name 'coverage.cobertura.xml'); \
    do \
        coverage="$(sed -nr 's/.*coverage line-rate="([^"]*)".*/\1/p' ${i})" && \
        coverage_percentage="$(printf "%.2f%%" $(echo "${coverage}*100" | bc))" && \
        total_coverage=$(echo "${total_coverage}+${coverage}" | bc) && \
        count=$(echo "${count}+1" | bc) && \
        printf 'Partial Coverage: %s\n' "${coverage_percentage}"; \
    done; \
    total_percentage="$(printf "%.2f%%" $(echo "${total_coverage}*100" | bc))" && \
    printf 'Found total of %s report(s)\n' "${count}"; \
    printf 'Total Coverage: %s\n' "${total_percentage}";



FROM build as package-lib
ARG CI_PROJECT_NAME
ARG CI_PROJECT_URL
ARG CI_PROJECT_TITLE
ARG ARTIFACT_VERSION
RUN dotnet pack -p:PackageOutputPath=/app/artifact -p:PackageVersion=${ARTIFACT_VERSION} /p:Version=${ARTIFACT_VERSION} --no-restore 


FROM package-lib as publish
ARG ARTIFACT_VERSION
RUN if cat /app/src/**/*.csproj | grep -qi "<IsPackable>true"; then \
        dotnet nuget push "/app/artifact/*.${ARTIFACT_VERSION}.nupkg" --source rshb-nexus; \
    fi


FROM publish as package
ARG CI_PROJECT_NAME
ARG CI_PROJECT_URL
ARG CI_PROJECT_TITLE
ARG ARTIFACT_VERSION
WORKDIR /app

# Выполняем публикацию не всего решения (.sln), а только исполняемого проекта (.csproj).
# Исполняемый модуль определяется по свойству <OutputType>, нас интересует 'Exe'.
# Согласно требованиям ожидаем в решении только один исполняемый проект.
# Сделано для того, чтобы избежать перезатирания одной зависимости разных версий.
RUN executable_csproj="" && \
    for csproj in $(dotnet sln list | grep csproj); do \
        echo "Найден проект: $csproj"; \
        if grep -q "<OutputType>Exe</OutputType>" "$csproj"; then \
            echo "Найден исполняемый (Exe) проект: $csproj"; \
            executable_csproj="$csproj"; \
            break; \
        fi \
    done; \
    if [ -z "$executable_csproj" ]; then \
        echo "Ошибка: не найден исполняемый (Exe) проект в решении, сборка будет прервана." >&2 \
        && exit 1; \
    fi; \
    dotnet publish $executable_csproj -c Release -p:Version=${ARTIFACT_VERSION} --self-contained=false -p:PublishDir=/app/publish ;

FROM ${IMAGE_NAME__DOTNET_RUNTIME}:${IMAGE_TAG__DOTNET_RUNTIME} as runtime

WORKDIR /app



COPY --from=package /app/publish .
USER 1000
ENTRYPOINT ["./cs-onboarding"]