簡體   English   中英

來自 SCM 的 Jenkins 管道 -> 始終完成重建

[英]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 本身出現一些奇怪的行為。

根據我們的調查,您有兩種選擇來解決這個問題(也許還有更多,但這對我們有幫助)。

  1. 保留作業根工作區以獲取 Jenkinsfile 並將源代碼下載到另一個文件夾中,例如dir('src') { git clone ... }

或者我們現在在我們的管道中實施的可能性二。

  1. 詹金斯文檔中提到:

skipDefaultCheckout 默認情況下,在代理指令中跳過從源代碼管理中檢出代碼。 例如:選項{skipDefaultCheckout()}

此命令將阻止在代理上下載 Jenkinsfile,而是在 Jenkins 主服務器上檢出它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM