2011-01-19 10 views
4

버전 번호, 릴리스 버전 및 지속적인 통합 사용과 관련하여 질문이있었습니다.연속 통합 빌드 - 버전 관리

지금까지 우리 빌드에서는 모든 빌드에서 모든 구성 요소의 버전으로 RELEASE를 사용했습니다.

<dependency> 
    <groupId>com.mycompany</groupId> 
    <artifactId>mydependency</artifactId> 
    <version>RELEASE</version> 
</dependency> 

이것은 우리가 항상 모든 종속의 최신 릴리스로 가장 사용하는 장점을 가지고 있지만, 우리는 당신이 의존성이에 사용하기로했다 모르겠어요으로 재현 할 수없는 빌드하는 주요 단점이있다 예를 들어 버전이 1.3.2가 아니라 RELEASE라고 말하면서 과거를 가리킨다.

고정 릴리스 번호를 사용하도록 전환하면 재현성있는 빌드를 얻을 수 있지만 연속 통합의 장점을 잃지 않으므로 지금 무엇이 고장 났는지 알 수 있습니까? 이것이 지속적인 통합의 포인트가 아닌가?

표준 방법은 무엇입니까?

감사합니다, D 우리는 고정 해제를 번호를 사용하도록 전환하는 경우

답변

3

먼저 RELEASE을 사용하지 않을 계획입니다. Maven 3에서는 플러그인 버전으로는 no longer supported입니다. 그것에 대한 참조가 Maven에 관한 온라인 서적에서 삭제 된 것으로 보입니다. 그리고 의존성 버전에 대해서는 더 이상 사용되지 않을 것입니다. (이미 신뢰할 수있는 정보를 찾을 수는 없습니다.) 이것에 대해 확실하지 않으면 사용자 메일 링리스트에 확인을 요청하십시오. 이미 빌드 재현성에 대한 어려운 방법을 배웠습니다.

둘째, 한 번에 여러 프로젝트를 변경하지 않는 한 일반적으로 프로젝트 종속성에 대한 고정 버전을 정의하려는 대답에 동의합니다.이 경우 SNAPSHOT 종속성 버전이 필요합니다. 그러나 이것은 그들이 풀려날 준비가 될 때까지만해야합니다. 이 시점에서 가장 낮은 레벨의 프로젝트를 릴리스하고 종속성 지정자를 다른 프로젝트의 새로운 고정 버전으로 전환 한 다음 완료 될 때까지 각 프로젝트마다 반복해야합니다. 모든 의존성이 고정 된 버전 인 경우에만 새 버전의 프로젝트를 릴리스해야합니다. release plugin이 도움이 될 수 있습니다.

셋째, 독립적 인 출시 일정에도 불구하고 여러 프로젝트의 현재 "팁"이 함께 작동하는지 여부를 파악하는 것은 여전히 ​​매우 유용하거나 재미있을 수 있습니다! 역방향/순방향 호환성 계획, 맞습니까? 더 많은 프로젝트가 진행됨에 따라 이것이 더욱 중요 해지고 있습니다. 저는 이것이 당신이 이야기하고있는 "지속적인 통합"이라고 생각합니다. (요즘 CI는 일반적으로 단일 지점에서 작업하는 여러 개발자의 변화를 지속적으로 구축하고 테스트하는 것을 말합니다).

이 경우 모든 관련 프로젝트를 모듈로 정의하는 최상위 레벨 집계 프로젝트를 만들어야합니다. 버전 제어를 변경하지 않고 작업 영역에서이 작업을 수행하거나 기본 행 변경을 추적하는 각 프로젝트에 대해 통합 특정 분기를 작성할 수 있습니다. 두 경우 모두 versions : use-latest-versions 목표를 사용하여 POM에 대한 업데이트를 자동화하거나 version ranges을 사용하여 현재 'RELEASE'를 사용하는 방법과 유사하게 선택할 수 있습니다 (비록 버전 가능하면 명료하게하십시오.)

(엄밀히 말하면, 당신은 최상위 애그리 게이터 (aggregator)를 필요로하지 않지만, 그렇지 않으면 당신은 정말 당신이 그들이 함께 작동하는 방법에 관심이있는 경우, 독립적으로 모든 프로젝트에이 작업을 수행 할 필요가있다.)도

+0

과 같은 "항상 최신의 모든 것을 사용하십시오"접근법에서 출발하는 팀에게는 때로는 프로젝트 경계가 분명하지 않지만 때때로 각 프로젝트에 대한 귀하의 접근 방식에 동의합니다. 당신이 실제로 재현 가능성에 신경 쓰지 않고 "모든 것의 팁"은 실제로 현재의 프로젝트 구성을 나타내지 않으므로 빌드됩니다. 그냥 조기 경보 시스템 –

