[英]Jenkins pipeline from SCM -> always complete rebuild
對於我們的 jenkins 構建服務器,我使用了一個管道腳本,該腳本目前僅在 jenkins 中使用。 現在我將管道腳本移到我們的 git 服務器上。
jenkins 項目和您的應用程序構建良好,但是:在管道遷移到 git 之前,您的 C++ 應用程序的構建是“增量的”,因此只構建了新的更改。 因此,手動觸發構建非常快。
現在使用 git 中的管道,jenkins/msbuild 總是完全重建,但我不明白為什么。 完全重建需要大約 30 分鍾。
下面是我的管道的簡短代碼。
有沒有人觀察到這種行為? 或者知道為什么 msbuild 意味着它必須進行完整的重建?
提前致謝,喬納斯
pipeline
{
stages
{
stage('Checkout from Github') { ... }
stage('CppCheck') { ... }
stage('Generate Doxygen Documentation') { ... }
stage('Version read') { ... }
stage('Cmake Repo Preparations') { ... }
stage('Build x64')
{
steps
{
dir('build')
{
// MSBuild command line parameters:
// /m: parallel build with as many cores as the CPU has
bat '"C:/Program Files (x86)/MSBuild/14.0/Bin/amd64/MSBuild.exe" project.sln /p:configuration=release /p:platform=x64 /m'
}
}
}
stage('Create installer') { ... }
stage('Archive') { ... }
stage('Deploy to NFS') { .. }
}
post { ... }
}
這個問題已經存在一年了,但我想分享我們的調查,因為我們偶然發現了同樣的問題並在Jenkins v.235.2上觀察到以下內容。
在代理上執行的第一個命令是“來自 SCM 的管道”,可見的階段是管道階段概述中的“聲明性 SCM 檢出”。 因此,此命令會將包含管道指令的 Jenkinsfile 下載到代理上的相應 Jenkins 工作區。 通過執行此命令並下載 Jenkinsfile,它會在您的代理的作業根工作區(例如 C:\\jenkins\\workspace\\jobA\\.git)中創建一個“.git”文件夾。 由於您現在獲取源代碼以構建您的軟件,因此“.git”文件夾本身將被覆蓋/替換到同一工作區位置。 刪除“.git”文件夾的元數據會導致新的干凈提取和軟件構建。 這也可能導致 Git 本身出現一些奇怪的行為。
根據我們的調查,您有兩種選擇來解決這個問題(也許還有更多,但這對我們有幫助)。
dir('src') { git clone ... }
。或者我們現在在我們的管道中實施的可能性二。
skipDefaultCheckout 默認情況下,在代理指令中跳過從源代碼管理中檢出代碼。 例如:選項{skipDefaultCheckout()}
此命令將阻止在代理上下載 Jenkinsfile,而是在 Jenkins 主服務器上檢出它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.