Làm cách nào để tôi có thể tự động tăng phiên bản hợp ngữ C # thông qua nền tảng CI của chúng tôi (Hudson)?


112

Bản thân tôi và nhóm của tôi rất kinh khủng khi tăng số phiên bản lắp ráp và chúng tôi thường gửi các bộ lắp ráp có phiên bản 1.0.0.0. Rõ ràng, điều này gây ra rất nhiều đau đầu.

Chúng tôi đang tiến bộ hơn rất nhiều với các phương pháp thực hành thông qua nền tảng CI của mình và tôi thực sự muốn thiết lập nó để tự động tăng các giá trị trong assemblyinfo.cstệp để các phiên bản của hội đồng của chúng tôi được tự động cập nhật với các thay đổi mã trong hội đồng đó.

Trước đây tôi đã thiết lập (trước khi chúng tôi tìm thấy Hudson ) một cách để tăng giá trị thông qua một trong hai msbuildhoặc dòng lệnh (không thể nhớ), nhưng với Hudson, điều đó sẽ cập nhật kho lưu trữ SVN và kích hoạt bản dựng KHÁC. Điều đó sẽ dẫn đến một vòng lặp vô hạn chậm khi Hudson thăm dò ý kiến ​​của SVN mỗi giờ.

Có phải để Hudson tăng số phiên bản là một ý tưởng tồi? Một cách thay thế để làm điều đó là gì?

Lý tưởng nhất, tiêu chí của tôi cho một giải pháp sẽ là:

  • Tăng số bản dựng assemblyinfo.cstrước khi xây dựng
  • Chỉ tăng số bản dựng trong các tổ hợp đã thay đổi. Điều này có thể không thực hiện được vì Hudson xóa sạch thư mục dự án mỗi khi xây dựng
  • Cam kết assemblyinfo.cs đã thay đổi vào kho lưu trữ mã (hiện tại là VisualSVN )
  • Không khiến Hudson kích hoạt bản dựng mới vào lần tiếp theo khi nó quét các thay đổi

Trong đầu, tôi có thể dễ dàng tìm ra giải pháp cho hầu hết vấn đề này thông qua các tệp / lệnh hàng loạt, nhưng tất cả ý tưởng của tôi sẽ khiến Hudson kích hoạt một bản dựng mới vào lần quét tiếp theo. Tôi không tìm ai đó làm mọi thứ cho tôi, chỉ tôi đi đúng hướng, có thể là một kỹ thuật để khiến Hudson bỏ qua một số cam kết SVN nhất định, v.v.

Mọi thứ tôi tìm thấy cho đến nay chỉ là một bài báo giải thích cách lấy số phiên bản tự động tăng lên, không có gì tính đến nền tảng CI có thể được xoay thành một vòng lặp vô hạn.

Câu trả lời:


63

Một giải pháp thay thế đơn giản là để môi trường C # tăng phiên bản lắp ráp cho bạn bằng cách đặt thuộc tính phiên bản thành major.minor.*(như được mô tả trong mẫu tệp AssemblyInfo.)

Tuy nhiên, bạn có thể đang tìm kiếm một giải pháp toàn diện hơn.

CHỈNH SỬA (Trả lời câu hỏi trong một nhận xét):

Từ 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.*")]

Tôi chưa bao giờ gặp nó trước đây, bạn có thể đi vào chi tiết hơn một chút về những gì nó làm. Nó chỉ hoạt động trong một IDE hay nó hoạt động trên toàn bộ nhóm các nhà phát triển với nền tảng CI?
Allen Rice,

ahhh Tôi đã thấy điều đó trước đây, đó có thể là một giải pháp chấp nhận được nhưng # được xây dựng không được lưu trữ trong subversion, v.v. Tôi đã thiết lập Hudson để lưu trữ các tệp và theo cách đó, nó được lưu trữ để có thể chấp nhận được. Tôi sẽ phải nghiên cứu thêm về cách hoạt động của cơ chế đó, cảm ơn! Bạn sẽ không biết làm thế nào nó xác định những gì cần đưa vào làm giá trị, phải không?
Allen Rice

1
Xem câu trả lời của tôi dưới đây để biết câu trả lời cho câu hỏi của bạn. Các giá trị được xác định dựa trên thời gian xây dựng.
Kyle Trauberman, 14/07/09

Chà, tôi nghĩ điều này sẽ hiệu quả. Không chắc chúng tôi đã bỏ qua một giải pháp đơn giản như vậy như thế nào
Allen Rice

