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/cache
hà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_VERSION
bí 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ư libc
trong 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 libc
loại mục đích nào.
Người giới thiệu:
Cache not found for input keys: ***.
. Tôi đã thêmVALGRIND_VERSION
bí mật trong Cài đặt> Bí mật, đúng không?