Раздельные задания в конвейере CI приводят к очень долгому запуску конвейера
У меня была версия следующего конвейера, которая выполнялась как одно задание, и все это заняло менее 6 минут. Затем я обновил конвейер, чтобы разбить его на отдельные задания, чтобы было легче узнать, какие из них вышли из строя, и теперь общий конвейер составляет 15+ минут. Я могу только предположить, что каждое задание считается отдельным конвейером с процессом разрыва / останова, который занимает много времени для четырех разных заданий. Я ищу совет, как провести рефакторинг этого GitLab CI, чтобы вернуться к исходному периоду 6 или меньше:
image: cirrusci/flutter:stable
before_script:
- flutter pub get
- flutter clean
- flutter --version
stages:
- build-aot
- analyze
- format-check
- test-on-machine-with-coverage
build-aot:
stage: build-aot
script:
- flutter build aot
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
analyze:
stage: analyze
script:
- flutter analyze
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
format-check:
stage: format-check
script:
- flutter format --set-exit-if-changed lib test
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
test-on-machine-with-coverage:
stage: test-on-machine-with-coverage
script:
- flutter pub global activate junitreport
- export PATH="$PATH":"$HOME/.pub-cache/bin"
- flutter test --machine | tojunit -o report.xml
- flutter test --coverage ./lib
- lcov -r coverage/lcov.info '*/__test*__/*' -o coverage/lcov_cleaned.info
- genhtml coverage/lcov_cleaned.info --output=coverage
artifacts:
when: always
paths:
- rspec.xml
- coverage
reports:
junit:
- report.xml
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
1 ответ
Конвейер обычно определяется как серия заданий (согласно документации Gitlab ), поэтому для правильного написания сценария CI / CD вашего репозитория, где разделение функций ваших заданий сохраняет производительность, аналогичную тому, когда они были вместе, обычной практикой является реализация кэширования между этапами .
Кэширование позволяет должным образом изолировать среду выполнения каждого задания, одновременно оптимизируя скорость и пропускную способность, поскольку позволяет избежать загрузки или создания одних и тех же файлов несколько раз.
Теперь давайте посмотрим на ваш
gitlab-ci.yml
код, чтобы реализовать кэширование для оптимизации времени выполнения конвейера. В документации Flutter говорится, что глобальный кеш создается после установки каждого пакета, и поэтому вам нужно устанавливать только один раз для каждой сборки , и он находится по адресу
.pub-cache
:
image: cirrusci/flutter:stable
variables:
PUB_CACHE: $CI_PROJECT_DIR/.pub-cache #https://docs.gitlab.com/ee/ci/yaml/README.html#cachepaths
cache:
key: ${CI_COMMIT_REF_SLUG} #Only use one cache per whole pipeline
paths:
- .pub-cache/
before_script:
- flutter pub cache --all #https://dart.dev/tools/pub/cmd/pub-cache
- flutter --version
stages:
- build-aot
- analyze
- format-check
- test-on-machine-with-coverage
build-aot:
stage: build-aot
script:
- flutter build aot
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
analyze:
stage: analyze
script:
- flutter analyze
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
format-check:
stage: format-check
script:
- flutter format --set-exit-if-changed lib test
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
test-on-machine-with-coverage:
stage: test-on-machine-with-coverage
script:
- flutter pub global activate junitreport
- export PATH="$PATH":"$HOME/.pub-cache/bin"
- flutter test --machine | tojunit -o report.xml
- flutter test --coverage ./lib
- lcov -r coverage/lcov.info '*/__test*__/*' -o coverage/lcov_cleaned.info
- genhtml coverage/lcov_cleaned.info --output=coverage
artifacts:
when: always
paths:
- rspec.xml
- coverage
reports:
junit:
- report.xml
only:
- master
- merge_requests
except:
variables:
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master"
Это будет по-прежнему загружать ваши пакеты через каждую новую серию конвейеров (при фиксации изменения), удаляя
key:
flag должен сохранять кеш, пока вы вручную не удалите его в интерфейсе Gitlab.