Hy vọng nó không, rất vui vì tôi có thể giúp đỡ. Tại sao phải làm điều gì đó một cách khó khăn trong khi cách dễ dàng, nhanh chóng cũng là cách đúng đắn? :)
Greg D

65

Đây là những gì tôi đã làm, để đóng dấu thuộc tính AssemblyFileVersion.

Đã xóa AssemblyFileVersion khỏi AssemblyInfo.cs

Thêm một tệp mới, trống, có tên là AssemblyFileInfo.cs vào dự án.

Cài đặt bộ công cụ nhiệm vụ cộng đồng MSBuild trên máy xây dựng hudson hoặc dưới dạng phụ thuộc NuGet trong dự án của bạn.

Chỉnh sửa tệp dự án (csproj), nó chỉ là một tệp msbuild và thêm phần sau.

Ở đâu đó sẽ có một <PropertyGroup>phiên bản nêu rõ. Thay đổi điều đó để nó đọc ví dụ:

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

Hudson cung cấp các biến env mà bạn thấy ở đó khi dự án được xây dựng trên hudson (giả sử nó được lấy từ subversion).

Ở cuối tệp dự án, thêm

 <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>

Điều này sử dụng MSBuildCommunityTasks để tạo AssemblyFileVersion.cs để bao gồm một thuộc tính AssemblyFileVersion trước khi dự án được xây dựng. Bạn có thể làm điều này cho bất kỳ / tất cả các thuộc tính phiên bản nếu bạn muốn.

Kết quả là, bất cứ khi nào bạn phát hành bản dựng hudson, hợp ngữ kết quả sẽ nhận được AssemblyFileVersion là 1.0.HUDSON_BUILD_NR.SVN_REVISION, ví dụ: 1.0.6.2632, có nghĩa là bản dựng thứ 6 # trong hudson, bắt nguồn từ bản sửa đổi subversion 2632.


1
Vì vậy, chỉ cần cập nhật điều này: Phương thức hoạt động cho C #. Tôi đã sử dụng nó một thời gian. Nhưng các hợp ngữ C ++ (tức là C ++ / CLI) vẫn là một vấn đề. Theo như tôi có thể nói, tác vụ AssemblyInfo không tạo ra C ++ hợp lệ. Ngoài ra, tôi nghĩ rằng phương pháp này có một chút nhược điểm là nó hơi mờ đối với các nhà phát triển khác để hiểu những gì đang xảy ra. Quá xấu bạn không thể đẩy số phiên bản trực tiếp vào MSBuild như một tài sản ...
CJBrew

@CJBrew Bạn chỉ có thể tạo một tệp .bat nhỏ tạo ra mã C ++ cho AssemblyInfo và khởi động msbuild. Tôi không chắc ý của bạn khi đẩy nó như một thuộc tính, bạn chắc chắn có thể nhồi các chuỗi phiên bản vào bất kỳ thuộc tính nào bạn thích - bạn không cần phải sử dụng phiên bản chính / nhỏ / xây dựng / mà tôi đã sử dụng ở đây.
nos

Có gì thu được bằng cách sử dụng tuyến đường này không so với chỉ nhận xét ra AssemblyFileVersion và để nó tự động khớp với [assembly: AssemblyVersion ("1.0. *")]?
cchamberlain

@ColeChamberlain Điều đó sẽ tự động tăng lên nếu bạn xây dựng nó từ studio trực quan trên PC của riêng mình, không phải từ Hudson - và không có liên quan đến số phiên bản cũng như bản sửa đổi mã nguồn và bản dựng cụ thể.
nos

42

Đây là một giải pháp thanh lịch đòi hỏi một ít công việc trả trước khi thêm một dự án mới nhưng xử lý quá trình rất dễ dàng.

Ý tưởng là mỗi dự án liên kết đến một tệp Giải pháp chỉ chứa thông tin phiên bản lắp ráp. Vì vậy, quá trình xây dựng của bạn chỉ phải cập nhật một tệp duy nhất và tất cả các phiên bản hợp ngữ đều lấy từ một tệp khi biên dịch.

