В Jenkins, как оформить проект в определенный каталог (используя GIT)

Извините за стиль "svn" - мы находимся в процессе миграции с SVN на GIT (включая нашу среду CI Jenkins).

Что нам нужно, так это иметь возможность заставить Дженкинса извлекать (или лучше сказать клонировать?) проект GIT (репозиторий?) в определенный каталог. Мы попробовали немного магии refspecs, но это было не слишком очевидно, чтобы понять и успешно использовать.

Кроме того, если в одном и том же проекте Jenkins нам нужно проверить несколько частных репозиториев GitHub в несколько отдельных каталогов в корне проекта, как мы можем это сделать?

У нас установлен плагин GitHub. Надеюсь, мы правильно сформулировали суть.


person viebel    schedule 19.03.2012    source источник


Ответы (9)


Стандартный плагин git для Jenkins отлично справляется со своей задачей.

После добавления нового репозитория git (конфигурация проекта > Управление исходным кодом > установите флажок GIT) в проект перейдите к нижней части настроек плагина, чуть выше области Обозреватель репозитория. . Должна быть кнопка Дополнительно. После нажатия на нее должна появиться новая форма со значением, описанным как Локальный подкаталог для репозитория (необязательно). Установка этого параметра на folder заставит плагин извлекать репозиторий в папку относительно вашей рабочей области. Таким образом, вы можете иметь столько репозиториев в своем проекте, сколько вам нужно, все в разных местах.

В качестве альтернативы, если проект, который вы используете, позволяет это, вы можете использовать подмодули GIT, которые аналогичны внешним путям в SVN. В GIT Book есть раздел по этой теме. Если это не противоречит какой-либо политике, подмодули довольно просты в использовании, предоставляя вам мощный способ управления местоположениями, версиями/тегами/ветками, которые будут импортированы, И они будут доступны в вашем локальном репозитории, а также улучшат переносимость.

Очевидно, что плагин GIT поддерживает проверку подмодулей, поэтому Jenkins может работать с ними достаточно эффективно.

person Łukasz Rżanek    schedule 20.03.2012
comment
Существует только один параметр Local subdirectory for repo для всех репозиториев, поэтому он не совсем подходит для управления несколькими репозиториями. См. issues.jenkins-ci.org/browse/JENKINS-13086. - person ubuntudroid; 04.06.2013
comment
Я даже не вижу эту опцию, используя плагин Git 2.4.2. Этому ответу 4 года, так что, может быть, этот вариант был удален? (Однако я вижу Checkout в подкаталог, как указано в другом ответе @biolinh, но это для всех репозиториев. - person Zitrax; 09.03.2016
comment
Оформить заказ в подкаталог можно в разделе «Дополнительные действия» плагина git. Однако это по-прежнему ограничивает вас только одним репозиторием git для каждого задания. Если вам нужно более одного репозитория git для каждого задания, используйте конвейер Jenkins. - person Mark Waite; 23.03.2017

В новом конвейере Jenkins 2.0 (ранее называвшемся плагином рабочего процесса) это делается по-другому для:

  • Основной репозиторий
  • Другие дополнительные репозитории

Здесь я конкретно имею в виду Multibranch Pipeline версии 2.9.

Основной репозиторий

Это репозиторий, содержащий ваш файл Jenkinsfile.

На экране Настроить для проекта пайплайна введите имя репозитория и т. д.

Не используйте Дополнительные действия > Извлечь в подкаталог. Это поместит ваш Jenkinsfile в подкаталог где Jenkins не сможет его найти.

В Jenkinsfile проверьте основной репозиторий в подкаталоге, используя dir():

dir('subDir') {
    checkout scm
}

Дополнительные репозитории

Если вы хотите проверить больше репозиториев, используйте генератор синтаксиса конвейера для автоматического создания фрагмента кода Groovy.

На экране Настроить для вашего проекта конвейера:

  1. Выберите Синтаксис конвейера. В раскрывающемся меню Пример шага выберите checkout: General SCM.
  2. Выберите свою систему SCM, например Git. Заполните обычную информацию о вашем репозитории или депо.
  3. Обратите внимание, что в Multibranch Pipeline переменная среды env.BRANCH_NAME содержит имя ветки основного репозитория.
  4. В раскрывающемся меню Дополнительные действия выберите Извлечь в подкаталог.
  5. Нажмите Создать Groovy. Jenkins отобразит фрагмент кода Groovy, соответствующий указанной вами проверке SCM.
  6. Скопируйте этот код в свой конвейерный скрипт или Jenkinsfile.
person John McGehee    schedule 03.11.2016
comment
Фрагмент кода здесь: checkout([$class: 'GitSCM', branches: [[name: '*/branchname']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'RelativeTargetDirectory', relativeTargetDir: 'MyDirectory']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'myId', url: 'https://github.com/jenkinsci/jenkins.git']]]) - person davegallant; 18.11.2016
comment
На самом деле я думаю, что ответ @davey_dev правильный. Если вы сначала войдете в подкаталог с шагом dir('subDir'), то репо будет клонировано в другой подкаталог подкаталога, и вы получите subDir/[repo name]/[contents]. Я искал способ получить dubDir\[contents], поэтому использование relativeTargetDir было правильным способом сделать это. - person Mig82; 02.06.2017
comment
В дополнение к этому, если вы делаете это с основным репозиторием, вы можете также использовать параметр skipDefaultCheckout, как показано в этом сообщении, чтобы избежать повторной проверки devops.stackexchange.com/a/1074 - person tvt173; 21.05.2018

