Các gói APT lưu trong bộ công việc GitHub Action


9

Tôi sử dụng quy trình công việc Github sau đây cho dự án C của mình. Quy trình công việc kết thúc sau ~ 40 giây, nhưng hơn một nửa thời gian đó được dành cho việc cài đặt valgrindgói và các phụ thuộc của nó.

Tôi tin rằng bộ nhớ đệm có thể giúp tôi tăng tốc quy trình làm việc. Tôi không ngại chờ thêm một vài giây, nhưng điều này có vẻ như là một sự lãng phí vô nghĩa đối với tài nguyên của 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

Chạy sudo apt-get install -y valgrindcài đặt các gói sau:

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

Tôi biết Hành động hỗ trợ lưu vào bộ đệm của một thư mục cụ thể (và đã có một số câu hỏi và bài viết SO được trả lời về vấn đề này), nhưng tôi không chắc chắn tất cả các gói khác nhau được cài đặt bởi apt kết thúc ở đâu. Tôi giả sử /bin/hoặc /usr/bin/không phải là thư mục duy nhất bị ảnh hưởng bởi việc cài đặt các gói.

Có một cách thanh lịch để lưu trữ các gói hệ thống đã cài đặt cho các luồng công việc trong tương lai không?

Câu trả lời:


5

Mục đích của câu trả lời này là để cho thấy cách bộ nhớ đệm có thể được thực hiện với các hành động github. Không nhất thiết phải hiển thị cách lưu vào bộ đệm valgrind, mà nó hiển thị, nhưng cũng cho thấy rằng không phải mọi thứ đều có thể / nên được lưu vào bộ nhớ cache và phải cân nhắc việc lưu lại bộ đệm và khôi phục bộ đệm so với cài đặt lại phụ thuộc.


Bạn sẽ sử dụng các actions/cachehành động để làm điều này.

Thêm nó dưới dạng một bước (trước khi bạn cần sử dụng valgrind):

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

Bước tiếp theo sẽ cố gắng cài đặt phiên bản được lưu trong bộ nhớ cache nếu có hoặc cài đặt từ kho:

- 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

Giải trình

Đặt VALGRIND_VERSIONbí mật là đầu ra của:

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

điều này sẽ cho phép bạn vô hiệu hóa bộ đệm khi một phiên bản mới được phát hành đơn giản bằng cách thay đổi giá trị của bí mật.

dpkg -L valgrindđược sử dụng để liệt kê tất cả các tập tin được cài đặt khi sử dụng sudo apt-get install valgrind.

Bây giờ chúng ta có thể làm gì với lệnh này là sao chép tất cả các phụ thuộc vào thư mục bộ đệm của chúng ta:

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

Hơn nữa

Ngoài việc sao chép tất cả các thành phần của valgrind, cũng có thể cần phải sao chép các phụ thuộc (như libctrong trường hợp này), nhưng tôi không khuyên bạn nên tiếp tục theo con đường này vì chuỗi phụ thuộc chỉ phát triển từ đó. Nói chính xác, các phụ thuộc cần thiết để sao chép để cuối cùng có một môi trường phù hợp với valgrind để chạy như sau:

  • libc6
  • libgcc1
  • gcc-8-cơ sở

Để sao chép tất cả các phụ thuộc này, bạn có thể sử dụng cú pháp tương tự như trên:

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

Là tất cả công việc này thực sự có giá trị rắc rối khi tất cả những gì được yêu cầu để cài đặt valgrindở nơi đầu tiên chỉ đơn giản là chạy sudo apt-get install valgrind? Nếu mục tiêu của bạn là tăng tốc quá trình xây dựng, thì bạn cũng phải xem xét lượng thời gian cần thiết để khôi phục (tải xuống và giải nén) bộ đệm so với chỉ cần chạy lại lệnh để cài đặt valgrind.


Và cuối cùng để khôi phục bộ đệm, giả sử nó được lưu trữ tại /tmp/valgrind, bạn có thể sử dụng lệnh:

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

Về cơ bản sẽ sao chép tất cả các tệp từ bộ đệm cho đến phân vùng gốc.

Ngoài quy trình trên, tôi cũng có một ví dụ về "bộ nhớ đệm valgrind" bằng cách cài đặt và biên dịch nó từ nguồn. Bộ đệm hiện có kích thước khoảng 63 MB (được nén) và người ta vẫn cần cài đặt riêng libcloại mục đích nào.


Người giới thiệu:


Ồ, tôi hiểu rồi, thật tài tình. Tôi không biết bạn có thể lấy tất cả các tệp đã cài đặt một cách an toàn và chỉ cần di chuyển chúng sang thư mục khác mà không phá vỡ thứ gì đó. Tôi không chắc nó hoạt động mặc dù. Tôi đã chạy công việc 3 lần và luôn luôn đi Cache not found for input keys: ***.. Tôi đã thêm VALGRIND_VERSIONbí mật trong Cài đặt> Bí mật, đúng không?
natiiix

Tôi đã quản lý để có được một bộ nhớ cache ngay bây giờ, nhưng tôi nhận được lỗi sau từ 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 11/12/19

@natiiix có khả năng bộ nhớ đệm valgrindđã tạo ra nó để libcphụ thuộc không được cài đặt khi lấy bộ đệm. Bây giờ tôi không ở gần màn hình, nhưng tôi đã tìm kiếm lỗi của bạn và có vẻ như đó là một lỗi với valgrind. Bạn cũng có thể thử cài đặt libc phiên bản 6 và xem có giúp được không. Tôi sẽ cập nhật câu trả lời sau hôm nay
smac89

Vâng, có vẻ như vậy. Nếu tôi thêm sudo apt-get install -y libc6-dbg, thì nó hoạt động tốt, nhưng sau đó tôi cũng là nơi tôi đã bắt đầu vì quá trình cài đặt gói đó mất thêm 30 giây.
natiiix

@natiiix Có vẻ như bộ nhớ đệm valgrind có thể hoạt động nhiều hơn dự đoán, nhưng ít nhất điều này cho thấy cách bộ nhớ đệm có thể được thực hiện trên Ubuntu. Nhìn vào các phụ thuộc của valgrind, có ít nhất 6 phụ thuộc và tôi nghĩ rằng tất cả chúng cần phải được lưu trữ nếu điều này hoạt động.
smac89

4

Bạn có thể tạo một hình ảnh docker với valgrindcài đặt sẵn và chạy quy trình công việc của bạn trên đó.

Tạo một Dockerfilecái gì đó như:

FROM ubuntu

RUN apt-get install -y valgrind

Xây dựng nó và đẩy nó đến dockerhub:

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

Sau đó sử dụng một cái gì đó như sau đây như quy trình công việc của bạn:

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

Hoàn toàn chưa được kiểm tra, nhưng bạn có được ý tưởng.


Đây là một ý tưởng rất thú vị, nhưng nó làm suy yếu toàn bộ nguyên tắc cho phép GitHub Action lưu trữ môi trường / tạo tác cho các lần chạy trong tương lai và thay vào đó đòi hỏi một số nỗ lực bổ sung từ phía tôi. Mặt khác, một khi được thực hiện, điều này có thể được tái sử dụng khá dễ dàng.
natiiix

1
Tùy thuộc vào bạn để quyết định điều gì phù hợp nhất với bạn hoặc điều gì đòi hỏi sự phản đối nhiều nhất từ ​​phía bạn ¯_ () _ /
hủy bỏ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.