การแคชแพ็กเกจ APT ในเวิร์กโฟลว์ GitHub Actions


9

ฉันใช้เวิร์กโฟลว์ Github Actions ต่อไปนี้สำหรับโครงการ 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

ฉันรู้ว่าการกระทำสนับสนุนการแคชไดเรกทอรีเฉพาะ (และมีคำถามและบทความเกี่ยวกับเรื่องนี้ตอบแล้ว) แต่ฉันไม่แน่ใจว่าแพกเกจต่าง ๆ ทั้งหมดที่ติดตั้งโดย apt นั้นจบลงที่ใด ฉันถือว่า/bin/หรือ/usr/bin/ไม่ใช่ไดเรกทอรีเดียวที่ได้รับผลกระทบจากการติดตั้งแพ็คเกจ

มีวิธีที่สวยงามในการแคชแพ็กเกจระบบที่ติดตั้งสำหรับเวิร์กโฟลว์ในอนาคตหรือไม่

คำตอบ:


5

จุดประสงค์ของคำตอบนี้คือแสดงให้เห็นว่าการแคชสามารถทำได้ด้วยการกระทำ gitub ไม่จำเป็นต้องแสดงวิธีการแคชvalgrindซึ่งจะแสดง แต่ยังแสดงให้เห็นว่าไม่ใช่ทุกสิ่งที่สามารถ / ควรถูกแคชและการแลกเปลี่ยนแคชและการเรียกคืนแคชและการติดตั้งแคชใหม่จะต้องนำมาพิจารณาด้วย


คุณจะใช้ประโยชน์จากการactions/cacheกระทำนี้

เพิ่มเป็นขั้นตอน (ก่อนที่คุณจะต้องใช้ valgrind):

- 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 valgrindsudo 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ในกรณีนี้) แต่ฉันไม่แนะนำให้ดำเนินการตามเส้นทางนี้เนื่องจากโซ่การพึ่งพาเพิ่งเติบโตจากที่นั่น เพื่อความแม่นยำการอ้างอิงที่จำเป็นในการคัดลอกไปยังสภาพแวดล้อมที่เหมาะสมที่สุดสำหรับ valgrind เพื่อให้ทำงานมีดังนี้:

  • libc6
  • libgcc1
  • GCC-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? ถ้าเป้าหมายของคุณคือการเร่งกระบวนการสร้างแล้วคุณยังต้องคำนึงถึงระยะเวลาที่มีการใช้ในการเรียกคืน (การดาวน์โหลดและการสกัด) แคช VS valgrindเพียงแค่ใช้คำสั่งอีกครั้งในการติดตั้ง


และในที่สุดการกู้คืนแคชสมมติว่ามันถูกเก็บไว้ที่/tmp/valgrindคุณสามารถใช้คำสั่ง:

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

ซึ่งโดยทั่วไปจะคัดลอกไฟล์ทั้งหมดจากแคชไปยังพาร์ติชันรูท

นอกเหนือจากกระบวนการข้างต้นฉันยังมีตัวอย่างของ "แคช valgrind" ด้วยการติดตั้งและรวบรวมจากแหล่งที่มา ขณะนี้แคชมีขนาดประมาณ 63MB (บีบอัด) และยังต้องมีการติดตั้งแยกต่างหากเพื่อlibcเอาชนะวัตถุประสงค์


อ้างอิง:


โอ้ฉันเข้าใจแล้วนั่นช่างฉลาด ฉันไม่รู้ว่าคุณสามารถนำไฟล์ที่ติดตั้งไปแล้วได้อย่างปลอดภัยและย้ายไฟล์ไปยังไดเรกทอรีอื่นโดยไม่ทำลายไฟล์ ฉันไม่แน่ใจว่ามันใช้งานได้ ฉันวิ่งเวิร์กโฟลว์ 3 Cache not found for input keys: ***.ครั้งและเสมอไป ฉันเพิ่มVALGRIND_VERSIONความลับในการตั้งค่า> ความลับใช่มั้ย
natiiix

ฉันจัดการเพื่อรับการตีแคชในขณะนี้ แต่ฉันได้รับข้อผิดพลาดต่อไปนี้จาก valgrind:--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

@natiiix มีความเป็นไปได้ที่การแคชvalgrindจะทำเพื่อlibcไม่ให้มีการติดตั้งการพึ่งพาเมื่อมีการดึงแคช ฉันไม่ได้อยู่ใกล้มอนิเตอร์ตอนนี้ แต่ฉันค้นหาข้อผิดพลาดของคุณและดูเหมือนว่ามันเป็นบั๊กที่มี valgrind คุณสามารถลองติดตั้ง libc เวอร์ชัน 6 และดูว่าช่วยได้หรือไม่ ฉันจะอัปเดตคำตอบในวันนี้
smac89

ใช่ดูเหมือนว่า ถ้าฉันเพิ่มsudo apt-get install -y libc6-dbgมันก็ใช้งานได้ดี แต่ฉันก็เป็นคนที่ฉันเริ่มด้วยเพราะการติดตั้งแพคเกจนั้นใช้เวลา 30 วินาทีขึ้นไป
natiiix

@natiiix ดูเหมือนว่า valgrind แคชอาจทำงานได้มากกว่าที่คาดไว้ แต่อย่างน้อยนี่แสดงให้เห็นว่าการแคชสามารถทำได้บน Ubuntu ดูการพึ่งพาของ valgrind มีการพึ่งพาอย่างน้อย 6 ครั้งและฉันคิดว่าพวกเขาทุกคนอาจต้องได้รับการแคชถ้านี่เป็นการทำงาน
smac89

4

คุณสามารถสร้างภาพนักเทียบท่าที่valgrindติดตั้งไว้ล่วงหน้าและเรียกใช้เวิร์กโฟลว์ของคุณได้

สร้างDockerfileด้วยสิ่งที่ชอบ:

FROM ubuntu

RUN apt-get install -y valgrind

สร้างและผลักดันมันไปยัง dockerhub:

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 แคชสภาพแวดล้อม / สิ่งประดิษฐ์สำหรับการทำงานในอนาคตและต้องการความพยายามเพิ่มเติมจากด้านข้างของฉันแทน ในทางกลับกันเมื่อทำเสร็จแล้วอาจนำมาใช้ซ้ำได้ง่าย
natiiix

1
มันขึ้นอยู่กับคุณที่จะตัดสินใจว่าอะไรดีที่สุดสำหรับคุณหรือสิ่งที่ต้องการความผิดมากที่สุดจากด้านข้างของคุณ¯_ (ツ) _ / ¯
deivid
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.