Open7

GitHub Actions のストレージ空き容量を限界まで拡張する

PINTOPINTO
  • Actions スタート時点でいきなり 27GB 前後の空き容量の状態から 63GB 前後まで空き容量を増やせる
deploy.yml
name: Container deploy

on:
  release:
    types: [published]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: pinto0309/test

jobs:
  docker-deploy:
    runs-on: ubuntu-22.04
    permissions:
      contents: read
      packages: write
    steps:
      - name: Git checkout
        uses: actions/checkout@v3
      - name: Enable buildx
        uses: docker/setup-buildx-action@v2
      - name: Check space before cleanup
        run: df -h
      - name: Clean space as per https://github.com/actions/virtual-environments/issues/709
        run: |
          docker images
          sudo rm -rf "/opt/ghc" || true
          sudo rm -rf "/usr/share/dotnet" || true
          sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true
          sudo rm -rf "/usr/local/lib/android" || true
          sudo rm -rf "/usr/local/share/boost" || true
          docker rmi $(docker image ls -q --filter "reference=node*")
          docker rmi $(docker image ls -q --filter "reference=debian*")
          docker rmi $(docker image ls -q --filter "reference=alpine*")
          docker rmi $(docker image ls -q --filter "reference=ubuntu:20.04")
      - name: apt-get remove cleanup
        run: |
          sudo apt purge -y \
            ansible* \
            aria2* \
            aspnetcore* \
            azure-cli* \
            cabal* \
            clang* \
            dotnet-* \
            firefox* \
            gfortran-* \
            ghc* \
            google-chrome-stable* \
            google-cloud-sdk* \
            heroku* \
            imagemagick* \
            javascript* \
            kubectl* \
            llvm* \
            mono* \
            mysql* \
            nginx* \
            node* \
            npm* \
            nuget* \
            php* \
            postgresql* \
            powershell* \
            rpm* \
            ruby* \
            sqlite3* \
            subversion \
            temurin* \
            tmux* \
            vim* \
            yarn*
          sudo apt-get autoremove -y >/dev/null 2>&1 || true
          sudo apt-get autoclean -y >/dev/null 2>&1 || true
      - name: Check space after cleanup
        run: df -h
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          flavor: |
            latest=false
            prefix=
            suffix=
          tags: |
            type=schedule,pattern=nightly,enable=true,priority=1000
            type=ref,event=branch,enable=true,priority=600
            type=ref,event=tag,enable=true,priority=600
            type=ref,event=pr,prefix=pr-,enable=true,priority=600
            type=raw,value=latest,enable=${{ github.event.release.target_commitish == 'main' }}
      - name: Build and push Docker image
        uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
        with:
          context: .
          push: true
          provenance: false
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
PINTOPINTO
  • Before
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        84G   57G   27G  69% /
    tmpfs           3.4G  172K  3.4G   1% /dev/shm
    tmpfs           1.4G  1.2M  1.4G   1% /run
    tmpfs           5.0M     0  5.0M   0% /run/lock
    /dev/sdb15      105M  6.1M   99M   6% /boot/efi
    /dev/sda1        14G  4.1G  9.0G  31% /mnt
    tmpfs           695M   12K  695M   1% /run/user/1001
    
  • After
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        84G   21G   63G  26% /
    tmpfs           3.4G  172K  3.4G   1% /dev/shm
    tmpfs           1.4G  1.2M  1.4G   1% /run
    tmpfs           5.0M     0  5.0M   0% /run/lock
    /dev/sdb15      105M  6.1M   99M   6% /boot/efi
    /dev/sda1        14G  4.1G  9.0G  31% /mnt
    tmpfs           695M   12K  695M   1% /run/user/1001
    
nb.onb.o

bazelとherokuが原因でapt purgeがエラーとなり、実行されていないことに気が付きました。
この2つのパッケージはaptでインストールされていません。

herokuを除外、bazelをnpmで削除(sudo npm uninstall bazel)することで空きスペースが53Gが58Gに増えました。

