2015-05-29 14 views
7

Tôi đang chuyển đổi nền tảng CI của chúng ta từ CruiseControl thành Jenkins, và dường như không tìm ra điều gì đó. làm (Disclaimer - tôi không có CI hoặc xây dựng chuyên gia tự động hóa, nhưng điều này đã được đổ vào lòng tôi và tôi thấy nó thú vị)Làm thế nào để khai báo một biến toàn cầu trong Jenkins và sử dụng nó trong một nhiệm vụ MSBuild trong mỗi dự án riêng lẻ

Trong CruiseControl, tôi có thể khai báo các biến như thế này:

<cb:define rootdir="J:\SOURCES\" /> 
<cb:define logdir="J:\SOURCES\buildlogs" /> 
<cb:define iisdir="J:\IIS\" /> 
<cb:define artifacts="artifacts\" /> 

Sau đó, sử dụng chúng như một phần của tác vụ MSBuild

<msbuild> 
     <executable>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</executable> 
     <workingDirectory>$(rootdir)$(ProjectName)</workingDirectory> 
     <projectFile>$(ProjectName).sln</projectFile> 
     <buildArgs>/p:BuildDate="1";OutDir="$(iisdir)$(ProjectName)\bin\\";WebProjectOutputDir="$(iisdir)$(ProjectName)\\"</buildArgs> 
     <targets>Rebuild;$(ProjectName)</targets> 
     <timeout>180</timeout> 
     <logger>C:\Program Files (x86)\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger> 
</msbuild> 

Nếu thư mục gốc hoặc thư mục IIS thay đổi, nó có thể dễ dàng được áp dụng cho tất cả các dự án cùng một lúc. Chúng tôi có ~ 60 dự án thiết lập, do đó, thực hiện dự án này theo dự án sẽ rất tốn thời gian. Di chuyển điều này sang Jenkins, các đối số dòng lệnh MSBuild bây giờ trông giống như thế này (một phần mẫu nhưng bao gồm những gì có liên quan):

OutDir="J:\IIS\ProjectName\bin\\";WebProjectOutputDir="J:\IIS\ProjectName\\" 

Thư mục IIS được mã hóa cứng. Tôi cần điều đó giống như thế này:

OutDir="${IIS_DIR}\ProjectName\bin\\";WebProjectOutputDir="${ITEM_ROOTDIR}\ProjectName\\" 

Có cách nào để làm điều đó không? Tôi đã thử plugin cắt cấu hình, điều này hữu ích nhưng không phù hợp với nhu cầu này từ những gì tôi thấy

Trả lời

7

Đối với biến toàn cầu, bạn cần EnvInject plugin. Điều này cho phép bạn (trong số những thứ khác) thiết lập các biến ở mức Global (nút), ở cấp độ công việc hoặc một bước. Bạn có thể đặt biến trực tiếp hoặc từ tệp thuộc tính hoặc từ tập lệnh.

Khi được đặt, các biến có sẵn dưới dạng biến môi trường cho phần còn lại của Jenkins và các bước của nó (trong phạm vi).

Đối với truyền đối số cho MSBuild, khi bạn cấu hình một bước MSBuild, có một tùy chọn để vượt qua "đối số dòng lệnh" trong các định dạng /p:Param=Value.

Các "giá trị" có thể là một biến môi trường. Trên môi trường Windows, bạn sẽ tham khảo nó tính theo% myvar%

Vì vậy, nếu bạn cấu hình một toàn cầu GLOBAL_IIS_DIR=C:\path\to\IIS sử dụng EnvInject, sau đó bạn có thể tham khảo nó trên dòng lệnh với /p:IIS_DIR=%GLOBAL_IIS_DIR%

+0

Điều này làm việc cho tôi – TechDawg270

19

Bạn có thể làm điều này với built-in Jenkins' chức năng:

enter image description here

Sau đó, bạn cần phải mở rộng biến của mình. Điều này, thực sự, phụ thuộc vào nơi bạn sẽ sử dụng nó.

Ví dụ: %MSBuild%%IIS_DIR% cho bước xây dựng "Thực thi loạt lệnh". Các bước xây dựng khác (và plugin) có thể sử dụng nó một cách khác nhau.

+0

Tôi đã thử điều này và nó hoạt động tốt – TechDawg270

+1

btw, sử dụng '$ {GIT_BRANCH}' cho shell – Yar

Các vấn đề liên quan