GitHub क्रियाएँ वर्कफ़्लो में APT पैकेजों को कैशिंग करना


9

मैं अपने C प्रोजेक्ट के लिए निम्न गितुब एक्शन वर्कफ़्लो का उपयोग करता हूं। वर्कफ़्लो ~ 40 सेकंड में समाप्त हो जाता है, लेकिन उस समय के आधे से अधिक valgrindपैकेज और इसकी निर्भरता स्थापित करके खर्च किया जाता है ।

मेरा मानना ​​है कि कैशिंग मुझे वर्कफ़्लो को गति देने में मदद कर सकता है। मुझे अतिरिक्त सेकंड के इंतजार में कोई आपत्ति नहीं है, लेकिन यह सिर्फ GitHub के संसाधनों की व्यर्थ बर्बादी जैसा लगता है।

name: C Workflow

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1

    - name: make
      run: make

    - name: valgrind
      run: |
        sudo apt-get install -y valgrind
        valgrind -v --leak-check=full --show-leak-kinds=all ./bin

रनिंग sudo apt-get install -y valgrindनिम्नलिखित पैकेजों को स्थापित करता है:

  • gdb
  • gdbserver
  • libbabeltrace1
  • libc6-dbg
  • libipt1
  • valgrind

मुझे पता है कि क्रियाएँ एक विशिष्ट निर्देशिका के कैशिंग का समर्थन करती हैं (और इस बारे में पहले से ही कई उत्तर दिए गए SO प्रश्न और लेख हैं), लेकिन मुझे यकीन नहीं है कि सभी अलग-अलग संकुल उपयुक्त हैं। मैं मान लेता हूं /bin/या /usr/bin/केवल संकुल को स्थापित करने से प्रभावित निर्देशिकाएं नहीं हैं।

क्या भविष्य के वर्कफ़्लो रन के लिए स्थापित सिस्टम पैकेज को कैश करने का एक सुंदर तरीका है?

जवाबों:


5

इस उत्तर का उद्देश्य यह दिखाना है कि कैसेथुथ क्रिया के साथ कैशिंग किया जा सकता है। कैश कैसे करना है valgrind, यह दिखाने के लिए जरूरी नहीं है , बल्कि यह दिखाने के लिए भी कि सब कुछ कैश नहीं किया जाना चाहिए, या कैशिंग और कैश को पुनर्स्थापित करने या निर्भरता को पुनर्स्थापित करने के ट्रेडऑफ को ध्यान में रखना होगा।


आप ऐसा करने के लिए actions/cacheक्रिया का उपयोग करेंगे ।

इसे एक चरण के रूप में जोड़ें (इससे पहले कि आपको वेलग्रिंड का उपयोग करने की आवश्यकता हो):

- name: Cache valgrind
  uses: actions/cache@v1.0.3
  id: cache-valgrind
  with:
      path: "~/valgrind"
      key: ${{secrets.VALGRIND_VERSION}}

अगला चरण कैश्ड संस्करण को स्थापित करने का प्रयास करना चाहिए यदि कोई हो या रिपॉजिटरी से स्थापित हो:

