Время сборки .Net в Github Action: Windows vs MacOS vs Ubuntu

Вопрос или проблема

У меня есть действие Github, которое собирает .Net проект для:

ОС Время сборки
win-x64 1 мин 45 с
osx-x64 43 с
linux-x64 48 с
name: Сборка и выпуск

on:
  workflow_dispatch: 

permissions:
  contents: write

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [windows-latest, macos-latest, ubuntu-latest]

    steps:
      - name: Проверка кода
        uses: actions/checkout@v4

      - name: Установка .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.0.x'

      - name: Восстановление зависимостей
        run: dotnet restore src

      - name: Публикация проекта
        run: |
          dotnet publish ./src/MyProject -c Release -r ${{ matrix.os == 'windows-latest' && 'win-x64' || matrix.os == 'macos-latest' && 'osx-x64' || 'linux-x64'}} --self-contained -o ./publish/${{ matrix.os }} /p:Version=${{ env.VERSION }}
        env:
          DOTNET_CLI_TELEMETRY_OPTOUT: 1

Я заметил небольшое различие между Linux и OSX, но Windows постоянно как минимум в два раза превышает время и значительно отстает в:

  • настройке .Net
  • восстановлении зависимостей
  • сборке/публикации проекта

скриншот

Я предполагаю, что в Ubuntu уже установлен .Net 8, поэтому он пропускает этап установки .NET и у него там 0 секунд. Но MacOS занимает 7 секунд, в то время как Windows занимает 17 секунд на настройку .NET? Как это возможно?

Затем восстановление и сборка схожи для Linux и MacOS, но Windows значительно отстает, как так?

Существует ли способ оптимизировать сценарий для Windows?

Ответ или решение

Ответ на вопрос о времени сборки .NET в GitHub Actions: Windows vs MacOS vs Ubuntu

Работа с GitHub Actions и .NET может быть достаточно разнообразной в зависимости от платформы, на которой выполняется сборка. Судя по предоставленным вами данным о времени сборки для различных операционных систем, действительно наблюдаются значительные различия.

Сравнительный анализ

  1. Время сборки:
    • Windows: 1 минута 45 секунд
    • MacOS: 43 секунды
    • Ubuntu: 48 секунд

Как видно, Windows значительно отстает от MacOS и Ubuntu, что может быть связано с несколькими факторами:

  1. Настройка .NET:

    • MacOS устанавливает .NET за 7 секунд, тогда как Windows требует 17 секунд. Это может быть следствием различий в процессах инициализации и настройке окружения для .NET.
  2. Восстановление зависимостей:

    • Учитывая что Windows выполняет его медленнее, вероятными причинами могут быть:
      • Наличие других фоновый служб, которые могут замедлять процесс.
      • Особенности работы Windows с файловой системой, которые могут привести к большему времени на доступ к файловым ресурсам.
  3. Публикация проекта:

    • Подобно восстановлению зависимостей, время сборки и публикации на Windows может быть замедлено из-за особенностей компиляции и взаимодействия между библиотеками и системными вызовами, которые могут не оптимально обрабатывать задачи в Windows.

Оптимизация Windows сценария

  1. Используйте кэширование:

    • Активируйте кэширование для зависимостей, чтобы избежать повторного восстановления при каждой сборке. Это можно сделать, добавив шаги для кэширования кода:
      - name: Cache NuGet packages
      uses: actions/cache@v3
      with:
       path: ~/.nuget/packages
       key: ${{ runner.os }}-${{ hashFiles('**/*.csproj') }}
       restore-keys: |
         ${{ runner.os }}-
  2. Убедитесь, что вы используете многоядерный режим сборки:

    • Используйте флаг --parallel во время построения, если это возможно. Для .NET это делается автоматически, но стоит проверить, что ваш проект правильно настроен для параллельной сборки.
  3. Оптимизация рабочего окружения:

    • Убедитесь, что в настройках Windows экшенов отключены все ненужные службы и процессы, которые могут замедлять работу.
  4. Использование подходящего образа Windows:

    • Проверьте, используете ли вы самый подходящий образ для вашего проекта. Например, смените windows-latest на более специфический образ, который будет легче и быстрее.
  5. Обновите версии инструментов:

    • Убедитесь, что вы используете последние версии зависимостей и самого .NET SDK, так как новые версии часто приходят с исправлениями и оптимизациями производительности.

Заключение

Выявленные вами различия в времени сборки между Windows, MacOS и Ubuntu вполне ожидаемы. Оптимизация процесса сборки может значительно сократить время, затрачиваемое на выполнение действий на Windows. Рекомендуется применять вышеприведенные методы для повышения общей производительности.

Оцените материал
Добавить комментарий

Капча загружается...