Free space:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        84G   26G   58G  31% /
tmpfs           3.4G  172K  3.4G   1% /dev/shm
tmpfs           1.4G  1.1M  1.4G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sdb15      105M  6.1M   99M   6% /boot/efi
/dev/sda1        14G  4.1G  9.0G  31% /mnt
tmpfs           694M   12K  694M   1% /run/user/1001
nb.onb.o

さらに不要なパッケージを削除することで63Gまで空きスペースを増やすことに成功しました。

  • /opt 配下はすべて削除
  • jvm, swift, julia, kotlinc, miniconda, phantomjs, sbt, sqlpackageのローカルインストールのディレクトリを削除
  • ブラウザ(firefox, edge)および、ブラウザのドライバーをすべて削除
  • dockerのイメージはすべて削除(docker image prune --all --force)
  • rustを削除
  • apt purge で削除するパッケージに追加
    firefox, mono-complete , nuget , apache2 , moby-engine, moby-cli , moby-buildx , moby-compose, microsoft-edge-stable, mongodb*, nginx , postgresql* , libpq-dev , r-base , sphinxsearch

ランナーにインストールされるパッケージはこちらを参考に削除しました。

コードはこちら
https://github.com/NobuoTsukamoto/my_actions_test/blob/main/.github/workflows/test_contains.yml#L33-L92

結果
https://github.com/NobuoTsukamoto/my_actions_test/actions/runs/5839168505/job/15837030736

Free space:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        84G   21G   63G  25% /
tmpfs           3.4G  172K  3.4G   1% /dev/shm
tmpfs           1.4G  1.1M  1.4G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  6.1M   99M   6% /boot/efi
/dev/sdb1        14G  4.1G  9.0G  31% /mnt
tmpfs           694M   12K  694M   1% /run/user/1001
PINTOPINTO

ありがとうございます! 最初のコメントのスクリプトを見直しますー

nb.onb.o

2024.2ごろ?からRunnerのVMが変更になったようで、利用できるスペースが約10Gほど減少してしまいました。/のサイズが73Gに減少したほか、/mntが74Gに増加など、かなり変更があります。

  • Before
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        84G   57G   27G  69% /
    tmpfs           3.4G  172K  3.4G   1% /dev/shm
    tmpfs           1.4G  1.2M  1.4G   1% /run
    tmpfs           5.0M     0  5.0M   0% /run/lock
    /dev/sdb15      105M  6.1M   99M   6% /boot/efi
    /dev/sda1        14G  4.1G  9.0G  31% /mnt
    tmpfs           695M   12K  695M   1% /run/user/1001
    
  • After
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/root        73G   53G   21G  72% /
    tmpfs           7.9G  172K  7.9G   1% /dev/shm
    tmpfs           3.2G  1.1M  3.2G   1% /run
    tmpfs           5.0M     0  5.0M   0% /run/lock
    /dev/sda15      105M  6.1M   99M   6% /boot/efi
    /dev/sdb1        74G  4.1G   66G   6% /mnt
    tmpfs           1.6G   12K  1.6G   1% /run/user/1001
    

うれしいことに/mntが74Gに増加したので、以前のテクニックを使わなくても約66Gの容量を使えます!(3Gも増加します!)
ただし、/mnt はパーミッションの関係でrunnerがすぐには使えないため、sudo、もしくはパーミッションを変更する必要があります。

sudo chown runner /mnt
cd /mnt



(実は、/mntの容量増えていることに気が付いたのがこれを書いていた時なので、、、)
ただ、それだけでは面白くないので、/の空きスペースを限界まで拡張するGitHub Actions Disk Space Challengeをやります。

不要と思われるファイルやパッケージの削除を限界まで進めました。
これにより、/約66Gの空きを確保できました。
前回に追加して、*-devパッケージやfont, icon, kernel-hedars...など自分の用途(meta-tensorflow-liteのビルド)に特化しています。runnerが成功するためだけですので、削除の方法もあやしいです。一歩間違えば、runnerが動作しません。
以下がActionsの設定ファイルです。

PINTOPINTO

VMの仕様が変わった(RAMの容量が増えたりデフォルトでインストールされているパッケージが変わった)のは実は気づいていたのですが、職場のほうの環境だけ修正してこっちのネタはアップデートしていなかったですね。。。ありがとうございます!