برنامه نویسی

فشرده سازی فضای دیسک از دونده اقدامات GitHub: راهنمای مهندس

هفته گذشته من برنامه Lingo.dev خود را به عنوان یک تصویر Docker از یک عمل Github مستقر کردم. و برای استقرار آن ، مجبور شدم آن را در یک دونده میزبان Github ایجاد کنم. با این حال من به حد مجاز رسیدم:

“شما از فضای دیسک خارج می شوید.”

آیا تا به حال به این شکست ناگهانی و مرموز در گردش کار GitHub خود نیز برخورد کرده اید؟

با افزایش خطوط لوله CI ما در پیچیدگی و اندازه ، ما از فضای دیسک در دونده های میزبان Github استفاده می کنیم. در این راهنمای عملی ، من به شما نشان خواهم داد که دیسک را پر می کند ، چگونه آن را تجزیه و تحلیل کردم ، و چه کاری را انجام دادم تا فضای کافی را پس بگیرم تا دوباره ساختم را قابل اعتماد کنم.

💡 tl ؛ دکتر به فصل 6 بروید و مرحله عمل GitHub را برای تمیز کردن دونده میزبان GitHub خود کپی کنید.

1. محدودیت های دوندگان میزبان GitHub

دوندگان میزبان GitHub با طیف گسترده ای از زبان های برنامه نویسی ، SDK ها و ابزارهای مختلف بارگذاری می شوند. این برای راحتی عالی است ، اما تجارت نفخ است. در اینجا یک چیز معمولی است ubuntu-latest Runner شامل:

  • زبانهای از پیش نصب شده: جاوا (چند JDK) ، .net ، پایتون ، روبی ، GO ، Swift ، Haskell (GHC) ، Julia ، Node.js
  • ابزارهای توسعه دهنده: Android SDK ، Docker ، Azure CLI ، Google Cloud SDK ، CodeQL ، مرورگرها (Chrome ، Edge ، Firefox) ، Chromium
  • متفرقه: PowerShell ، Rust Toolchains ، LLVM ، ابزار اشکال زدایی

از دیسک کل 72 گیگابایتی ، بیش از 50 گیگابایت قبل از اجرای هر مرحله گردش کار استفاده می شود.

2. ضربه زدن به دیوار: علائم من

من با استفاده از گردش کار اقدامات GitHub در حال ساخت و استقرار تصاویر Docker بودم. همه چیز خوب کار کرد تا اینکه کار به طور ناگهانی با خطای فضای دیسک در مرحله ساخت Docker انجام نشد.

You are running out of disk space. The runner will stop working when the machine runs out of disk space. Free space left: 54 MB
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این باعث شد تا بفهمم چه چیزی در واقع تمام فضا را می خورد.

3. اندازه گیری جانور: چقدر استفاده می شود و کجا

برای درک مشکل ، مراحل زیر را به گردش کار Actions GitHub اضافه کردم:

- name: Show disk usage
  run: df -h

- name: Top-level directories
  run: du -h -d1 / | sort -hr | head -n 20

- name: Detailed file sizes
  run: find / -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 1000
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این چیزی است که من پیدا کردم:

  • /usr: 34 گیگابایت – این دایرکتوری بیشتر نرم افزار سیستم را در اختیار دارد و زمان های از پیش نصب شده مانند جاوا ، سوئیفت و .NET را نصب می کند. این اغلب بزرگترین است.
  • /opt: 11 گیگابایت-حاوی وسایل نقلیه میزبان برای مواردی مانند CodeQL ، GO و ابزارهای خاص زبان است که اقدامات GitHub را از قبل نصب می کند.
  • /mnt: 4.1 گیگابایت – معمولاً برای مونتاژ موقت یا پرونده های زودگذر استفاده می شود. بعضی اوقات شامل فضای خراش است که در طول ساخت و ساز استفاده می شود.
  • /home: 1.2 گیگابایت-داده های سطح کاربر ، از جمله پیکربندی خاص دونده ، حافظه پنهان و مواردی مانند ابزار Rustup را ذخیره می کند.

با نگاه نزدیک تر ، مشخص بود که /usr/share/swiftبا /usr/local/.ghcupوت /usr/local/lib/android برخی از بزرگترین گرازهای فضایی بودند.

4. چه چیزی در دوندگان شما پنهان است؟

بیشتر دیسک توسط چیزهایی که من نیازی به آن ندارم گرفته شده است. در اینجا یک شکست:

زبانها و زمان های اجرا

