머리말:우리는 복잡한 빌드 프로세스를 가지고 있었고 한 시스템에서는 작동했지만 다른 시스템에서는 실패했다는 사실을 발견했습니다(불행히도 /Murphy의 경우 Jenkins 빌드 서버에서 작동했기 때문에 오랫동안 문제가 감지되지 않았습니다). 오류의 원인은 tar
일부 외부 구성 요소가 하드 링크된 파일을 파일에 배치한 순서로 밝혀졌습니다.
a
b
하드링크되어 있고 빨간색이었고 tar
나중에 tar 파일을 추출할 때 a
추출만 되었습니다. 물론, a
처음으로 아카이브할 때는 잘 작동하지만, b
tar에서 처음으로 아카이브할 경우에는 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