गाइड

GitHub Actions का macOS बिल, कदम दर कदम घटाना

GitHub Actions पर ज़्यादातर macOS बिल ऐसे मिनटों से फूले होते हैं, जो टीम के कुछ काम नहीं आते। कैश फिर से बनाना। ऐसे मैट्रिक्स चलाना जिन्हें कोई नहीं पढ़ता। उन कमिट के जॉब पूरे करना, जिनकी जगह नए कमिट आ चुके हैं। यह बदलावों की चेकलिस्ट है। क्रम इस हिसाब से है कि कितने कम काम में कितनी बचत होती है। जहाँ काम आए, वहाँ YAML भी है।

1. पुराने पड़ चुके रन रद्द करें

जब कोई एक मिनट में दो बार पुश करता है, तो पहला रन बेकार जाता है। हर वर्कफ़्लो में एक ब्लॉक इसे रोक देता है:

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

2. जो बिल्ड नहीं है, उसे macOS से हटाएँ

लिंटिंग, फ़ॉर्मैटिंग जाँच, रिलीज़ नोट्स और Slack नोटिफ़िकेशन, सब Linux रनर पर दसवें हिस्से की कीमत में चलते हैं। शेयर्ड Swift पैकेज के यूनिट टेस्ट भी, जो UIKit को नहीं छूते। वर्कफ़्लो को एक Linux जॉब और उस पर निर्भर एक macOS जॉब में बाँटें। तब लिंट फ़ेल होने पर एक भी macOS मिनट खर्च नहीं होता।

3. वे पाथ कैश करें जिनमें असल में समय लगता है

होस्टेड रनर पर हर जॉब खाली शुरू होता है। महंगे फ़ोल्डर अपनी lockfiles से जुड़ी key के साथ रिस्टोर करें:

- uses: actions/cache@v4
  with:
    path: |
      ~/Library/Developer/Xcode/DerivedData
      ~/Library/Caches/org.swift.swiftpm
      ~/.cocoapods
      Pods
    key: ${{ runner.os }}-${{ hashFiles('**/Package.resolved', '**/Podfile.lock') }}

DerivedData सबसे बड़ा है और सबसे नाज़ुक भी। अगर इन्क्रीमेंटल बिल्ड अजीब बर्ताव करें, तो उसे कैश से हटा दें और पैकेज कैश रखें।

4. पूरा मैट्रिक्स सिर्फ़ main पर चलाएँ

पुल रिक्वेस्ट को शायद ही कभी पाँच सिम्युलेटर चाहिए। पुल रिक्वेस्ट पर एक कॉन्फ़िगरेशन बिल्ड करें। पूरा डिवाइस मैट्रिक्स main पर मर्ज होने पर या रात के शेड्यूल पर चलाएँ।

5. पाथ से फ़िल्टर करें

README में बदलाव से iOS बिल्ड शुरू नहीं होना चाहिए। डॉक्स, स्क्रिप्ट और ऐप टारगेट से बाहर की हर चीज़ के लिए वर्कफ़्लो ट्रिगर पर paths-ignore इस्तेमाल करें।

6. टाइमआउट सेट करें

अटका हुआ सिम्युलेटर छह घंटे की पूरी डिफ़ॉल्ट अवधि का बिल बना सकता है। हर macOS जॉब पर timeout-minutes को अपने सामान्य बिल्ड समय से थोड़ा ऊपर सेट करें।

7. टूल बार-बार इंस्टॉल करना बंद करें

हर जॉब में CocoaPods, fastlane या कोई खास Xcode इंस्टॉल करना बिल्ड शुरू होने से पहले ही मिनट खा जाता है। होस्टेड इमेज में जो पहले से है, उसी पर पिन करें, या इंस्टॉल को कैश करें।

8. आर्टिफ़ैक्ट रिटेंशन घटाएँ

90 दिन तक रखे गए आर्काइव और टेस्ट बंडल धीरे-धीरे स्टोरेज का खर्च बढ़ाते हैं। जो चीज़ स्टोर पर शिप नहीं होती, उसके लिए सात दिन काफ़ी हैं।

9. ब्रेक-ईवन के ऊपर, प्रति मिनट भुगतान बंद करें

ऊपर की हर चीज़ बिल को थोड़ा घटाती है। जब आप लगातार लगभग 2,242 macOS मिनट प्रति माह से ऊपर हों, तो कितनी भी कटौती फ़्लैट कीमत को नहीं हरा सकती। $139 प्रति माह वाला डेडिकेटेड M6 वॉर्म कैश के साथ अनलिमिटेड मिनट चलाता है। तब आइटम 3 और 7 का कोई मतलब ही नहीं रहता। कैलकुलेटर दिखाता है कि आपकी टीम कहाँ है।

अक्सर पूछे जाने वाले सवाल

GitHub Actions के macOS बिल पर सबसे बड़ी बचत क्या है?

+

ज़्यादातर टीमों के लिए, concurrency group से पुराने रन रद्द करना और बिल्ड के अलावा का काम Linux पर ले जाना। ये दोनों मिलकर YAML के दो छोटे बदलावों से अक्सर बिल होने वाले macOS मिनटों का एक तिहाई हटा देते हैं।

क्या GitHub Actions पर DerivedData कैश करना फ़ायदेमंद है?

+

अक्सर, पर यही नाज़ुक है। पैकेज कैश (SwiftPM, CocoaPods) सुरक्षित हैं और हर जॉब में मिनट बचाते हैं। DerivedData ज़्यादा बचाता है, पर इससे इन्क्रीमेंटल बिल्ड में अजीब गड़बड़ियाँ हो सकती हैं। इसकी key सख्ती से बनाएँ और इसे हटाने को तैयार रहें।

क्या हर पुल रिक्वेस्ट पर डिवाइस मैट्रिक्स चलाना चाहिए?

+

आम तौर पर नहीं। पुल रिक्वेस्ट पर एक कॉन्फ़िगरेशन, और main या रात के रन पर पूरा मैट्रिक्स, मिनटों के छोटे से हिस्से में वही गड़बड़ियाँ पकड़ लेता है।

यह सब कब मायने नहीं रखता?

+

महीने में लगभग 2,242 macOS मिनट से ऊपर, $139 वाला फ़्लैट कीमत का डेडिकेटेड Mac मीटर वाले बिल से सस्ता है। मीटर वाला सेटअप कितना भी अच्छा ऑप्टिमाइज़ हो, यह सच रहता है। वॉर्म कैश अपने आप ही ज़्यादातर बर्बादी हटा देते हैं।

संबंधित गाइड