Я согласен с @Łukasz Rżanek, что мы можем использовать плагин git

Но я использую опцию: оформить заказ в поднаправлении, которое включено следующим образом:
В разделе Управление исходным кодом отметьте Git
нажмите кнопку добавления, выберите оформить заказ в подкаталог

введите здесь описание изображения

person biolinh    schedule 03.03.2015
comment
Но вы не можете установить разные папки для разных репозиториев. - person Pavel Leonov; 09.06.2016
comment
В моем случае моя работа Jenkins только клонирует код из одного репозитория. Я не пытался заниматься этим делом, как вы сказали. - person biolinh; 10.06.2016
comment
Что, если мы не хотим, чтобы это был подкаталог? можете ли вы использовать ../other_dir - отвечая на мой собственный вопрос, вы можете использовать относительную проверку и в оболочке сборки перейти в этот каталог, используя cd ../other_dir - person amleszk; 07.02.2020

Стоит изучить плагин 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>'
        ......
    }
}
person Jeremy Whiting    schedule 07.10.2016
comment
Это дает ошибку Scripts not permitted to use new java.io.File java.lang.String, что верно. См. мой ответ, чтобы узнать, как использовать генератор фрагментов кода конвейера для создания кода, необходимого для сценария конвейера или Jenkinsfile. - person John McGehee; 03.11.2016
comment
Вы можете использовать sh "mkdir -p directory как обходной путь для Scripts not permitted... - person Andrey Rodionov; 29.12.2017
comment
dir ('foo') {} создаст папку, если она не существует - person Sighil; 08.02.2021

Кроме того, если в одном и том же проекте Jenkins нам нужно проверить несколько частных репозиториев GitHub в несколько отдельных каталогов в корне проекта. Как мы можем это сделать, пожалуйста?

Подключаемый модуль Jenkin Multiple SCM очень хорошо решил проблему с несколькими репозиториями. Я только что начал работать над сборкой проекта, который проверяет четыре разных репозитория git в общей папке. (Я немного не хочу использовать суперпроекты git, как предложено ранее Лукашем Ржанеком, поскольку git достаточно сложен без подмодулей.)

person Alberto    schedule 21.02.2013
comment
Множественный SCM не показывает изменения для каждой сборки, есть ошибка, которую уже 1,5 года не исправляют :( - person Pavel Leonov; 09.06.2016

Найдите repoName по URL-адресу, а затем оформите заказ в указанный каталог.

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]
  ]
])
person silencej    schedule 24.02.2021

просто добавьте оболочку dir в операцию git:

dir('subDir') {
    checkout scm
}
person Illia Sydorenko    schedule 12.07.2021

В новом потоке конвейера может помочь следующее изображение.

введите здесь описание изображения

person Sunny Tambi    schedule 16.04.2018
comment
Это вызовет ошибку при попытке использовать исполняемый файл git, говорящий, что нет файла .git. - person Jeremy; 07.12.2018

Я не использую плагин github, но со страницы введения он более или менее похож на плагин gerrit-trigger.

Вы можете установить плагин git, который поможет вам проверять ваши проекты. Если вы хотите включить несколько проектов в одно задание jenkins, просто добавьте репозиторий в свое задание.

person Tim    schedule 19.03.2012