簡體   English   中英

在 Jenkins 中,如何將項目檢出到特定目錄(使用 GIT)

[英]In Jenkins, how to checkout a project into a specific directory (using GIT)

很抱歉'svn' 風格 - 我們正在從 SVN 遷移到 GIT(包括我們的 CI Jenkins 環境)。

我們需要的是能夠讓 Jenkins 檢出(或者我應該說是克隆?)GIT 項目(存儲庫?)到特定目錄中。 我們已經嘗試了一些 refspecs 魔法,但理解和成功使用並不是很明顯。

此外,如果在同一個 Jenkins 項目中我們需要將多個私有 GitHub 存儲庫簽出到項目根目錄下的幾個單獨的目錄中,我們該怎么做?

我們已經安裝了 GitHub 插件。 希望我們的措辭是正確的。

在新的 Jenkins 2.0 管道(以前稱為工作流插件)中,這與以下方面不同:

  • 主存儲庫
  • 其他附加存儲庫

這里我特指的是 Multibranch Pipeline 2.9 版。

主存儲庫

這是包含您的Jenkinsfile的存儲庫。

在管道項目的配置屏幕中,輸入您的存儲庫名稱等。

不要使用“附加行為”>“簽出到子目錄” 這會將您的Jenkinsfile放在Jenkins 找不到的子目錄

Jenkinsfile ,使用dir()檢出子目錄中的主存儲庫:

dir('subDir') {
    checkout scm
}

附加存儲庫

如果您想查看更多存儲庫,請使用流水線語法生成器自動生成 Groovy 代碼片段。

在管道項目的配置屏幕中:

  1. 選擇管道語法 Sample Step下拉菜單中,選擇checkout: General SCM
  2. 選擇您的 SCM 系統,例如Git 填寫有關您的存儲庫或軟件倉庫的常用信息。
  3. 請注意,在 Multibranch Pipeline 中,環境變量env.BRANCH_NAME包含主存儲庫的分支名稱。
  4. 在“附加行為”下拉菜單中,選擇“簽出到子目錄”
  5. 單擊生成 Groovy Jenkins 將顯示與您指定的 SCM 結賬對應的 Groovy 代碼片段。
  6. 將此代碼復制到您的管道腳本或Jenkinsfile

我同意@Łukasz Rżanek 我們可以使用git 插件

但是,我使用 option: checkout to a sub-direction 啟用如下:
Source Code Management 中,勾選 Git
單擊添加按鈕,選擇結帳到子目錄

在此處輸入圖片說明

Jenkins 的默認git 插件可以很好地完成這項工作。

在向項目添加新的 git 存儲庫(項目配置 >源代碼管理> 檢查 GIT 選項)后,導航到插件設置的底部,就在存儲庫瀏覽器區域的上方。 應該有一個高級按鈕。 單擊它后,應出現一個新表單,其值描述為本地子目錄 repo (optional) 將此設置為folder將使插件將存儲庫檢出到相對於您的工作區的文件夾中。 通過這種方式,您可以根據需要在項目中擁有任意數量的存儲庫,所有存儲庫都位於不同的位置。

或者,如果您使用的項目允許這樣做,您可以使用 GIT 子模塊,它們類似於 SVN 中的外部路徑。 GIT Book 中有一個關於這個主題的部分。 如果這不會違反某些政策,子模塊使用起來相當簡單,為您提供了強大的方式來控制將要導入的位置、版本/標簽/分支,並且它將在您的本地存儲庫中可用,並為您提供更好的可移植性。

顯然,GIT 插件支持檢出子模塊,因此 Jenkins 可以非常有效地使用它們。

值得研究 Pipeline 插件。 使用該插件,您可以將多個 VCS 項目檢出到相對目錄路徑中。 預先為每個 VCS 簽出創建一個目錄。 然后向新檢出的 VCS 工作區發出命令。 就我而言,我使用的是 git。 但你應該明白。

node{
    def exists = fileExists 'foo'
    if (!exists){
        new File('foo').mkdir()
    }
    dir ('foo') {
        git branch: "<ref spec>", changelog: false, poll: false, url: '<clone url>'
        ......
    }
    def exists = fileExists 'bar'
    if (!exists){
        new File('bar').mkdir()
    }
    dir ('bar') {
        git branch: "<ref spec>", changelog: false, poll: false, url: '<clone url>'
        ......
    }
    def exists = fileExists 'baz'
    if (!exists){
        new File('baz').mkdir()
    }
    dir ('baz') {
        git branch: "<ref spec>", changelog: false, poll: false, url: '<clone url>'
        ......
    }
}

此外,如果在同一個 Jenkins 項目中,我們需要將幾個私有的 GitHub 存儲庫簽出到項目根目錄下的幾個單獨的目錄中。 請問我們怎么辦?

Jenkin 的多個 SCM 插件很好地為我解決了幾個存儲庫問題。 我剛剛開始了一個項目構建,它在一個公共文件夾下檢查了四個不同的 git 存儲庫。 (我有點不願意使用 Łukasz Rżanek 之前建議的git 超級項目,因為 git 沒有子模塊就足夠復雜了。)

從url中找到repoName,然后checkout到指定目錄。

String url = 'https://github.com/foo/bar.git';
String[] res = url.split('/');
String repoName = res[res.length-1];
if (repoName.endsWith('.git')) repoName=repoName.substring(0, repoName.length()-4);

checkout([
  $class: 'GitSCM', 
  branches: [[name: 'refs/heads/'+env.BRANCH_NAME]],
  doGenerateSubmoduleConfigurations: false,
  extensions: [
    [$class: 'RelativeTargetDirectory', relativeTargetDir: repoName],
    [$class: 'GitLFSPull'],
    [$class: 'CheckoutOption', timeout: 20],
    [$class: 'CloneOption',
        depth: 3,
        noTags: false,
        reference: '/other/optional/local/reference/clone',
        shallow: true,
        timeout: 120],
    [$class: 'SubmoduleOption', depth: 5, disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', shallow: true, trackingSubmodules: true]
  ],
  submoduleCfg: [],
  userRemoteConfigs: [
    [credentialsId: 'foobar',
    url: url]
  ]
])

只需在 git 操作中添加“dir wrapper”:

dir('subDir') {
    checkout scm
}

在新的流水線流程中,下圖可能會有所幫助..

在此處輸入圖片說明

我沒有使用github插件,但從介紹頁面來看,它或多或少有點像gerrit-trigger插件。

您可以安裝 git 插件,它可以幫助您檢查您的項目,如果您想在一個 jenkins 作業中包含多個項目,只需將 Repository 添加到您的作業中。

暫無
暫無

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

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