environment.yml 単体では解が揺れます。ミラー端点・並列・再試行・lock 受入を一枚にします。越境では帯域が律速になりやすく、表で固定すると運用が楽です。ホーム・技術ブログ一覧・Helm OCI 越境表参照。
越境 CI で先に潰す三点
ミラー順のズレ、429、lock 不在が典型です。runner 間で設定が食い違うと同じ yml でも解が変わるため .condarc を IaC 配布します。
channel_alias/default_channelsを IaC で統一。MAMBA_DOWNLOAD_THREADSを絞り 4→12→30→90 秒で再試行。conda-lockまたは explicit でenvironment.ymlと突合。
決定マトリクス:conda/mamba/micromamba
| 実装 | 用途 | 越境メモ |
|---|---|---|
| conda | 既存手順踏襲 | solver と CONDA_PKGS_DIRS を明示 |
| mamba | 大規模 solve | 高速・CONDA_SOLVER=libmamba |
| micromamba | 軽量 runner | MAMBA_ROOT_PREFIX 隔離 |
本番と CI は同一 .condarc、差分は lock で吸収。
チャンネルとミラー端点の設計
channels は上から優先。channel_alias は全ジョブ同一、conda info で突合。プロキシは HTTPS_PROXY と CA。
export CONDA_PKGS_DIRS="${CONDA_PKGS_DIRS:-$HOME/ci-cache/conda/pkgs}"
export MAMBA_ROOT_PREFIX="${MAMBA_ROOT_PREFIX:-$HOME/ci-mamba-root}"
# .condarc 例: channel_alias / channels / default_channels をプレースホルダから置換
並列インストールとワーカー数
| 変数 | 越境目安 | メモ |
|---|---|---|
MAMBA_DOWNLOAD_THREADS | 2〜4 | 429 なら減らす |
CONDA_SOLVER | libmamba | classic 差は lock で吸収 |
CONDA_PKGS_DIRS | runner 専用 | 共有はファイルロック競合 |
帯域が細いほどスレッドを絞るほうが総時間が短い場合があります。
失敗時の再試行
CONDA_HTTP_MAX_RETRIES を上げ、429 ではスレッドを一段下げて再実行。
export CONDA_HTTP_MAX_RETRIES="${CONDA_HTTP_MAX_RETRIES:-8}"
for i in 1 2 3 4; do
micromamba create -y -n ci-env -f environment.yml && break
case "$i" in 1) sleep 4;; 2) sleep 12;; 3) sleep 30;; *) sleep 90;; esac
done
lockfile/エクスポートと environment.yml の一致
| 成果物 | 受入 |
|---|---|
environment.yml | チャンネル行がレビュー済み |
conda-lock | CI は lock のみから install |
| explicit export | 宣言との差分を PR で確認 |
基準:lock 差分は PR 必須、osx-arm64 を matrix に。export は --from-history 優先。
実装手順(五ステップ)
① .condarc でミラー固定 ② CONDA_PKGS_DIRS/MAMBA_ROOT_PREFIX 専用パス ③ conda-lock lock -f environment.yml ④ CI は lock のみから create+バックオフ ⑤ conda env export --from-history で確認。
FAQ
Q. yml だけで再現できない
A. conda-lock か explicit を併用し PR で差分を見る。
Q. 解が食い違う
A. CONDA_SOLVER と .condarc を揃え、最終的に lockfile で一本化。
Q. repodata がタイムアウト
A. ミラーを近接に寄せ、MAMBA_DOWNLOAD_THREADS を下げ、バックオフ後に再試行。
まとめと次の一手(購入・資料)
要点は端点固定・並列と再試行・lock 受入。2026は越境帯域が律速になりやすい。