- name: Install valgrind
  env:
    CACHE_HIT: ${{steps.cache-valgrind.outputs.cache-hit}}
    VALGRIND_VERSION: ${{secrets.VALGRIND_VERSION}}
  run: |
      if [[ "$CACHE_HIT" == 'true' ]]; then
        sudo cp --verbose --force --recursive ~/valgrind/* /
      else
        sudo apt-get install --yes valgrind="$VALGRIND_VERSION"
        mkdir -p ~/valgrind
        sudo dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
      fi

व्याख्या

VALGRIND_VERSIONका आउटपुट होने के लिए गुप्त सेट करें :

apt-cache policy valgrind | grep -oP '(?<=Candidate:\s)(.+)'

यह आपको कैशे को अमान्य करने की अनुमति देगा जब एक नया संस्करण केवल रहस्य के मूल्य को बदलकर जारी किया जाता है।

dpkg -L valgrindका उपयोग करते समय स्थापित सभी फाइलों को सूचीबद्ध करने के लिए किया जाता है sudo apt-get install valgrind

अब हम इस आदेश के साथ क्या कर सकते हैं अपने कैश फ़ोल्डर के लिए सभी निर्भरता की प्रतिलिपि बनाएँ:

dpkg -L valgrind | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/

और भी

के सभी घटकों को कॉपी करने के अलावा valgrind, यह निर्भरता की प्रतिलिपि बनाने के लिए भी आवश्यक हो सकता है (जैसे कि libcइस मामले में), लेकिन मैं इस रास्ते पर जारी रखने की अनुशंसा नहीं करता हूं क्योंकि निर्भरता श्रृंखला बस वहां से बढ़ती है। सटीक होने के लिए, अंतिम रूप से वालग्राइंड को चलाने के लिए उपयुक्त वातावरण के लिए प्रतिलिपि बनाने के लिए आवश्यक निर्भरताएँ निम्नानुसार हैं:

  • libc6
  • libgcc1
  • जीसीसी-8-क्षार

इन सभी निर्भरताओं को कॉपी करने के लिए, आप ऊपर दिए गए सिंटैक्स का उपयोग कर सकते हैं:

for dep in libc6 libgcc1 gcc-8-base; do
    dpkg -L $dep | while IFS= read -r f; do if test -f $f; then echo $f; fi; done | xargs cp --parents --target-directory ~/valgrind/
done

क्या यह सब काम वास्तव में परेशानी के लायक है जब valgrindपहली जगह में स्थापित करने के लिए आवश्यक सभी को बस चलाना है sudo apt-get install valgrind? यदि आपका लक्ष्य बिल्ड प्रक्रिया को गति देना है, तो आपको यह भी ध्यान में रखना होगा कि कैश को पुनर्स्थापित करने (डाउनलोड करने और निकालने) में कितना समय लग रहा है, बस स्थापित करने के लिए फिर से कमांड चला रहे हैं valgrind


और अंत में कैश को पुनर्स्थापित करने के लिए, यह मानते हुए कि यह संग्रहीत है /tmp/valgrind, आप कमांड का उपयोग कर सकते हैं:

cp --force --recursive /tmp/valgrind/* /

जो मूल रूप से कैश से लेकर रूट पार्टीशन तक की सभी फाइलों को कॉपी करेगा।

उपरोक्त प्रक्रिया के अलावा, मेरे पास स्रोत से इसे संकलित और संकलित करके "कैशिंग वेलग्रिंड" का एक उदाहरण भी है । कैश अब आकार में लगभग 63 एमबी (संपीड़ित) है और एक को अभी भी अलग से स्थापित करने की आवश्यकता है libcजो इस तरह के उद्देश्य को हरा देता है।


संदर्भ:


ओह, मैं देख रहा हूँ, यह सरल है। मुझे नहीं पता था कि आप सभी स्थापित फ़ाइलों को सुरक्षित रूप से ले जा सकते हैं और बस उन्हें किसी अन्य चीज को तोड़ने के बिना किसी अन्य निर्देशिका में स्थानांतरित कर सकते हैं। मुझे यकीन नहीं है कि यह काम करता है। मैं 3 बार वर्कफ़्लो चला और हमेशा जाता रहा Cache not found for input keys: ***.। मैंने VALGRIND_VERSIONसेटिंग> गोपनीयता में रहस्य जोड़ा , क्या यह सही है?
नैटिक्स

मैं अब एक कैश हिट प्राप्त करने में कामयाब रहा हूं, लेकिन मुझे --2906-- Reading syms from /lib/x86_64-linux-gnu/ld-2.27.so --2906-- Considering /lib/x86_64-linux-gnu/ld-2.27.so .. --2906-- .. CRC mismatch (computed 1b7c895e wanted 2943108a) --2906-- object doesn't have a symbol table
वालगाइंड

@natiiix ऐसी संभावना है कि कैशिंग valgrindने इसे बनाया ताकि libcकैश पुनर्प्राप्त होने पर निर्भरता स्थापित न हो। मैं अब एक मॉनिटर के पास नहीं हूं, लेकिन मैंने आपकी त्रुटि को देखा और ऐसा लगता है जैसे यह एक बग है, जो वालग्रिंड के साथ है। तुम भी libc संस्करण 6 स्थापित करने की कोशिश कर सकते हैं और देखें कि क्या मदद करता है। मैं आज जवाब बाद में अपडेट
करूंगा

हां, ऐसा लगता है। यदि मैं जोड़ता हूं sudo apt-get install -y libc6-dbg, तो यह ठीक काम करता है, लेकिन फिर मैं भी वहीं हूं जहां मैंने शुरू किया था क्योंकि उस पैकेज की स्थापना में 30 और सेकंड लगते हैं।
natiiix

@natiiix ऐसा लगता है कि कैशिंग वैलग्राइंड प्रत्याशित से अधिक काम हो सकता है, लेकिन कम से कम यह दर्शाता है कि उबंटू पर कैशिंग कैसे किया जा सकता है। वैलेरिंड की निर्भरता को देखते हुए, कम से कम 6 निर्भरताएं हैं, और मुझे लगता है कि अगर यह काम करना है तो उन्हें शायद सभी को कैश करना होगा।
smac89

5

आप valgrindपूर्वस्थापित के साथ एक डॉक छवि बना सकते हैं और उस पर अपने वर्कफ़्लो को चला सकते हैं।

Dockerfileकुछ के साथ बनाएँ :

FROM ubuntu

RUN apt-get install -y valgrind

इसे बनाएं और इसे डॉकटरहोब पर धकेलें:

docker build -t natiiix/valgrind .
docker push natiiix/valgrind

फिर अपने वर्कफ़्लो के रूप में निम्न जैसे कुछ का उपयोग करें:

name: C Workflow

on: [push, pull_request]

jobs:
  build:
    container: natiiix/valgrind

    steps:
    - uses: actions/checkout@v1

    - name: make
      run: make

    - name: valgrind
      run: valgrind -v --leak-check=full --show-leak-kinds=all ./bin

पूरी तरह से अप्रयुक्त, लेकिन आपको विचार मिलता है।


यह एक बहुत ही दिलचस्प विचार है, लेकिन यह GitHub Actions को भविष्य के रनों के लिए पर्यावरण / कलाकृतियों को कैश करने के पूरे सिद्धांत को रेखांकित करता है और इसके बजाय मेरी तरफ से कुछ अतिरिक्त प्रयास की आवश्यकता होती है। दूसरी ओर, एक बार किया, यह शायद काफी आसानी से पुन: उपयोग किया जा सकता है।
नाटिइक्स

1
यह आपके लिए तय करना है कि आपके लिए सबसे अच्छा काम क्या है, या आपको अपनी ओर से सबसे अधिक किस चीज की आवश्यकता है ¯_ (¯) _ / ツ
ज्वलंत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.