gazou-compressor.jp

CIでの LQIP/BlurHash/SVG プレースホルダ自動生成パイプライン

LQIP/BlurHash/Tiny SVG を手動でコミットしていると 漏れと劣化の放置 が発生します。CI による差分検知と自動再生成で再現性とコストを最適化します。

要約
  • git diff → 変更画像バッチ分割 (並列)
  • 各バッチで LQIP / BlurHash / SVG 生成
  • artifact or branch に集約 → deploy フェーズで pull

1. アーキテクチャ概要

変更検知層 / 生成層 / キャッシュ層 / 提供層 の4段に分割します。生成物は本番リポジトリへ直コミットしない方式が 履歴肥大防止 に有効です。

役割主な失敗パターン
変更検知差分抽出・再生成判定追跡漏れ / rename検出失敗
生成並列バッチ処理CPU過負荷 / OOM
キャッシュハッシュ+パラメータ一致過剰ミスヒット
提供artifact集約/配信サイズ肥大

2. 処理フロー (HowTo)

  1. 変更画像リストを抽出(rename 差分含む)
  2. バッチ分割(例: 4並列)
  3. LQIP/BlurHash/SVG 生成 + メタ記録
  4. キャッシュ判定 → ヒットはスキップ
  5. artifact に集約 / ブランチへ push

3. 実装断片

3.1 Job Matrix

# matrix (GitHub Actions) — changed images batched
jobs:
  placeholders:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        batch: [0,1,2,3]
    steps:
      - uses: actions/checkout@v4
      - name: Detect changed images
        run: |
          node scripts/list-changed-images.js > changed.txt
          node scripts/split-batch.js changed.txt $MATRIX_BATCH 4 > targets.txt
      - name: Generate placeholders
        run: node scripts/gen-placeholders.js --input targets.txt --out out/
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: placeholders-$MATRIX_BATCH
          path: out/

3.2 生成スクリプト

// gen-placeholders.js (simplified)
for (const file of targetFiles){
  const lqip = await buildLqip(file, { width: 32 });
  const blur = encodeBlurHash(await loadPixels(file), 4, 3);
  const svg  = await buildTinySvg(file, { polygons: 24 });
  db.push({ file, lqip, blur, svg });
}
await fs.promises.writeFile('out/meta.json', JSON.stringify(db));

3.3 キャッシュ設定

# actions/cache — toolchain & prior results
- uses: actions/cache@v4
  with:
    path: .cache/placeholders
    key: placeholders-<HASH_OF_PACKAGE_LOCK>
    restore-keys: |
      placeholders-

3.4 PR コメント組立

// PR コメント用: changed placeholder preview
for (const item of changed){
  md += '### ' + item.file + '
';
  md += 'LQIP: ![](' + item.lqip + ')  BlurHash: `' + item.blur + '`  SVG: <img src="' + item.svg + '" width="80" />
';
}
postComment(md);

3.5 差分ハッシュ無効化

# hash & param based invalidation (pseudo)
BASE64=$(sha256sum "$IMG" "$PARAMS_JSON")
if grep -q "$BASE64" meta-index.tsv; then
  echo "cache-hit"; exit 0
fi
# ... generate ...
echo "$BASE64	$IMG" >> meta-index.tsv

4. キャッシュ戦略の深掘り

パラメータ (幅/アルゴリズム/多角形数) と入力ファイルハッシュをキー化。ヒット率が低下したらパラメータ変更/閾値を検討します。

5. レビューUX改善

PRコメントに プレースホルダ生成ツール の URL を埋め、 preview=hash で即比較できるリンクを用意するとレビュー効率が上がります。

6. FAQ

7. まとめ

差分検知→並列生成→キャッシュ→アーティファクト集約 の4要素を押さえればプレースホルダ生成は完全自動化できます。手動メンテを減らし品質議論へシフトしましょう。

gazou-compressor.jp 編集部

画像圧縮・変換・背景除去などの実践テクニックと、Webで“速く・軽く・崩さない”ためのノウハウを発信しています。

関連記事

トピック/更新日の近いコンテンツ