0

単一のジョブとして実行される次のパイプラインのバージョンがあり、このすべてに 6 分もかかりませんでした。次に、パイプラインを更新して個別のジョブに分割し、どれが失敗したかを簡単に把握できるようにしました。現在、パイプラインの合計は 15 分以上です。各ジョブは独自のパイプラインと見なされ、ティアアップ/ダウン プロセスには 4 つの異なるジョブで長い時間がかかると想定することしかできません。この 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"
4

1 に答える 1

0

パイプラインは一般的に一連のジョブとして定義されます ( Gitlab のドキュメントによると)。そのため、リポジトリの CI/CD を適切にスクリプト化して、ジョブ機能を分割してもそれらが一緒だったときと同様のパフォーマンスを維持するために、一般的な方法はキャッシュを実装することです。ステージ間

キャッシングを使用すると、同じファイルを何度もダウンロードまたはビルドすることを回避できるため、速度と帯域幅を同時に最適化しながら、各ジョブ ランタイム環境を適切に分離できます。

gitlab-ci.ymlパイプラインの実行時間を最適化するためのキャッシュを実装するために、コードを見てみましょう。Flutter のドキュメントによると、各パッケージをインストールするとグローバル キャッシュが作成されるため、ビルドごとに 1 回だけインストールする必要があり、次の場所にあり.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:フラグを削除すると、Gitlab のインターフェイスで手動で消去するまでキャッシュが保持されます。

于 2021-02-18T06:05:47.033 に答える