[英]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 代碼片段。
在管道項目的配置屏幕中:
env.BRANCH_NAME
包含主存儲庫的分支名稱。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.