[.net] CI 플랫폼 (Hudson)을 통해 C # 어셈블리 버전을 자동으로 늘리려면 어떻게해야합니까?

저와 저의 그룹은 어셈블리 버전 번호를 늘리는 것이 끔찍하며 우리는 종종 1.0.0.0 버전으로 어셈블리를 제공합니다. 분명히 이것은 많은 두통을 유발합니다.

CI 플랫폼을 통해 우리의 관행이 훨씬 나아지고 있으며 assemblyinfo.cs파일 내의 값이 자동으로 증가하도록 설정하여 어셈블리의 버전이 해당 어셈블리의 코드 변경으로 자동 업데이트되도록 설정하고 싶습니다 .

이전에 또는 명령 줄 (기억할 수 없음)을 통해 값을 증가시키는 방법을 설정 ( Hudson 을 찾기 전에 msbuild)했지만 Hudson을 사용하면 SVN 저장소를 업데이트하고 ANOTHER 빌드를 트리거합니다. Hudson이 매시간 SVN을 폴링하므로 느린 무한 루프가 발생합니다.

Hudson이 버전 번호를 올리는 것이 나쁜 생각입니까? 그것을 수행하는 다른 방법은 무엇입니까?

이상적으로 솔루션에 대한 내 기준은 다음과 같습니다.

  • 빌드 assemblyinfo.cs전에 빌드 번호를 증가시킵니다.
  • 변경된 어셈블리의 빌드 번호 만 증가시킵니다. Hudson이 빌드 할 때마다 프로젝트 폴더를 지우므로 불가능할 수 있습니다.
  • 변경된 assemblyinfo.cs를 코드 저장소 (현재 VisualSVN )에 커밋합니다.
  • Hudson이 다음에 변경 사항을 검색 할 때 새 빌드를 트리거하지 않습니다.

내 머릿속에서이 작업을 수행하면 배치 파일 / 명령을 통해 대부분의 솔루션을 쉽게 찾을 수 있었지만 내 모든 아이디어는 Hudson이 다음에 스캔 할 때 새 빌드를 트리거하도록 만들었습니다. 나는 나를 위해 모든 것을 해줄 누군가를 찾는 것이 아니라, 올바른 방향으로 나를 가리키고, 허드슨이 특정 SVN 커밋을 무시하도록하는 기술 등을 찾는다.

지금까지 내가 찾은 모든 것은 버전 번호를 자동으로 증가시키는 방법을 설명하는 기사 일 뿐이며 무한 루프로 회전 할 수있는 CI 플랫폼은 고려하지 않습니다.



답변

간단한 대안은 major.minor.*AssemblyInfo 파일 템플릿에 설명 된대로 version 특성을로 설정하여 C # 환경에서 어셈블리 버전을 증가 시키도록하는 것 입니다.

하지만 더 포괄적 인 솔루션을 찾고있을 수 있습니다.

수정 (댓글의 질문에 대한 답변) :

에서 AssemblyInfo.cs:

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]


답변

다음은 AssemblyFileVersion 특성을 스탬프 처리하기 위해 수행 한 작업입니다.

AssemblyInfo.cs에서 AssemblyFileVersion을 제거했습니다.

AssemblyFileInfo.cs라는 비어있는 새 파일을 프로젝트에 추가합니다.

Hudson 빌드 머신에 MSBuild 커뮤니티 작업 도구 집합을 설치 하거나 프로젝트에서 NuGet 종속성 으로 설치합니다.

msbuild 파일 인 프로젝트 (csproj) 파일을 편집하고 다음을 추가합니다.

어딘가에 <PropertyGroup>버전을 명시 할 것입니다. 예를 들어 읽도록 변경하십시오.

 <Major>1</Major>
 <Minor>0</Minor>
 <!--Hudson sets BUILD_NUMBER and SVN_REVISION -->
 <Build>$(BUILD_NUMBER)</Build>
 <Revision>$(SVN_REVISION)</Revision>

Hudson은 프로젝트가 hudson을 기반으로 빌드 될 때 표시되는 환경 변수를 제공합니다 (Subversion에서 가져 온다고 가정).

프로젝트 파일 하단에

 <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')" />
  <Target Name="BeforeBuild" Condition="Exists('$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets')">
    <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)" />
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyFileInfo.cs" AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" AssemblyConfiguration="$(Configuration)" Condition="$(Revision) != '' " />
  </Target>

이것은 MSBuildCommunityTasks를 사용하여 프로젝트가 빌드되기 전에 AssemblyFileVersion 특성을 포함하도록 AssemblyFileVersion.cs를 생성합니다. 원하는 경우 모든 버전 속성에 대해이 작업을 수행 할 수 있습니다.

결과적으로 허드슨 빌드를 발행 할 때마다 결과 어셈블리는 1.0.HUDSON_BUILD_NR.SVN_REVISION (예 : 1.0.6.2632)의 AssemblyFileVersion을 얻습니다. 즉, 허드슨의 6 번째 빌드 번호는 Subversion 개정 2632에서 가져온 것입니다.