ابزار مسیر اندازه تقریبی
جاوا /usr/lib/jvm ~ 1.5 گیگابایت
.net /usr/share/dotnet ~ 1.5 گیگابایت
سریع /usr/share/swift 2.5 گیگابایت پوند
هاسکل /usr/local/.ghcup 3 گیگابایت پوند
زنگ زدن /home/runner/.rustup ~ 1.5 گیگابایت
جولیا /usr/local/julia* 500 مگابایت پوند
Android SDK /usr/local/lib/android/sdk 6 گیگابایت پوند
مرورگرها /usr/local/share/chromium، و غیره ~ 1.5 گیگابایت

ابزارهای توسعه دهنده

ابزار مسیر اندازه تقریبی
codeql /opt/hostedtoolcache/CodeQL 2 گیگابایت پوند
پودر /usr/local/share/powershell 800 مگابایت
لاجورد کلی /opt/az 200 مگابایت پوند
Google SDK /usr/lib/google-cloud-sdk 200 مگابایت پوند

5. چه چیزی را می توانید با خیال راحت حذف کنید؟ 🗑

بسته به مورد استفاده شما ، می توانید ابزارهای مختلفی را حذف کنید. از آنجا که من در حال ساخت و استقرار تصاویر Docker برای یک برنامه Node.js بودم ، به SDK ها و زبان های از پیش نصب شده احتیاج نداشتم.

در اینجا چند مثال آورده شده است:

  • node.js پروژه: Java ، .net ، Swift ، Haskell ، Android SDK ، CodeQL را حذف کنید
  • اسکریپت های پایتون: جاوا ، دات نت ، اندروید ، مرورگرها را حذف کنید
  • برنامه جاوا: Swift ، Haskell ، CodeQL ، Node.js ، Android SDK را حذف کنید

به طور کلی ، اگر از آنها برای آزمایش پایان به پایان استفاده نمی کنید ، می توانید مرورگرهایی مانند Chromium را حذف کنید.

6. چگونه می توان پاکسازی را در CI خود خودکار کرد

من این مرحله را به بالای گردش کار اقدامات GitHub اضافه کردم:

- name: Aggressive cleanup
  run: |
    # Remove Java (JDKs)
    sudo rm -rf /usr/lib/jvm

    # Remove .NET SDKs
    sudo rm -rf /usr/share/dotnet

    # Remove Swift toolchain
    sudo rm -rf /usr/share/swift

    # Remove Haskell (GHC)
    sudo rm -rf /usr/local/.ghcup

    # Remove Julia
    sudo rm -rf /usr/local/julia*

    # Remove Android SDKs
    sudo rm -rf /usr/local/lib/android

    # Remove Chromium (optional if not using for browser tests)
    sudo rm -rf /usr/local/share/chromium

    # Remove Microsoft/Edge and Google Chrome builds
    sudo rm -rf /opt/microsoft /opt/google

    # Remove Azure CLI
    sudo rm -rf /opt/az

    # Remove PowerShell
    sudo rm -rf /usr/local/share/powershell

    # Remove CodeQL and other toolcaches
    sudo rm -rf /opt/hostedtoolcache

    docker system prune -af || true
    docker builder prune -af || true
    df -h
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این به تنهایی بیش از 20 گیگابایت فضا را نجات داد.

7. جایزه: ورود به سیستم و اشکال زدایی استفاده از دیسک به مرور زمان

برای توجه به روند استفاده از دیسک یا خرابی اشکال زدایی ، من سیاهههای دیسک را به عنوان مصنوعات بارگذاری کردم:

- name: Upload disk logs
  uses: actions/upload-artifact@v3
  with:
    name: disk-logs
    path: logs/
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

من با استفاده از ابزارهایی مانند ، سیاههها را تولید می کنم dfبا duوت find، و از آنها برای ممیزی های آینده استفاده کنید.

8. افکار نهایی

فضای دیسک می تواند خط لوله های CI/CD شما را بی سر و صدا بشکند. دوندگان میزبان GitHub با ابزارهای مفید پر شده اند ، اما بسیاری از آنها برای پروژه شما غیر ضروری هستند. با ممیزی و حذف آنچه لازم نیست ، توانستم به طور مداوم 15-25 گیگابایت از فضا را پس بگیرم و ساخت Docker را با اطمینان اجرا کنم.

در صورت تمایل به استفاده از پاکسازی تهاجمی مرحله (به بالا مراجعه کنید) در عمل GitHub خود.

اگر به مشکلات دیسک می پردازید ، به دوندگان بزرگتر پرش نکنید. با تمیز کردن آنچه استفاده نمی کنید شروع کنید.


اگر مسئله مشابهی داشتید در X @Mathio28 به من اطلاع دهید.

عمل جیتوب

تصاویر:

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا