릴리스 된 바이너리를 버전 관리하에 어떻게 유지합니까?


14

릴리스 된 바이너리를 버전 관리하에 어떻게 유지합니까? 이를 통해 각 릴리스간에 변경되는 내용을 추적 할 수 있습니다. 릴리스 된 바이너리를 소스 리포지토리와 분리해야합니다. 릴리스 된 바이너리는 Continuous Integration 소프트웨어에서 빌드되거나 수동으로 컴파일됩니다.


"변경된 내용 추적"은 무슨 뜻입니까? 릴리스 바이너리의 어떤 속성을 추적하고 있습니까? 이상한 것 같아서 궁금합니다.
Jeremy Heiler 2016 년

예를 들어 v1.0.0과 v1.0.1 사이에서는 ABC.exe 만 변경되고 종속성 DEF.dll은 변경되지 않습니다
linquize

1
바이너리를보고이를 어떻게 결정합니까?
Jeremy Heiler

동일한 파일의 이전 및 새 버전 비교
linquize

답변:


21

두 가지 옵션 :

a)하지 마십시오. 재현 가능한 결정 론적 빌드가 있는지 확인하십시오. 즉, 동일한 구성으로 동일한 소스 제어 개정판을 빌드하면 항상 동일한 바이너리가 생성됩니다.

b) 디렉토리를 게시 된 빌드의 권한있는 소스로 지정하십시오. 바이너리를 배포 / 배송 절차의 일부로 업로드하고 게시 된 빌드 디렉토리가 백업 계획에 포함되어 있는지 확인하십시오. 여기서 버전 관리가 필요하지 않습니다. 빌드는 한 번만 작성되며, 변경해야 할 경우 새 빌드를 만듭니다.

어느 쪽이든, 바이너리 및 기타 빌드 출력은 여러 가지 이유로 소스 제어에 속하지 않습니다.



@ jk : 좋은 링크. 소스 제어하에 빌드 단계에 대한 소스 코드와 모든 입력 파일을 가지고 있고 올바른 컴파일러 버전을 설치하면 많은 실제 시나리오에서 "충분히 결정적"일 수 있습니다 (물론 다른 것에서는 충분하지 않음). ). 비트 단위로 재현 가능한 바이너리를 갖는 것이 얼마나 중요한지에 따라 다릅니다.
Doc Brown

10

버전 제어 시스템이 아닌 바이너리에 아티팩트 저장소를 사용하십시오. 릴리스 된 바이너리의 특정 버전은 시간이 지남에 따라 변경되지 않으므로 파일이 변경되지 않으므로 버전 제어가 의미가 없습니다.

예를 들어 릴리스 및 기타 바이너리 (예 : 문서)를 보관 / 게시 / 제공하기위한 저장소로 Maven 저장소를 참조하십시오.


릴리스 된 소스 파일의 특정 버전은 시간이 지나도 변경되지 않습니다. SCM은 제공된 바이너리를 넣을 수있는 좋은 장소입니다. 빌드하는 데 사용 된 소스 파일과 함께 저장하면됩니다.
gbjbaanb

2
gbjbaanb, SCM은 "소스 제어 관리"를 나타냅니다. 이 시스템은 바이너리를 저장하지 않고 소스를 저장하도록 설계되었다는 힌트를 제공해야합니다. 여전히 바이너리를 저장하려면 계속 진행하십시오. 나는하지 않습니다.
mhaller

4
SCM은 "Software Control Management"의 약자이지만 좋은 시도입니다. "소스 코드"종종뿐만 아니라 텍스트 파일하지만, 이미지, 문서, 다이어그램 등입니다
gbjbaanb

일반적으로 "소프트웨어 구성 관리" "Software Control Management"에 대해 들어 본 적이 없습니다.
James McLeod

7

그냥 넣습니다. git (바이너리를 잘 병합하지 않으므로 직접 관리해야 함)을 사용하지 않거나 너무 많이 커밋하지 않는 한 (문제가있을 때만 커밋하지 않는 한) 문제가 없습니다. 당신이 그것을 만들 때마다가 아니라 배송 준비).

대부분의 SCM 델타 이진 파일은 꽤 잘 사용되어 SVN에 2Mb 리소스 dll을 넣었으며 매번 몇 kb로 델타를 만들었습니다.

SCM이 바이너리가 아닌 소스에 대한 많은 주장을 듣고 있지만 대부분의 소프트웨어가 아이콘 파일 일지라도 이미지로 구성되어 있다고 생각하면 이것은 사실이 아닙니다. 그것들은 바이너리이지만 소스의 일부이므로 그것들을 넣고 독단적이지 않습니다. 또한 필요할 때 바이너리를 다시 빌드 할 수 있다고 들었습니다.이 경우가 종종 있지만 더 이상 적극적으로 지원되지 않는 구형 시스템의 경우 막대한 시간 낭비가 될 수 있습니다. 3 년 전 바이너리를 빌드하는 데 사용 된 시스템에 대응하기 위해 이전 서비스 팩 또는 패치 만있는 시스템을 다시 만들어야하는 경우에는 SCM에 저장소를 추가 한 것이 기쁩니다.

SCM에 빌드를 추가하는 것에 대해 걱정할 필요가있는 유일한 시간은 빌드 서버 프로세스의 일부로 자동으로 수행하는 경우에만 수행하십시오. 당신은 당신에게 이익이없는 빌드로 SCM을 채울 것입니다. 대신 릴리즈 될 때만 추가하십시오. 이런 식으로 고객이 무엇을 정확하게 알고 있으며, 사용자가 재 구축 한 바이너리가 아니라 사용중인 바이너리에 대해 고객이보고 한 모든 문제를 재현 할 수 있습니다 (컴파일러 또는 OS에 대한 최신 업데이트 사용).


1
@ MarnenLaibow-Koser 당신은 분명히 업계에서 오랫동안 일한 적이 없습니다. 빌드 환경은 시간이 지남에 따라 변경되므로 이전 환경을 다시 구축 할 수 있지만 올바른 이전 도구 및 SDK를 사용하여 env를 다시 작성하는 데 며칠이 소요될 수 있습니다. 당신이 버전을
바랐

1
Microsoft가 더 이상 릴리스하기에 적합하지 않은 이전 SDK를 사용하여 XP 컴퓨터에서 컴파일 된 이전 VC6 바이너리를 빌드 할 수 있다고 생각합니다. 누군가이 바이너리를 요청하면 다른 모든 것이 저장된 동일한 장소에서 가져 오기가 쉽습니다. 재 구축해야하는 번거 로움과 비교하여 막대한 관리 비용과 소스와 함께 저장하는 비용은 중요하지 않습니다. 고객이 버그를보고했을 때 타사 컨트롤을 사용하여 VB6 앱을 사용하여 VB6 앱을 사용했습니다. 바이너리를 가져 와서 실행하는 것이 버그를 재 구축하는 것보다 훨씬 쉬웠습니다.
gbjbaanb

1
@ gjbaanb 나는 또한 당신이 다른 방식으로 나와 다른 상황에 있음을 인정할 것입니다. 내 외부의 모든 의존성은 OSS이므로 일부 회사는 더 이상 공개하기에 적합하지 않기 때문에 갈 수 없습니다.
Marnen Laibow-Koser

1
내 요점은 SCM이 모든 것을 저장할 수 있으므로 바이너리와 소스를 별도로 저장할 필요가 없다는 것 입니다. 편리하고 쉽고 몇 년 후 무엇을 알 수 있습니다. 그렇게하는 데 단점이 없습니다. 특정 릴리스 자체는 하나의 특정 소스 커밋과도 동기화됩니다. 일부 사람들은 SCM이 소스 코드 텍스트만을 의미한다고 생각하는 것을 제외하고는 문제를 보지 못합니다. 아니요, 거의 모든 것을 저장하기 위해 사용하십시오 (때로는 inc 빌드 도구 또는 라이브러리가 크지 않은 경우), 삶이 훨씬 쉬워집니다.
gbjbaanb

1
@gjbaanb 그리고 제 요점은 당신이 그것에 대해 틀렸다는 것입니다. :) 물론 VCS는 모든 것을 저장할 수 있지만 한 커밋에만 존재하는 파일을 저장하기에 적합하지 않습니다 (결국 r550의 저장소에서 r500 빌드를 원하지 않음) . 리포지토리에 빌드 아티팩트를 저장하는 데있어 근본적인 문제는 바이너리 가 아니라 파생 된 데이터 이며 동일한 리포지토리에서 소스와 동기화 되지 않는다는 것 입니다. 내가 사용하는 것과 동일한 인수가 생성 된 텍스트 파일에 적용됩니다.
Marnen Laibow-Koser

5

릴리스 바이너리를 버전 관리하에 두지 않습니다. 대신 다른 도구와 검사 및 사용을 위해 잘 정의 된 위치에 게시합니다. Java에서 많은 작업을 수행하므로 Jars를 로컬 Maven 저장소에 게시합니다. 그러나 릴리스마다 변경된 사항을 추적하기 위해 이러한 도구를 사용하지 않습니다. 결국, 그것들은 바이너리이며 파일 수 이외의 추적 할 것이 많지 않습니다.

릴리스 간 변경 사항을 추적하기 위해 버전 관리 시스템에서 릴리스의 버전 번호로 릴리스에 태그를 지정하거나 레이블을 지정합니다. 그러나 이것은 실제로 바이너리가 아닌 소스 파일을 추적하는 것입니다. 바이너리는 빌드의 아티팩트이며 버전 제어를받을 필요가 없습니다.


1

가장 좋은 솔루션은 조직적으로 중요한 모든 빌드 (릴리스, 릴리스 후보 등)에 CI 시스템을 독점적으로 사용하는 것입니다.

이것은 바이너리를 실제로 리포지토리에 저장할 필요없이 릴리스 된 바이너리를 리포지토리 콘텐츠에 체계적으로 연결합니다.

예를 들어 SVN을 사용하는 경우 지점 주요 조직 구성표를 사용하십시오. / trunk에서 일일 개발을 수행하고 준비가되면 각 릴리스에 대해 / tag를 작성하십시오.

태그 및 트렁크에서 빌드하도록 CI 시스템을 구성하고 해당 리포지토리의 최상위 구조를 미러링하는 네트워크 디렉토리에 출력을 쓰도록합니다.

  • / builds / trunk / [rev] [날짜] [build_id] /
  • / builds / tags / release_0_1_3beta4 / [rev] [날짜] [build_id] /

빌드 시스템은 / builds / trunk / 디렉토리를 순환 버퍼처럼 취급 하여 마지막 n 빌드를 저장하고 이전 빌드를 삭제합니다.

반면에 / builds / tags / 디렉토리는 영구 저장소입니다. 빌드 아티팩트 자체는 다음 구성표에 따라 생성 된 이름으로 디렉토리에 저장됩니다.

  • [rev] [날짜] [build_id]

여기서 [rev] 는 SVN 개정 ID이고 [date] 는 YYYYMMDD 형식의 날짜이며 [build_id] 는 첫 번째 빌드부터 증가하는 3 자리 고유 카운터로 각 빌드 디렉토리를 고유하게 만듭니다.

위에서 설명한 프로세스는 다음과 같은 이점을 제공합니다.

  1. 빌드 아티팩트는 소스를 생성 한 소스와 체계적으로 연결되어 있으므로 특정 빌드 아티팩트의 소스를 매우 쉽게 (또는 그 반대로) 찾을 수 있습니다.

  2. 이는 추가 릴리스 자동화의 기초를 형성합니다. 예를 들어 릴리스 문서 자동 생성 등 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.