Các bước:

  1. Thêm một lớp vào tệp giải pháp của bạn tệp * .cs, tôi đặt tên là min SharedAssemblyProperties.cs
  2. Xóa tất cả thông tin cs khỏi tệp mới đó
  3. Cắt thông tin lắp ráp từ tệp AssemblyInfo: [assembly: AssemblyVersion ("1.0.0.0")] [assembly: AssemblyFileVersion ("1.0.0.0")]
  4. Thêm câu lệnh "using System.Reflection;" vào tệp và sau đó dán dữ liệu vào tệp cs mới của bạn (ví dụ: SharedAssemblyProperties.cs)
  5. Thêm một mục hiện có vào dự án của bạn (đợi ... đọc tiếp trước khi thêm tệp)
  6. Chọn tệp và trước khi bạn nhấp vào Thêm, hãy nhấp vào menu thả xuống bên cạnh nút thêm và chọn "Thêm dưới dạng liên kết".
  7. Lặp lại các bước 5 và 6 cho tất cả các dự án hiện có và dự án mới trong giải pháp

Khi bạn thêm tệp dưới dạng liên kết, nó sẽ lưu trữ dữ liệu trong tệp dự án và khi biên dịch sẽ lấy thông tin phiên bản lắp ráp từ một tệp này.

Trong kiểm soát nguồn của bạn, bạn thêm tệp dơi hoặc tệp tập lệnh chỉ đơn giản là tăng tệp SharedAssemblyProperties.cs và tất cả các dự án của bạn sẽ cập nhật thông tin lắp ráp của chúng từ tệp đó.


cảm ơn, Mark. Xin lỗi vì liên kết đã chết, hóa ra máy chủ cộng đồng không dễ di chuyển như vậy. Tôi nên tìm kiếm sự giúp đỡ về chủ đề đó ...
sondlerd

11

Hudson có thể được định cấu hình để bỏ qua các thay đổi đối với một số đường dẫn và tệp nhất định để nó không nhắc một bản dựng mới.

Trên trang cấu hình công việc, bên dưới Quản lý mã nguồn , hãy bấm vào nút Nâng cao . Trong hộp Khu vực bị loại trừ, bạn nhập một hoặc nhiều biểu thức chính quy để đối sánh với các loại trừ.

Ví dụ: để bỏ qua các thay đổi đối với tệp version.properties, bạn có thể sử dụng:

/MyProject/trunk/version.properties

Điều này sẽ hoạt động đối với các ngôn ngữ khác ngoài C # và cho phép bạn lưu trữ thông tin phiên bản của mình trong phiên bản lật đổ.


1
Hudson cũng có thể bỏ qua các cam kết từ một số người dùng nhất định hoặc không kích hoạt một bản dựng tùy thuộc vào thông báo cam kết. Bằng cách này, bạn có thể bỏ qua tất cả các cam kết từ Hudson.
Peter Schuetze

9

.NET thực hiện điều này cho bạn. Trong tệp AssemblyInfo.cs của bạn, hãy đặt phiên bản lắp ráp của bạn thành major.minor. * (Ví dụ: 1.0. *).

Khi bạn xây dựng dự án của mình, phiên bản được tạo tự động.

Tôi tin rằng số bản dựng và bản sửa đổi được tạo dựa trên ngày tháng, sử dụng kỷ nguyên unix. Bản dựng dựa trên ngày hiện tại và bản sửa đổi dựa trên số giây kể từ nửa đêm.


21
<ring, ring> "xin chào, hỗ trợ sản phẩm tôi có thể giúp gì được không?" <customer> "I have a error" <support> "ok, bạn đang chạy phiên bản nào vậy?" <customer> "phiên bản một điểm hai phiên bản tám năm hai năm ba bảy bốn phiên bản xây dựng bảy bốn sáu ba năm hai chín ..." <support> "hãy chờ, chỉ cần gõ nó ... hmmm ... vui lòng lặp lại phiên bản số, chúng tôi dường như không có bản dựng và bản sửa đổi đó được liệt kê ... "- GRRR!
Jimbo

haha bình luận tốt đẹp. Tôi không phải là fan hâm mộ của hệ thống incrementing một trong hai: p
Joshua Hayes

3
Autoincrement trong studio trực quan thật tệ.
Kugel

8
@Jimbo: Mặc dù tất cả chúng tôi đều đồng ý rằng nhận xét của bạn là hài hước, nhưng trên thực tế, điều đó không quan trọng. Khi bạn nói về cài đặt VS của mình, bạn có Visual Studio 2008 SP1 hay VS2008 9.0.30729.1 SP không? Sử dụng số phiên bản tự động tăng thêm là một kế hoạch rất phổ biến và có thể được "sửa" rất dễ dàng bằng cách tăng số phiên bản chính / phụ khi một phiên bản phát hành ra mắt.
Marek

