Как опубликовать .Net 5 REST API в Google Cloud Run с помощью Github и Google Cloud Build

Создайте новый проект ASP.NET Core Web API.

Назовите проект и поместите его в корневую папку репозитория Github.

Выберите версию .net.

Здесь стоит отметить, что версия, которую вы используете .net, будет влиять на то, как должен быть настроен файл dockerfile, если вы хотите выбрать другую версию, не стесняйтесь, но необходимо будет адаптировать dockerfile.

Выберите опцию webapi для выполнения.

Запустите проект, выполните GET на /weatherforecast, чтобы убедиться, что все работает.

Перейдем к необходимым адаптациям в Program.cs

Program.cs

Внесите необходимые изменения в ваш Program.cs, чтобы он выглядел так, как показано в коде ниже:

using System;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace webapi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var port = Environment.GetEnvironmentVariable("PORT") ?? "8080";
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";

            if (environment == "Development")
            {
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
            }
            else
            {
                var url = new[]
                {
                    string.Concat("http://0.0.0.0:", port)
                };
                return Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>().UseUrls(url); });
            }
        }
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

В коде важно заметить блок else, в нем мы говорим, что когда среда не «Development», приложение должно подняться вверх, используя IP 0.0.0.0, это необходимо для того, чтобы приложение было видно вне контейнера, когда мы публикуем его в Cloud Run.

Dockerfile

Создайте Dockerfile в корне репозитория. Проверьте, находится ли ваш проект также в корне репозитория, если нет, переместите его в корень.

Заполните свой dockerfile приведенным ниже кодом:

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .

ENV ASPNETCORE_ENVIRONMENT Production

ENTRYPOINT ["dotnet", "webapi.dll"]
Войдите в полноэкранный режим Выход из полноэкранного режима

Важно изменить последнюю строку, имя файла .dll должно быть точно таким же, как имя основной DLL в вашем проекте.
Если структура папок в вашем проекте отличается от моей, вам может потребоваться изменить другие пункты в dockerfile.

Сохраните все и совершите.

Облачный запуск в GCP

Если хотите, создайте новый проект.

Найдите облачный запуск в строке поиска в середине верхней панели. Откройте продукт Cloud Run. Создайте новую службу.

Если вы создали новый проект или впервые используете Cloud Build, вам может потребоваться включить Cloud Build API.

Выберите Continuously deploy new revisions from a source repository и нажмите Setup With Cluod Build.

Важно: У меня уже был подключен аккаунт Github к GCP, поэтому я не смог сделать скриншоты этого шага, но если вы делаете это впервые, вам придется связать свой аккаунт Github с GCP.

Выберите проект, который вы хотите опубликовать.

Перейдите ко второму шагу и проверьте опцию Dockerfile. В поле Branch оставьте значение по умолчанию ^main$, чтобы Cloud Build срабатывала только при фиксации в главной ветке вашего репозитория, если вам нужна другая ветка, не стесняйтесь.

Заполните Имя службы, я оставил значение по умолчанию. Выберите регион, для примера я оставил регион по умолчанию.

В опции Autoscaling я оставил минимальное количество экземпляров равным нулю, это увеличивает время отклика на запрос, но снижает затраты, что в моем случае важнее. Если вы хотите уменьшить время отклика вашего приложения, оставьте хотя бы 1 на минимуме и вносите коррективы в зависимости от вашего объема.

Как и минимум, я оставил максимум в 1 экземпляр, потому что, опять же, для меня важнее не производительность, а стоимость. Если вы хотите повысить производительность, рассмотрите возможность увеличения максимального предела экземпляра, но помните, что это повлечет за собой расходы.

Наконец, вам нужно выбрать параметры Ingress и Authentication, в образовательных целях я оставил открытыми Allow all traffic и Allow unauthenticated invocations. Для производственных приложений следует искать дополнительную информацию для ограничения неаутентифицированного трафика и запросов.

Дополнительно: Откройте меню Container, Connections, Security и выполните настройки вашего контейнера относительно памяти, таймаута, максимального количества запросов на контейнер.

Для автоматического развертывания эти настройки не имеют значения, и вы можете изменить их в будущем.

Создайте свою услугу и ждите.

После завершения работы, если все прошло правильно, он будет выглядеть так, как показано на рисунке ниже.

Выделенная рамка на изображении выше — это публичный URL, сгенерированный GCP, с помощью которого вы можете получить доступ к нашему API на конечной точке /weatherforecast.

URL: https://democsharpgcpcloudrun-lwy2plkqfa-uc.a.run.app/weatherforecast

Заключение

С этого момента каждый новый коммит в основной части вашего репозитория Github будет публиковаться в Cloud Run

В Cloud Run есть функция Revisions, с помощью которой вы можете откатиться назад, если новая версия нарушает какой-то аспект вашего API.

Помимо возможности управления трафиком между двумя или более версиями, вы можете выполнять канареечное развертывание. К сожалению, пока что я не смог настроить автоматическое развертывание канарейки, если вы знаете, как это сделать, пожалуйста, напишите в комментариях.

Спасибо, что досидели до конца.

Оцените статью
devanswers.ru
Добавить комментарий