Anagonda環境をキャッシュすることによって、Githubアクションのビルド時間を減らす



概要
私のワークフローで最も時間のかかるタスクの一つは、アナコンダ環境の解決、ダウンロード、インストールです.場合によっては、依存関係を解決するだけで10分までを構築するプラットフォームに応じて取ることができます.
そういうわけで、私は常に私のワークフローの速度を上げる方法を探しています.例えば、非常によく知られている方法は、Blazing Fastmamba の代わりにパッケージマネージャconda .mamba はC +で書かれ、パラレルでファイルをダウンロードし、使用するlibsolv (Red Hat、Fedora、openSUSEのRPMパッケージマネージャで使用されている最新のライブラリの状態).
しかし、通常、これは私のために十分速くありません.また、協力者が引き要求にコミットを押すたびに、パッケージをダウンロードするリソースの浪費を見つけます.例えば、open source project 私は共同で、CIパイプラインは一日で100回以上起動することができます.
だからこそ、常にanaconda環境をキャッシュしたいが、今までの問題を解決するための時間がなかった.
のドキュメントactions/cache タスクは多くのパッケージマネージャの例を含みます.but not for Anaconda . 一方で、そのドキュメントはsetup-miniconda アクションはダウンロードされたパッケージをキャッシュする方法を説明しますがmakes the pipeline even slower .

The cache アクション
の範囲を理解することが重要ですcache アクション.からGitHub's documentation :

A workflow can access and restore a cache created in the current branch, the base branch (including base branches of forked repositories), or the default branch (usually main). For example, a cache created on the default branch would be accessible from any pull request. Also, if the branch feature-b has the base branch feature-a, a workflow triggered on feature-b would have access to caches created in the default branch (main), feature-a, and feature-b.



マイワークフロー
この例では、CIのパイプラインを次のような機能で記述する方法を示します.
  • 三大オペレーティングシステム( Linux , MacOS , Windows )で動作する
  • 更新24時間ごとにキャッシュ
  • キャッシュを更新するenvironment.yml 変更
  • キャッシュを手動でリセットすることができます
  • 始めましょう!

    引き金
    次のときにトリガされるパイプラインが必要です.
  • コミットは、メインリポジトリの任意のブランチにプッシュされます
  • コミットをプル要求にプッシュする
  • 毎日00 : 00 UTCで
  • name: ci
    
    on:
      push:
        branches:
          - '*'
    
      pull_request:
        branches:
          - '*'
    
      schedule:
        - cron: '0 0 * * *'
    
    env:
      CACHE_NUMBER: 0  # increase to reset cache manually
    
    The CACHE_NUMBER 変数は後で使用されます.

    プレフィックス
    我々は準備する必要があるmatrix MambaForge *の異なるインストールパスを処理するには、次の手順に従います.
    jobs:
      build:
    
        strategy:
          matrix:
            include:
              - os: ubuntu-latest
                label: linux-64
                prefix: /usr/share/miniconda3/envs/my-env
    
              - os: macos-latest
                label: osx-64
                prefix: /Users/runner/miniconda3/envs/my-env
    
              - os: windows-latest
                label: win-64
                prefix: C:\Miniconda3\envs\my-env
    
  • MambaForgeはMinicondaのカスタムビルドですmamba パッケージマネージャーconda-forge デフォルトのチャネルとして.

  • インストール
    ステップレベルでは、YAML環境ファイルを指定せずにMambaForgeをインストールします.
        name: ${{ matrix.label }}
        runs-on: ${{ matrix.os }}
        steps:
          - uses: actions/[email protected]
    
          - name: Setup Mambaforge
            uses: conda-incubator/[email protected]
            with:
                miniforge-variant: Mambaforge
                miniforge-version: latest
                activate-environment: my-env
                use-mamba: true
    

    キャッシュ
    キャッシュタスクは、キーで作業します.タスクが実行されると、キーに一致する保存されたキャッシュを探し、データを取得します.
    キャッシュはすべてのOSに固有です.また、私は、24時間ごとにキャッシュを更新するか、環境が変わったならば、キーを設定しました.
    The CACHE_NUMBER 上記の変数は手動でキャッシュをリセットするためのものです.
          - name: Set cache date
            run: echo "DATE=$(date +'%Y%m%d')" >> $GITHUB_ENV
    
          - uses: actions/[email protected]
            with:
              path: ${{ matrix.prefix }}
              key: ${{ matrix.label }}-conda-${{ hashFiles('environment.yml') }}-${{ env.DATE }}-${{ env.CACHE_NUMBER }}
            id: cache
    

    環境を更新
    最後に、キャッシュが利用できない場合は、YAML環境ファイルに従って環境を更新し、テストを実行します.
          - name: Update environment
            run: mamba env update -n my-env -f environment.yml
            if: steps.cache.outputs.cache-hit != 'true'
    
          - name: Run tests
            shell: bash -l {0}
            run: pytest ./tests
    

    結果
    にもかかわらずenvironment.yml ファイルはvery simple , 我々は、すべての実行で平均で5分を保存しました.


    コードを得る
    コードはここで入手できます.

    epassaro / cache-conda-envs
    Githubアクションでアナコンダ環境をキャッシュすることでビルドをスピードアップします
    キャッシュコンダ🐍 ⚡
    Githubアクションでアナコンダ環境をキャッシュすることでビルドをスピードアップします
    View on GitHub