cao nhất chúng tôi đã đạt được với số bản dựng là 678 trước khi đặt lại về 0 để tăng một chút sửa đổi (tất nhiên là cruisecontrol, có vẻ dễ đặt lại hơn hudson như trong cruisecontrol, bạn chỉ cần vào và lưu nó về 0 trong dự án , nhưng mọi thứ khác trong hudson là tốt hơn)
Dean Hiller

8

Tôi chưa bao giờ thực sự thấy tính năng 1.0. * Đó hoạt động trong VS2005 hoặc VS2008. Có cần phải làm gì đó để đặt VS tăng giá trị không?

Nếu AssemblyInfo.cs được mã hóa cứng bằng 1.0. *, Thì bản dựng / bản sửa đổi thực được lưu trữ ở đâu?

Sau khi đưa 1.0. * Vào AssemblyInfo, chúng ta không thể sử dụng câu lệnh sau vì ProductVersion hiện có giá trị không hợp lệ - nó đang sử dụng 1.0. * Chứ không phải giá trị được gán bởi VS:

Version version = new Version(Application.ProductVersion);

Haizz - đây có vẻ là một trong những điều mà ai cũng thắc mắc nhưng không hiểu sao không bao giờ có câu trả lời chắc chắn. Nhiều năm trước, tôi đã thấy các giải pháp để tạo một số sửa đổi và lưu nó vào AssemblyInfo như một phần của quá trình hậu xây dựng. Tôi hy vọng kiểu nhảy đó sẽ không bắt buộc đối với VS2008. Có thể là VS2010?


10
Bạn phải xóa AssemblyFileVersion. Ngoài ra, nó hoạt động tuyệt vời cho chúng tôi, câu trả lời được chấp nhận đó là.
Allen Rice

1
Có, việc gỡ bỏ AssemblyFileVersion cho phép phiên bản cập nhật và không còn lỗi với Phiên bản. Đẹp. Lưu ý: hai hoạt động Xây dựng chỉ tăng bản sửa đổi một lần, nhưng nếu bạn Xây dựng lại bản sửa đổi sẽ được cập nhật. Như ktrauberman đã nói, nó trông giống như build.revision = date.time, điều này giải thích tại sao dữ liệu không được lưu trữ ở bất kỳ đâu ngoại trừ trong assembly. Bây giờ tôi cần thiết lập MSI tiêu chuẩn để tạo Mã sản phẩm mới khi dự án đầu ra chính cập nhật. Thiết lập không cho phép sửa đổi, chỉ xây dựng. Tôi muốn cài đặt qua cài đặt hiện có để cập nhật. Cần phải nghiên cứu.
TonyG

5

Tôi giả sử một người cũng có thể làm điều này với một mẫu văn bản nơi bạn tạo các thuộc tính lắp ráp được đề cập một cách nhanh chóng từ môi trường như AssemblyVersion.tt thực hiện bên dưới.

<#@ 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#>")]

3

Tiếp theo câu trả lời của MikeS, tôi muốn thêm rằng SDK mô hình và hình ảnh hóa VS + Visual Studio cần được cài đặt để điều này hoạt động và bạn cũng cần sửa đổi tệp dự án. Cũng cần được đề cập, tôi sử dụng Jenkins làm máy chủ xây dựng chạy trên hộp máy chủ windows 2008 R2 với mô-đun phiên bản, nơi tôi nhận được BUILD_NUMBER.

Tệp Mẫu văn bản của tôi version.tt trông giống như thế này

<#@ 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("_BuildVersion");
revision = revision == null ? "5.0.0.0" : revision;    
#>
using System.Reflection;
[assembly: AssemblyVersion("<#=revision#>")]
[assembly: AssemblyFileVersion("<#=revision#>")]

Tôi có những thứ sau đây trong Nhóm tài sản

<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    <OverwriteReadOnlyOutputFiles>true</OverwriteReadOnlyOutputFiles>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

