Раздельные задания в конвейере 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.

Другие вопросы по тегам