2011-10-19 3 views
2

TeamCity 6.5.4를 사용하고 있으며 동일한 배포 패키지에 대해 3 가지 빌드 구성이 필요합니다. 세 가지 빌드 구성 모두에서 버전 번호를 유지하고 어셈블리 버전, vcs 태그, nuspec 파일 버전 등을 사용할 수 있습니다.빌드 단계 및 빌드 구성 전반에 걸친 버전 번호

다음은 구성 및 원하는 버전 번호입니다.

Configuration  | Version 
-------------------|--------- 
CI/Nightly Build | 1.1.* 
Minor Release  | 1.*.0 
Major Release  | *.0.0 

TeamCity는 각 구성에 대해 별도의 빌드 증분기를 사용하는 것으로 보입니다. 즉, 메이저 또는 마이너 릴리스가있을 때마다 이후의 모든 구성에서 지속 된 값 (1)을 수동으로 업데이트해야합니다. 나는 프로그래머이고 나는 게으르다. 나는 하나의 단추가 나를 위해 모든 것을하기를 원한다.

종속 스냅 샷이있는 구성의 빌드 단계를 통해 빌드 번호를 유지하는 예가 있지만 동일한 구성에서만 작동합니다.

자동 증가 플러그인은 번 ID를 참조 할 때마다 번에 부딪칩니다. 이것은 변경 숫자 (*)에 대해서는 문제가 없지만 지속 된 값 (1)을 참조하는 데는 그리 좋지 않습니다.

기본적으로 또는 플러그인을 통해 TeamCity에서 해당 버전을 빌드 구성에서 유지할 수있는 파일 또는 변수에 읽고 쓸 수있는 방법이 있습니까? btx 후자의 BT ID입니다

답변

1

제안 해 주셔서 감사합니다. 원격 XML "매니페스트"파일에 어셈블리 메타 데이터를 유지 관리하는 내 MSBuild 스크립트와 함께 사용할 사용자 지정 대상 집합을 작성했습니다. 새로운 TeamCity 프로젝트가 생성되면, 빌드 스크립트는 초기화되지 않은 템플릿으로부터 새로운 매니 페스트 파일을 생성하는 Init 타겟을 호출합니다.

<Copy SourceFiles="@(ManifestTemplate)" DestinationFiles="@(ManifestTemplate->'$(ManifestFile)')" Condition="!Exists('$(ManifestFile)')" /> 

MSBuild Extentions 팩을 사용하여 매니페스트 파일의 버전 정보와 같은 특성을 읽습니다.

<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="ReadElementText" File="$(ManifestFile)" XPath="/Package/Version/Major"> 
    <Output PropertyName="PackageVersionMajor" TaskParameter="Value"/> 
</MSBuild.ExtensionPack.Xml.XmlFile> 

TeamCity 빌드 구성을 CI, 테스트, 마이너 릴리스 및 메이저 릴리스로 구분하여 각기 다른 이벤트를 트리거합니다. 내 프로젝트 빌드 스크립트의 해당 대상에서 DependsOnTargets 특성에 새 대상을 추가하여 사용자 지정 대상을 호출하여 적절한 버전 번호를 업데이트하고이를 매니페스트 파일에 저장합니다.

<Target Name="Test" DependsOnTargets="IntializeBuildProject;Build-UpdateVersion-Build"> 
<MSBuild Projects="$(SolutionFile)" Targets="Rebuild" Properties="Configuration=$(Configuration)" /> 
<TeamCitySetBuildNumber BuildNumber="$(PackageVersion)" /> 

버전 업데이트를 처리 할 수있는 사용자 정의 대상의 코드는 :

<MSBuild.ExtensionPack.Science.Maths TaskAction="Add" Numbers="$(PackageVersionBuild);1"> 
    <Output PropertyName="PackageVersionBuild" TaskParameter="Result"/> 
</MSBuild.ExtensionPack.Science.Maths> 
<MSBuild.ExtensionPack.Xml.XmlFile TaskAction="UpdateElement" File="$(ManifestFile)" XPath="/Package/Version/Build" InnerText="$(PackageVersionBuild)"/> 