sau khi nhập Microsoft.CSharp.targets, tôi có cái này (tùy thuộc vào nơi bạn cài đặt VS

<Import Project="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

Trên máy chủ bản dựng của tôi, sau đó, tôi có tập lệnh sau để chạy chuyển đổi văn bản trước bản dựng thực tế, để nhận số tập hợp thay đổi cuối cùng trên TFS

set _Path="C:\Build_Source\foo"

pushd %_Path% 
"%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\tf.exe" history . /r /noprompt /stopafter:1 /Version:W > bar
FOR /f "tokens=1" %%foo in ('findstr /R "^[0-9][0-9]*" bar') do set _BuildVersion=5.0.%BUILD_NUMBER%.%%foo
del bar
popd

echo %BUILD_NUMBER%
echo %_BuildVersion%
cd C:\Program Files (x86)\Jenkins\jobs\MyJob\workspace\MyProject
MSBuild MyProject.csproj /t:TransformAll 
...
<rest of bld script>

Bằng cách này, tôi có thể theo dõi các bản dựng VÀ tập hợp thay đổi, vì vậy nếu tôi chưa kiểm tra bất kỳ thứ gì kể từ lần xây dựng cuối cùng, thì chữ số cuối cùng sẽ không thay đổi, tuy nhiên, tôi có thể đã thực hiện các thay đổi đối với quá trình xây dựng, do đó cần phải có số cuối cùng thứ hai . Tất nhiên nếu bạn thực hiện nhiều đăng ký trước khi xây dựng, bạn chỉ nhận được thay đổi cuối cùng được phản ánh trong phiên bản. Tôi đoán bạn có thể nối điều đó là bắt buộc.

Tôi chắc rằng bạn có thể làm điều gì đó lạ lùng hơn và gọi TFS trực tiếp từ bên trong Mẫu tt, tuy nhiên điều này phù hợp với tôi.

Sau đó, tôi có thể tải phiên bản của mình trong thời gian chạy như thế này

Assembly assembly = Assembly.GetExecutingAssembly();
FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
return fvi.FileVersion;

1

Giải pháp của tôi không yêu cầu bổ sung các công cụ bên ngoài hoặc ngôn ngữ kịch bản - nó được đảm bảo khá nhiều để hoạt động trên máy xây dựng của bạn. Tôi giải quyết vấn đề này trong một số phần. Đầu tiên, tôi đã tạo một tệp BUILD.BAT chuyển đổi tham số Jenkins BUILD_NUMBER thành một biến môi trường. Tôi sử dụng chức năng "Thực thi lệnh lô của Windows" của Jenkins để chạy tệp lô bản dựng bằng cách nhập thông tin sau cho bản dựng Jenkins:

     ./build.bat --build_id %BUILD_ID% -build_number %BUILD_NUMBER%

Trong môi trường xây dựng, tôi có tệp build.bat bắt đầu như sau:

     rem build.bat
     set BUILD_ID=Unknown
     set BUILD_NUMBER=0
     :parse_command_line
     IF NOT "%1"=="" (
         IF "%1"=="-build_id" (
             SET BUILD_ID=%2
             SHIFT
             )
         IF "%1"=="-build_number" (
             SET BUILD_NUMBER=%2
             SHIFT
         )
         SHIFT
         GOTO :parse_command_line
     )
     REM your build continues with the environmental variables set
     MSBUILD.EXE YourProject.sln

Sau khi làm điều đó, tôi nhấp chuột phải vào dự án sẽ được xây dựng trong ngăn Giải pháp Explorer của Visual Studio và chọn Thuộc tính, chọn Tạo sự kiện và nhập thông tin sau làm Dòng lệnh tạo sự kiện trước, tự động tạo tệp .cs chứa thông tin số bản dựng dựa trên cài đặt biến môi trường hiện tại:

     set VERSION_FILE=$(ProjectDir)\Properties\VersionInfo.cs
     if !%BUILD_NUMBER%==! goto no_buildnumber_set
     goto buildnumber_set
     :no_buildnumber_set
     set BUILD_NUMBER=0
     :buildnumber_set
     if not exist %VERSION_FILE% goto no_version_file
     del /q %VERSION_FILE%
     :no_version_file
     echo using System.Reflection; >> %VERSION_FILE%
     echo using System.Runtime.CompilerServices; >> %VERSION_FILE%
     echo using System.Runtime.InteropServices; >> %VERSION_FILE%
     echo [assembly: AssemblyVersion("0.0.%BUILD_NUMBER%.1")] >> %VERSION_FILE%
     echo [assembly: AssemblyFileVersion("0.0.%BUILD_NUMBER%.1")] >> %VERSION_FILE%

Bạn có thể cần điều chỉnh để phù hợp với khẩu vị của mình. Tôi xây dựng dự án theo cách thủ công một lần để tạo tệp Version.cs ban đầu trong thư mục Thuộc tính của dự án chính. Cuối cùng, tôi đưa tệp Version.cs vào giải pháp Visual Studio theo cách thủ công bằng cách kéo tệp đó vào ngăn Giải pháp Explorer, bên dưới tab Thuộc tính cho dự án đó. Trong các bản dựng trong tương lai, Visual Studio sau đó đọc tệp .cs đó vào thời gian xây dựng Jenkins và lấy thông tin số bản dựng chính xác từ nó.


1

Vì vậy, chúng tôi có một dự án với một giải pháp chứa một số dự án có các tập hợp với các số phiên bản khác nhau.

Sau khi tìm hiểu một số phương pháp ở trên, tôi chỉ thực hiện một bước xây dựng để chạy một tập lệnh Powershell thực hiện tìm và thay thế trên tệp AssemblyInfo.cs. Tôi vẫn sử dụng số phiên bản 1.0. * Trong kiểm soát nguồn và Jenkins chỉ cập nhật thủ công số phiên bản trước khi chạy msbuild.

dir **/Properties/AssemblyInfo.cs | %{ (cat $_) | %{$_ -replace '^(\s*)\[assembly: AssemblyVersion\("(.*)\.\*"\)', "`$1[assembly: AssemblyVersion(`"`$2.$build`")"} | Out-File $_ -Encoding "UTF8" }
dir **/Properties/AssemblyInfo.cs | %{ (cat $_) | %{$_ -replace '^(\s*)\[assembly: AssemblyFileVersion\("(.*)\.\*"\)', "`$1[assembly: AssemblyFileVersion(`"`$2.$build`")"} | Out-File $_ -Encoding "UTF8" }

Tôi đã thêm tùy chọn -Encoding "UTF8" vì git đã bắt đầu coi tệp .cs là tệp nhị phân nếu tôi không làm vậy. Được, điều này không quan trọng, vì tôi chưa bao giờ thực sự cam kết kết quả; nó chỉ xuất hiện khi tôi đang thử nghiệm.

Môi trường CI của chúng tôi đã có cơ sở để liên kết bản dựng Jenkins với bản cam kết git cụ thể (cảm ơn plugin Stash!), Vì vậy tôi không lo lắng rằng không có bản cam kết git nào với số phiên bản được đính kèm với nó.


0

Đây là một cơ chế đơn giản hơn. Nó chỉ liên quan đến việc bổ sung bước xây dựng nhiệm vụ lệnh Windows Batch trước bước MSBuild và sử dụng chương trình tìm và thay thế đơn giản (FART).

Bước hàng loạt

fart --svn -r AssemblyInfo.cs "[assembly: AssemblyVersion(\"1.0.0.0\")]" "[assembly: AssemblyVersion(\"1.0.%BUILD_NUMBER%.%SVN_REVISION%\")]"
if %ERRORLEVEL%==0 exit /b 1
fart --svn -r AssemblyInfo.cs "[assembly: AssemblyFileVersion(\"1.0.0.0\")]" "[assembly: AssemblyFileVersion(\"1.0.%BUILD_NUMBER%.%SVN_REVISION%\")]"
if %ERRORLEVEL%==0 exit /b 1
exit /b 0

Nếu bạn đang sử dụng điều khiển nguồn không phải svn, hãy thay đổi tùy chọn --svn cho tùy chọn phù hợp với môi trường scm của bạn.

Tải xuống Fart


0

Tôi đã quyết định sử dụng một số phương pháp bằng cách sử dụng tập lệnh Powershell dựng sẵn ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) để tăng từng bản dựng thành công thì trong Global.asax, tôi đã làm như sau:

  // We are using debug configuration, so increment our builds.
  if (System.Diagnostics.Debugger.IsAttached)
  {
      string version = System.Reflection.Assembly.GetExecutingAssembly()
                                                       .GetName()
                                                       .Version
                                                       .ToString();

      var psi = new ProcessStartInfo(@"svn", "commit -m \"Version: " + version + "\n \"");
      psi.WorkingDirectory = @"C:\CI\Projects\myproject";
      Process.Start(psi); 
  }

Tôi vẫn nghĩ rằng toàn bộ quá trình quá phức tạp và tôi sẽ xem xét một phương pháp hiệu quả hơn để đạt được kết quả tương tự. Tôi muốn điều này chủ yếu để chuyển phiên bản vào SVN và sau đó vào Jenkin's mà không cần quá nhiều công cụ bổ sung.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.