tar cf가 재현 가능한 결과를 얻도록 하려면 어떻게 해야 합니까?

tar cf가 재현 가능한 결과를 얻도록 하려면 어떻게 해야 합니까?

머리말:우리는 복잡한 빌드 프로세스를 가지고 있었고 한 시스템에서는 작동했지만 다른 시스템에서는 실패했다는 사실을 발견했습니다(불행히도 /Murphy의 경우 Jenkins 빌드 서버에서 작동했기 때문에 오랫동안 문제가 감지되지 않았습니다). 오류의 원인은 tar일부 외부 구성 요소가 하드 링크된 파일을 파일에 배치한 순서로 밝혀졌습니다.

ab하드링크되어 있고 빨간색이었고 tar나중에 tar 파일을 추출할 때 a추출만 되었습니다. 물론, a처음으로 아카이브할 때는 잘 작동하지만, btar에서 처음으로 아카이브할 경우에는 Cannot hard link전형적인 오류가 발생합니다.

물론 을 tar cf사용할 수도 --hard-dereference있지만 이는 외부 도구에서 스크립트를 변경하는 것을 의미하므로(피해야 함) 질문이 다릅니다.

질문:우리의 기본 목표는 시스템 독립적으로 재현 가능한 결과를 얻는 것입니다. 현재 tar링 순서는 한 시스템에서 재현 가능하지만 다른 시스템에서는 무작위로 다를 수 있습니다. tar옵션을 제공하거나 호출을 여러 호출로 분할하지 않고도 tar파일 tar순서를 시행 할 수 있습니까 ?

현재 시스템은 모두 Linux이지만 때로는 FreeBSD 또는 MacOS일 수도 있습니다.

답변1

간단한 접근 방식은 stdin의 파일 목록을 tar에 제공하여 제어할 수 있는 것입니다(예: 먼저 정렬).

그러나 tar 호출을 제어할 수 없다고 말했으므로 디렉토리 항목의 순서를 제어할 수 있는 방법이 필요합니다.

ls -u디렉토리 항목의 순서를 실행하거나 확인하여 이를 수행할 수 있습니다 find.

원하는 방식으로 항목이 정렬된 디렉터리를 만들려면 새 디렉터리를 만들고 원하는 순서대로 한 번에 하나씩 파일을 복사하거나 이동하세요.

find작동하는지 확인하세요 . 스크립트를 사용하여 자동화하고 재귀적으로 만듭니다.

마지막으로 도구를 실행합니다.

답변2

문제는 빌드 프로세스가 두 부분으로 나누어지는 데 있다고 생각합니다.

  • 기계 A의 1부(성과 생성)
  • 2부(아카이브를 사용하여 빌드 완료)는 머신 A에서 실행되지만 머신 B에서는 실패합니다.

그리고 당신은 만들 수 없습니다콘텐츠따라서 머신 B의 아카이브는 머신 A에서 수행되어야 합니다.

아이디어

사용하기 전에 알려진 순서로 아카이브를 정리하는 단계를 Part 2 빌드에 추가합니다.

파일을 임시 디렉터리에 추출하고 원하는 순서로 자신만의 아카이브를 만듭니다. 두 대의 컴퓨터 A와 B에서 이 작업을 수행합니다(파트 2의 0단계가 됩니다).

또는 내 tar 버전(tar(GNU tar) 1.30)에는 다음 옵션이 있습니다.

      -s, --preserve-order, --same-order
              Sort names to extract to match archive              

관련 정보