GitHub 작업 워크 플로우에서 APT 패키지 캐싱


9

C 프로젝트에 다음 Github Actions 워크 플로를 사용합니다. 워크 플로우는 ~ 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

Actions가 특정 디렉토리의 캐싱을 지원한다는 것을 알고 있습니다 (그리고 이미 이에 대한 몇 가지 답변 된 질문과 기사가 있습니다). 나는 가정 /bin/또는 /usr/bin/패키지를 설치하여 영향을받는 디렉토리 만은 아니다.

향후 워크 플로 실행을 위해 설치된 시스템 패키지를 캐시하는 우아한 방법이 있습니까?

답변:


5

이 답변의 목적은 github 작업으로 캐싱을 수행하는 방법을 보여주는 것입니다. 캐시하는 방법을 보여줄 필요 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 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이 경우) 을 복사해야 할 수도 있지만 종속성 체인이 거기에서 커지기 때문에이 경로를 계속 진행하지 않는 것이 좋습니다. 정확하게 말하면, 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있습니까? 빌드 프로세스 속도를 높이는 것이 목표라면 캐시를 복원 (다운로드 및 추출)하는 데 걸리는 시간과 단순히 명령을 다시 실행하여 설치하는 데 걸리는 시간도 고려해야합니다 valgrind.


마지막으로 캐시가에 있다고 가정하면 캐시를 복원 /tmp/valgrind하려면 다음 명령을 사용할 수 있습니다.

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

기본적으로 캐시의 모든 파일을 루트 파티션으로 복사합니다.

위의 프로세스 외에도 소스에서 설치하고 컴파일하여 "valgrind를 캐싱" 하는 예제 도 있습니다 . 캐시의 크기는 현재 약 63MB (압축)이며 여전히 libc어떤 종류의 목적 에 맞지 않는지를 별도로 설치해야합니다 .


참고 문헌 :


아, 참으로 독창적이야 설치된 모든 파일을 안전하게 가져 와서 무언가를 손상시키지 않고 다른 디렉토리로 옮길 수 있다는 것을 몰랐습니다. 그래도 작동하는지 확실하지 않습니다. 워크 플로를 3 번 ​​실행하고 항상갑니다 Cache not found for input keys: ***.. VALGRIND_VERSION설정> 비밀에 비밀을 추가 했습니다. 맞습니까?
natiiix

나는 지금 캐시 적중을 얻었지만, --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

@natiiix 캐쉬가 캐시를 검색 할 때 종속성이 설치되지 valgrind않도록 캐싱 할 가능성이 libc있습니다. 나는 지금 모니터 근처에 있지 않지만 오류를 찾았으며 valgrind 의 버그 인 것 같습니다 . libc 버전 6을 설치하여 도움이되는지 확인할 수도 있습니다. 나는 대답 나중에 오늘 업데이트됩니다
smac89

그렇습니다. 추가 sudo apt-get install -y libc6-dbg하면 제대로 작동하지만 패키지 설치에 30 초가 더 걸리기 때문에 시작한 곳이기도합니다.
natiiix

@natiiix valgrind 캐싱은 예상보다 많은 작업이 될 수 있지만 우분투에서 캐싱을 수행하는 방법을 보여줍니다. 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.