গিটহাব অ্যাকশনস ওয়ার্কফ্লোতে এপিটি প্যাকেজগুলি ক্যাচ করা হচ্ছে


9

আমি আমার সি প্রকল্পের জন্য নিম্নলিখিত গিথুব অ্যাকশনগুলির কার্যপ্রবাহ ব্যবহার করি। ওয়ার্কফ্লো ~ 40 সেকেন্ডের মধ্যে শেষ হয়, তবে সেই সময়ের অর্ধেকেরও বেশি সময় valgrindপ্যাকেজ এবং তার নির্ভরতা ইনস্টল করে ব্যয় করা হয় ।

আমি বিশ্বাস করি ক্যাচিং আমাকে কাজের প্রবাহকে দ্রুত করতে সহায়তা করতে পারে। কয়েক সেকেন্ডের অতিরিক্ত অপেক্ষা করতে আমার আপত্তি নেই, তবে এটি গিটহাবের সংস্থানগুলির অর্থহীন অপচয় হিসাবে মনে হচ্ছে।

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

আমি জানি অ্যাকশনগুলি একটি নির্দিষ্ট ডিরেক্টরিকে ক্যাশে করা সমর্থন করে (এবং ইতিমধ্যে এ সম্পর্কে বেশ কয়েকটি উত্তরের এসও প্রশ্ন এবং নিবন্ধ রয়েছে) তবে আমি নিশ্চিত নই যে অ্যাপটি দ্বারা সমস্ত পৃথক প্যাকেজ ইনস্টল হয়েছে। আমি ধরে নিয়েছি /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/* /

যা মূলত ক্যাশে থেকে রুট বিভাজনে সমস্ত ফাইল অনুলিপি করবে।

উপরোক্ত প্রক্রিয়াটি ছাড়াও, উত্স থেকে ইনস্টল করে এবং সংকলন করে আমার কাছে "ক্যাশে ভ্যালগ্রিড" উদাহরণ রয়েছে। ক্যাশেটি এখন আকারের প্রায় 63MB (সঙ্কুচিত) এবং কোনটি এখনও 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
ভালগ্রাইন্ডের

@ নাতিয়িক্সে এমন সম্ভাবনা রয়েছে যে ক্যাশে valgrindএটি তৈরি করেছিল যাতে libcক্যাশে পুনরুদ্ধার করার সময় নির্ভরতা ইনস্টল না হয়। আমি এখন কোনও মনিটরের কাছে নেই, তবে আমি আপনার ত্রুটিটি দেখেছি এবং মনে হচ্ছে এটি ভালগ্র্যান্ড সহ একটি বাগ । আপনি libc সংস্করণ installing ইনস্টল করার চেষ্টা করতে পারেন এবং দেখুন এটি সহায়তা করে কিনা। আমি আজই উত্তরটি পরে আপডেট করব
স্মাক 89

হ্যাঁ, এটাও তাই মনে হচ্ছে। যদি আমি যুক্ত করি sudo apt-get install -y libc6-dbg, তবে এটি ঠিক কাজ করে, তবে আমি যেখানে শুরু করেছি সেখানেই আমি কারণ প্যাকেজটি ইনস্টলেশন করতে আরও 30 সেকেন্ড সময় লাগে।
নাটিয়িক্স

@ ন্যাটিইমিক্স দেখে মনে হচ্ছে ক্যাচারিং ভ্যালগ্রিডটি প্রত্যাশিত চেয়ে বেশি কাজ হতে পারে তবে এটি অন্ততপক্ষে দেখায় যে উবুন্টুতে কীভাবে ক্যাচিং করা যায়। ভালগ্রাইন্ডের নির্ভরতাগুলি খুঁজছেন, সেখানে কমপক্ষে 6 টি নির্ভরতা রয়েছে এবং আমি মনে করি যদি এটি কাজ করা হয় তবে তাদের সম্ভবত সবগুলিই ক্যাশে করা দরকার।
smac89

4

আপনি প্রাক-ইনস্টলযুক্ত একটি ডকার ইমেজ তৈরি করতে 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

সম্পূর্ণরূপে অনির্ধারিত, তবে আপনি ধারণাটি পাবেন।


এটি একটি খুব আকর্ষণীয় ধারণা, তবে এটি গিটহাব অ্যাকশনগুলি ভবিষ্যতের রানগুলির জন্য পরিবেশ / শৈল্পিকাগুলি ক্যাশে করার পুরো নীতিটিকে হ্রাস করে এবং তার পরিবর্তে আমার পক্ষ থেকে কিছু অতিরিক্ত প্রচেষ্টা প্রয়োজন। অন্যদিকে, একবার হয়ে গেলে সম্ভবত এটি খুব সহজেই পুনরায় ব্যবহার করা যেতে পারে।
ন্যাটিক্স

1
আপনার পক্ষে কোনটি সবচেয়ে ভাল কাজ করে বা আপনার পক্ষ থেকে সর্বাধিক অফার কী প্রয়োজন তার সিদ্ধান্ত নেওয়া আপনার পক্ষে ¯_ (ツ) _ / ¯
স্বীকৃত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.