답변

다음은 새 프로젝트를 추가 할 때 약간의 사전 작업이 필요하지만 프로세스를 매우 쉽게 처리하는 우아한 솔루션입니다.

아이디어는 각 프로젝트가 어셈블리 버전 정보 만 포함하는 솔루션 파일에 연결된다는 것입니다. 따라서 빌드 프로세스는 단일 파일 만 업데이트하면되고 모든 어셈블리 버전은 컴파일시 하나의 파일에서 가져옵니다.

단계 :

  1. 솔루션 파일 * .cs 파일에 클래스를 추가하십시오. 이름은 min SharedAssemblyProperties.cs입니다.
  2. 새 파일에서 모든 cs 정보를 제거하십시오.
  3. AssemblyInfo 파일에서 어셈블리 정보를 잘라냅니다. [assembly : AssemblyVersion ( “1.0.0.0”)] [assembly : AssemblyFileVersion ( “1.0.0.0”)]
  4. “using System.Reflection;”문을 추가하십시오. 파일에 데이터를 붙여 넣은 다음 새 cs 파일 (예 : SharedAssemblyProperties.cs)에 데이터를 붙여 넣습니다.
  5. 프로젝트에 기존 항목을 추가하십시오 (파일을 추가하기 전에 계속 읽으십시오).
  6. 파일을 선택하고 추가를 클릭하기 전에 추가 버튼 옆의 드롭 다운을 클릭하고 “링크로 추가”를 선택합니다.
  7. 솔루션의 모든 기존 프로젝트와 새 프로젝트에 대해 5 단계와 6 단계를 반복합니다.

파일을 링크로 추가하면 프로젝트 파일에 데이터가 저장되고 컴파일시이 파일에서 어셈블리 버전 정보를 가져옵니다.

소스 제어에서 단순히 SharedAssemblyProperties.cs 파일을 증가시키는 bat 파일 또는 스크립트 파일을 추가하면 모든 프로젝트가 해당 파일에서 어셈블리 정보를 업데이트합니다.


답변

Hudson은 특정 경로 및 파일에 대한 변경 사항을 무시하도록 구성하여 새 빌드를 프롬프트하지 않도록 할 수 있습니다.

작업 구성 페이지의 소스 코드 관리 아래 에서 고급 버튼을 클릭 합니다. 에서 제외 된 지역 상자는 경기를 제외 하나 이상의 정규 표현식을 입력합니다.

예를 들어 version.properties 파일의 변경 사항을 무시 하려면 다음을 사용할 수 있습니다.

/MyProject/trunk/version.properties

이것은 C # 이외의 언어에서 작동하며 Subversion 내에 버전 정보를 저장할 수 있습니다.


답변

.NET이이 작업을 수행합니다. AssemblyInfo.cs 파일에서 어셈블리 버전을 major.minor. * (예 : 1.0. *)로 설정합니다.

프로젝트를 빌드하면 버전이 자동으로 생성됩니다.

빌드 및 개정 번호는 유닉스 시대를 사용하여 날짜를 기반으로 생성됩니다. 빌드는 현재 날짜를 기반으로하고 개정은 자정 이후 초 수를 기반으로합니다.


답변

1.0. * 기능이 VS2005 또는 VS2008에서 작동하는 것을 실제로 본 적이 없습니다. 값을 증가시키기 위해 VS를 설정하기 위해 수행해야 할 작업이 있습니까?

AssemblyInfo.cs가 1.0. *로 하드 코딩 된 경우 실제 빌드 / 개정은 어디에 저장됩니까?

1.0. *를 AssemblyInfo에 넣은 후 ProductVersion에 잘못된 값이 있기 때문에 다음 문을 사용할 수 없습니다. VS에서 할당 한 값이 아닌 1.0. *를 사용하고 있습니다.

Version version = new Version(Application.ProductVersion);

한숨-이것은 모두가 물어 보는 것들 중 하나 인 것 같지만 어떻게 든 확실한 대답은 없습니다. 몇 년 전에 수정 번호를 생성하고 빌드 후 프로세스의 일부로 AssemblyInfo에 저장하는 솔루션을 보았습니다. VS2008에는 이런 종류의 춤이 필요하지 않기를 바랐습니다. 어쩌면 VS2010?


답변

아래 AssemblyVersion.tt와 같은 환경에서 문제의 어셈블리 특성을 즉석에서 만드는 텍스트 템플릿 을 사용 하여이 작업을 수행 할 수도 있다고 가정 합니다.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#
var build = Environment.GetEnvironmentVariable("BUILD_NUMBER");
build = build == null ? "0" : int.Parse(build).ToString();
var revision = Environment.GetEnvironmentVariable("SVN_REVISION");
revision = revision == null ? "0" : int.Parse(revision).ToString();
#>
using System.Reflection;
[assembly: AssemblyVersion("1.0.<#=build#>.<#=revision#>")]
[assembly: AssemblyFileVersion("1.0.<#=build#>.<#=revision#>")]