이 파일은 버전에 따라서 인 TeamCity 빌드 번호를 무시하고 다른 메타 데이터의 지속성을 처리합니다. XML 메타 데이터 파일은 중앙 집중식이므로이 값을 사용하여 Nuspec, AssemblyInfo 및 WiX Installer 메타 데이터를 채울뿐만 아니라 버전 및 기타 관련 정보를 서비스 메시지를 통해 TeamCity에 다시 전달할 수 있습니다.

패키지 정보가 변경된 경우 팀에서 원격으로 파일 콘텐츠를 편집 할 수 있도록 간단한 MVC 웹 인터페이스를 추가했습니다. 이제는 주어진 빌드 프로젝트에 대한 저작권 정보 및 기타 메타 데이터를 업데이트하는 단일 장소가 있습니다. 또한 비 Dev 팀 구성원에게 내 TeamCity 빌드 구성에 대한 액세스를 허용하지 않고 브랜딩 정보를 업데이트하기 위해 MVC 사이트에 액세스 할 수 있습니다.

TeamCity로 버전을 릴레이하는 데 사용되는 서비스 메시지를 제외하면 TeamCity와 결합 된 서비스 메시지가 거의 없습니다. 필자는 다른 빌드 관리 솔루션으로 이동할 기회가있을 때 TeamCity에서 제거 된 스크립트를 빌드하고 사용자 지정 대상에 기능을 추가하는 것을 좋아합니다. 이런 이유로 TeamCity 플러그인을 구축하는 데 시간을 할애하지는 않지만 블로그 시리즈가 곧 출시 될 수 있습니다.

관심있는 모든 사용자에게 더 많은 코드와 자세한 설명을 제공해 드리겠습니다.

3

당신은 dep.btx.build.number를 사용하여 따라 (유물/스냅 샷) 구성의 빌드 번호를 참조 할 수 있습니다. 빌드 번호를 확인한 후 구성에서 실행중인 스크립트에 빌드 번호를 전달하고 스크립트에서 빌드 번호를 구문 분석 한 다음 스크립트에서 service messages을 Teamcity로 보내 원하는 방식으로 빌드 번호를 설정합니다. 이 파싱 및 설정 번호를 스크립트의 첫 번째 단계/빌드 단계의 첫 번째 단계로 수행합니다.

+0

답변 해 주셔서 감사합니다. 이것은 종속 아티팩트가있는 동일한 빌드 구성에서 정상적으로 작동합니다. 여기서 내가 가진 것은 세 가지 단계로 구성된 세 가지 빌드 구성입니다. 빌드 단계가 아닌 구성 전반에 걸쳐 버전 번호를 유지할 수 있어야합니다. –

+0

더 명확히하기 위해, CI 빌드는 vcs 커밋시 발생할 것이며 버전 2.19.123을 예를 들어 제거해야합니다. 마이너 릴리스 빌드는 수동으로 실행되며 버전 2.20.0을 쫓아 내야합니다. 주요 릴리즈 빌드도 수동으로 실행되며 버전 3.0.0을 제거해야합니다. 이 모든 일이 일어나기 위해서는 후속 빌드를 위해 버전을 저장하고 참조 할 수있는 중심적인 장소가 있어야합니다. –

+0

@DaveBaxter - 내 대답을 이해하지 못했습니다. 나는 같은 빌드 구성에 대해 말하는 것이 아닙니다. 나는 구성을 가로 질러 이야기하고있다. 다시 읽으십시오. – manojlds

0

예,이 작업을 쉽게 수행 할 수있는 플러그인을 만들 수 있습니다. 내 자동 증가 빌드 번호 (구성을 가로 질러) 플러그인을 취하여 필요에 맞게 수정할 수 있습니다. 빌드 번호는 TeamCity의 관리자 화면에서 구성 할 수있는 텍스트 파일로 저장됩니다.

http://github.com/ornatwork/tc_plugins/tree/master/unique

당신은 당신이 필요로하는 경우 변경하는 방법을 입력 나를 칠 수있다.

+0

저는이 문제를 처리하기 위해 이와 같은 플러그인을 작성하는 것을보고있었습니다. 나는 ** 내가 이런 유형의 설치가 필요한 유일한 사람이 될 수 없다는 것을 알고 있었다. 이미 가지고있는 코드를 살펴보고 환경에 어떤 변화가 필요한지 살펴 보겠습니다. 감사! –

관련 문제