2011-09-22 182 views
37

爲什麼詹金斯有兩種作業,多配置項目和自由式項目項目?我讀過一個地方,一旦你選擇其中一個,你不能轉換到另一個(很容易)。爲什麼我不會總是選擇多配置項目以保證未來的變化安全?Jenkins和多配置(矩陣)作業

我想爲Windows和Unix(以及其他平臺)上的項目構建一個構建版本。我找到了this question),它提出了同樣的問題,但我沒有真正得到答案。爲什麼我需要三個矩陣項目(而不是三個自由式項目),每個平臺都有一個?爲什麼我不能將它們全部保存在一個矩陣中,平臺AND(例如)一個軸上的gcc版本和另一個軸上的(我的)軟件版本?

我也讀了this blog post,但是它在同一臺機器上構建了一切,只有不同的Python版本。

因此,簡而言之:大多數人如何配置針對多個不同平臺的多配置項目?

+0

「爲什麼我不會總是選擇多配置項目以保證未來的變化安全?」我認爲這部分沒有答案 - 通過自由式項目選擇它有什麼缺點嗎 –

回答

42

的兩種類型的工作有不同的功能:

  • 遊離式作業:這允許你建立一個單一的計算機或標籤(計算機組,對於如「的Windows XP-32項目「)。
  • 多配置作業:它們允許您在多臺計算機或標籤或兩者的組合中構建項目,例如Windows-XP,Windows-Vista,Windows-7和RedHat-,這對於檢查兼容性或建設多個平臺(QT程序?)

如果你要建立在Windows & Unix的一個項目,你有兩個選擇:

  • 創建一個單獨的自由風格的工作每種配置,在這種情況下,您必須單獨維護每一個
  • 您有一個多配置作業,並且您選擇2個(或更多)標籤/計算機/從屬 - Windows 1和Unix 1。在這種情況下,你只需要維護一個作業

你可以保留你的gcc版本在一個軸上,軟件版本在另一個軸上。沒有理由你不應該這樣做。

你鏈接有一個公平點,而是一個不涉及直接你的問題的問題:在他的情況,他有一個多配置工作一個,這 - 成功 - 觸發另一個工作。現在,在多配置作業中,如果其中一個配置失敗,整個作業將失敗(顯然,因爲您希望項目在所有配置上成功構建)。

恕我直言,爲了在多個平臺上構建相同的項目,最好的方法是使用多配置樣式作業。

+4

太棒了答案!但是,有一個問題:我如何讓Jenkins只爲Windows生成服務器啓動Windows批處理文件,以及只有Linux構建服務器?用我目前的配置(多項目),它似乎也嘗試在Windows上啓動shell腳本。 – joscarsson

+1

這是唯一的問題 - 我辯論是否鍵入,因爲它似乎是很多人的downer :) 如果你可以創建一個等效的shell腳本並安裝了bash或cygwin,你可以使用它。如果不是,你唯一的選擇就是創建單獨的工作。批處理文件中是否有特殊的內容不會轉換爲shell腳本? – Sagar

+0

我明白了。我採用了簡單的方法,將構建分離到不同的自由式項目中。我讀過一些人正在使用諸如Ant之類的獨立於平臺的構建腳本。 – joscarsson

2

您可以使用jenkins在定義配置矩陣軸時創建的變量。例如: 您可以創建名稱爲OSTYPE的從軸並檢查兩個從軸(Windows和Linux)。然後,您創建兩個獨立的構建步驟並檢查OSTYPE環境變量。

您可以使用改進的腳本語言,例如python,它是多平臺的,並且可以在一個構建步驟中獨立於從站的名稱實現相同的功能。

+0

這實際上是個不錯的主意!沒有考慮如何使用環境變量,總是得出結論,我需要一個腳本在兩個平臺上運行。謝謝你的提示! – joscarsson

+0

...或者是嗎? :)我剛測試過。我仍然需要將構建步驟指定爲「執行Windows批處理命令」或「執行外殼程序」,並且如果同時指定兩個平臺上的構建均失敗。 – joscarsson

+1

@joscarsson你有沒有試過條件構建步驟插件?這樣你可以運行只有一個取決於OSTYPE。我還沒有嘗試過,請回復,如果這是爲你工作! – jan

3

你可以創建一個腳本(例如構建),並獲得與你的源代碼簽入一個批處理文件(例如的build.bat)。在Jenkins的構建步驟中,您可以撥打$ WORKSPACE/build - Windows將執行build.bat而Linux將運行build

+4

我是否將該構建步驟設置爲「執行Windows批處理命令」或「執行外殼」? – joscarsson

6

另一個選擇是使用python構建步驟來檢查當前的操作系統,然後調用適當的設置或構建腳本。在python腳本中,您可以將更新後的環境保存到一個文件中,並使用EnvInject插件再次注入環境以用於後續構建步驟。根據您的構建環境的大小,您也可以使用像SCons這樣的多平臺構建工具。

+0

基於Python的構建工具具有易於在多個平臺上部署的優勢。我們使用'doit'並確保文件處理在任何地方都能正常工作,我們使用優秀的'py'模塊('from py.path import local'')。 –

2

如果你使用Windows和其他東西進行矩陣路由,你會需要XShell插件。您只需創建兩個構建腳本,例如cmd的「build.bat」和bash的「build」,然後告訴XShell運行「構建」。正確的一個將在每種情況下運行。

1

一個黑客有Windows上運行的批處理文件和Unix上的shell腳本:

在Unix上,使批處理文件退出0退出狀態:

ln -s /bin/true /bin/cmd

在Windows上,找到一條true.exe,將其命名爲sh.exe某處放置在PATH。

或者,如果你有安裝在Windows(cygwin的版本,Git會,或其他來源)的任何sh.exe,在詹金斯將其添加到shell腳本的頂部:

[ -n "$WINDIR" ] && exit 0

1

爲什麼不你總是選擇多配置作業類型?

一些注意的原因是:

  1. 因爲工作應該很容易創建和配置。如果在你的環境中很難配置任何工作,你可能在詹金斯工作範圍之外做了一些錯誤的工作。如果你很高興能夠創造出這樣一份工作,並且它終於能夠運行,並且你不願意再次完成整個工作,那麼這就是你應該嘗試改進的地方。
  2. 由於多配置作業更復雜。他們通常會要求您考慮主要工作和不同的子工作變量,而且他們往往會變得越來越難以管理。因此,在單一的工作場景中,您可能會浪費不考慮複雜性的想法,並且在擴展構建變量時,事情可能會朝錯誤的方向發展。我建議使用簡單作業作爲默認作業,並且只有在需要多個配置時才能使用多配置作業。
  3. 因爲執行多個配置作業可能需要比單個作業更多的從屬作業槽。總是會有一個主作業在一個特殊的不可見的插槽(它本身沒有問題)上執行並觸發子作業,但是如果這些子作業自己觸發子作業,那麼如果存在比插槽更多的子作業,並且一些子作業再次觸發子作業,然後由於沒有更多的空插槽而無法執行。通過在從服務器上使用一些配置設置可以規避此問題,但它存在並且可能只在多個多任務同時運行時纔會發生。

所以實質上:多配置工作是一件更復雜的事情,因爲複雜性應該避免,除非必要,否則常規自由式作業是更好的默認設置。

0

如果要選擇運行作業的從屬設備,則需要使用多配置項目(否則,您將無法選擇/限制運行它的從站 - 有三種方法可以執行但是我已經嘗試過所有這些(Tie插件僅適用於主工作,Restrict in Advanced Project Options並非搖滾安全的觸發器,所以您想使用證明今天能正常工作的從軸。)