+0

+1 pom 파일을보다 쉽게 ​​업데이트 할 수있는 버전 플러그인에 대한 언급입니다. – Noremac

2

, 우리는 재현 빌드를 얻을 수 있지만, 우리는 지금 깨진 것을 우리에게 말하고 지속적인 통합의 장점을 잃지 말고? 이 점이 Continuous Integration의 입니까?

아니요, 동의하지 않습니다. 모든 참조 된 프로젝트는 자신의 CI 빌드를 가지고 있어야하며, 무엇이 고장 났는지보고해야합니다.

CI 프로젝트가 프로젝트 a이고 프로젝트 b에 대한 종속성이있는 경우 빌드 a는 b가 아닌 프로젝트 a의 유효성을 테스트해야합니다. 그래서 Build a에 흥미로운 점은 프로젝트 a가 지정된 버전의 프로젝트 b와 함께 작동한다는 것입니다. 있는 가장 일반적인있는 문제, 여러 가지 생각할 수있는 솔루션이 있습니다

+0

+1 하지만 : 아마도 b의 가장 최신 버전은 "관련 없음"이지만, 그것이 변경 사항을 알리는 지 여부를 아는 것은 유용하지 않다는 것을 의미하지는 않습니다. –

+0

@Zac true이지만, 모든 프로젝트의 최신 버전을 함께 테스트하는 전용 빌드가 필요합니다. –

+0

에 동의했습니다. 그게 그가 관심이 있다면 제가 제안한 것입니다.OP –

2

(어떤 프로젝트 B의 최신 버전이 일은 무관) :

1) 당신은 함께 여러 프로젝트를 결합 할 수는 모두해야하는 경우 어쨌든 종속성 트리를 작성하고 일관된 모듈 세트로 만듭니다. 이것은 받는다는에게 간결

<modules> 
    <module>submodule-A</module> 
    <module>submodule-B</module> 
</modules> 

형식을 사용하고, 모든 그룹으로 함께 버전되어야 프로젝트들을 그룹화 할 때 유용하다. 그런 다음 릴리스를 수행 할 때마다 (또는 훨씬 덜 선호되는 옵션 인 maven-release-plugin을 사용하여) 올바른 버전으로 모든 자식 pom.xml 파일의 버전 번호를 업데이트하는 스크립트가 필요합니다. 그렇게하면 프로젝트의 모든 부분이 움직이며 전체적으로 함께 버전 화됩니다. 실제 수정 번호 (예 : 1.3.2)를 추가 할 수 있습니다.

2) 공통 서브 프로젝트를 모듈로 구성된 일관된 솔루션으로 대조 할 수없는 경우 다음 최상의 옵션은 스냅 샷을 사용하는 것입니다. 처럼 뭔가에 종속 프로젝트의 버전을 설정 :

<project> 
    ... 
    <artifactId>dependency-A</artifactId> 
    <groupId>com.company</groupId> 
    <version>1.3.2-SNAPSHOT</version> 
    ... 
</project> 

한 번에 별도의 코드베이스에 이동할 수있는 능력을 얻을 수 있습니다.스냅 샷에 직접 의존성을함으로써 도서관의 변화를 추적 할 수 있습니다 귀하의 주요 프로젝트 :

<dependencies> 
    ... 
    <dependency> 
     <artifactId>dependency-A</artifactId> 
     <groupId>com.company</groupId> 
     <version>1.3.2-SNAPSHOT</version> 
    </dependency> 
    ... 
</dependencies> 

하거나 (예 : 1.3.1을 사용하는) 현재의 개발주기를 계속 이전 버전에 의존 할 수 있습니다 1.3.2 버전이 릴리스되면 종속성을 업데이트합니다.

이 옵션은 여러 개의 독립적 인 프로젝트를 추적 할 때 약간 더 복잡하지만 원본에서 명시 적으로 어떤 버전인지에 따라 명확성을 유지합니다. 이는 모듈을 함께 버전 관리하는 것에 비해 단점입니다. 반면, 대부분의 CI 시스템 (Hudson 포함)은 구성 섹션의 끝에 "Build dependent projects?"라는 질문을하는 작업에 대한 확인란을 가지고 있습니다. (또는 그와 비슷한 것). Maven 빌드로 확인하고 실행하면 SNAPSHOT dependency-A가 다시 빌드 할 때마다 Hudson은 종속성 -A에 의존하는 프로젝트의 빌드를 자동으로 시작할 수 있습니다. 공통적으로 지속적으로 업데이트되는 종속성이있을 때 매우 편리 할 수 ​​있습니다.