Вопрос или проблема
У меня есть действие 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 может быть достаточно разнообразной в зависимости от платформы, на которой выполняется сборка. Судя по предоставленным вами данным о времени сборки для различных операционных систем, действительно наблюдаются значительные различия.
Сравнительный анализ
- Время сборки:
- Windows: 1 минута 45 секунд
- MacOS: 43 секунды
- Ubuntu: 48 секунд
Как видно, Windows значительно отстает от MacOS и Ubuntu, что может быть связано с несколькими факторами:
-
Настройка .NET:
- MacOS устанавливает .NET за 7 секунд, тогда как Windows требует 17 секунд. Это может быть следствием различий в процессах инициализации и настройке окружения для .NET.
-
Восстановление зависимостей:
- Учитывая что Windows выполняет его медленнее, вероятными причинами могут быть:
- Наличие других фоновый служб, которые могут замедлять процесс.
- Особенности работы Windows с файловой системой, которые могут привести к большему времени на доступ к файловым ресурсам.
- Учитывая что Windows выполняет его медленнее, вероятными причинами могут быть:
-
Публикация проекта:
- Подобно восстановлению зависимостей, время сборки и публикации на Windows может быть замедлено из-за особенностей компиляции и взаимодействия между библиотеками и системными вызовами, которые могут не оптимально обрабатывать задачи в Windows.
Оптимизация Windows сценария
-
Используйте кэширование:
- Активируйте кэширование для зависимостей, чтобы избежать повторного восстановления при каждой сборке. Это можно сделать, добавив шаги для кэширования кода:
- name: Cache NuGet packages uses: actions/cache@v3 with: path: ~/.nuget/packages key: ${{ runner.os }}-${{ hashFiles('**/*.csproj') }} restore-keys: | ${{ runner.os }}-
- Активируйте кэширование для зависимостей, чтобы избежать повторного восстановления при каждой сборке. Это можно сделать, добавив шаги для кэширования кода:
-
Убедитесь, что вы используете многоядерный режим сборки:
- Используйте флаг
--parallel
во время построения, если это возможно. Для .NET это делается автоматически, но стоит проверить, что ваш проект правильно настроен для параллельной сборки.
- Используйте флаг
-
Оптимизация рабочего окружения:
- Убедитесь, что в настройках Windows экшенов отключены все ненужные службы и процессы, которые могут замедлять работу.
-
Использование подходящего образа Windows:
- Проверьте, используете ли вы самый подходящий образ для вашего проекта. Например, смените
windows-latest
на более специфический образ, который будет легче и быстрее.
- Проверьте, используете ли вы самый подходящий образ для вашего проекта. Например, смените
-
Обновите версии инструментов:
- Убедитесь, что вы используете последние версии зависимостей и самого .NET SDK, так как новые версии часто приходят с исправлениями и оптимизациями производительности.
Заключение
Выявленные вами различия в времени сборки между Windows, MacOS и Ubuntu вполне ожидаемы. Оптимизация процесса сборки может значительно сократить время, затрачиваемое на выполнение действий на Windows. Рекомендуется применять вышеприведенные методы для повышения общей производительности.