Fazer checkout de vários repositórios git no mesmo espaço de trabalho Jenkins

127

Usando Jenkins 1.501 e Jenkins Git plugin 1.1.26

Eu tenho 3 diferentes repositórios git, cada um com vários projetos.

Agora, preciso fazer o check-out de todos os projetos dos repositórios 3 git no mesmo espaço de trabalho em um escravo Jenkins. Eu defini cada repositório git em: Gerenciamento de código-fonte: SCMs múltiplos . Mas cada vez que um repo é retirado, o repo anterior (e seus projetos associados) é excluído.

Eu li isso:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

mas isso realmente não ajuda. Tentei especificar a mesma pasta no subdiretório local para repositório (opcional) para todos os repositórios, mas fornece o mesmo resultado.

Se isso for simplesmente impossível usando Jenkins, acho que algumas etapas / scripts de pré-compilação podem ser usadas para mover os projetos para o local certo. Não é uma opção para modificar a configuração de compilação dos projetos.

u123
fonte

Respostas:

69

Não é possível verificar mais de um repo por vez em um único espaço de trabalho com o Jenkins + Git Plugin.

Como solução alternativa, você pode ter vários trabalhos upstream que fazem checkout de um único repositório cada um e depois copiar para o espaço de trabalho final do projeto (problemático em vários níveis) ou pode configurar uma etapa de script de shell que verifica cada repositório necessário para o espaço de trabalho do trabalho no momento da construção.

Anteriormente, o plugin Multiple SCM poderia ajudar com esse problema, mas agora está obsoleto. Na página do plugin Multiple SCM: "Os usuários devem migrar para https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin . O pipeline oferece uma maneira melhor de fazer check-out de vários SCMs e é suportado pelo Jenkins equipe de desenvolvimento principal ".

CIGuy
fonte
Por que a primeira abordagem é problemática? Dividir os trabalhos parece uma boa prática.
CurtainDog
1
Geralmente, é uma boa prática, mas quando você precisa de vários checkouts na mesma localização física, a manutenção se torna uma grande preocupação. Por exemplo, se você quisesse criar uma construção de ramificação, teria que clonar 4 tarefas e, em seguida, alterar individualmente os caminhos de cada uma. É claro que existem plugins para ajudar nisso, mas é mais fácil fazer o checkout para um caminho relativo a partir de um único trabalho. Depois, você pode clonar o quanto quiser sem alterar as configurações.
precisa
1
Você precisa alterá-lo da resposta correta, pois não é mais relevante.
Dvir669
2
Os pipelines exigem que você aprenda uma nova DSL, que é um pouco demais para o trabalho muito simples (confira o código de vários repositórios) que queremos que ele faça. Atenha-se ao plug-in Multiple SCM até que uma GUI decente apareça no DSL do pipeline Jenkins. Posso informar que ele foi muito bem trabalhar com Jenkins 2,17
Burak Arslan
2
Acabei de encontrar os mesmos problemas com vários repositórios. Agora estou usando o plug-in Pipeline, mesmo sendo tão cético quanto o @BurakArslan sobre o novo DSL. Na verdade, não é tão ruim quanto eu pensava e vem com um gerador de trechos razoavelmente decente. Depois de usá-lo por apenas 2 horas, agora eu realmente prefiro essa abordagem, pois eu posso finalmente confirmar que os scripts de construção do pipeline sejam agregados ao restante do código.
Ben
81

Com o plugin Multiple SCMs:

  • crie uma entrada de repositório diferente para cada repositório que você precisa fazer checkout (projeto principal ou projeto de dependência.

  • para cada projeto, no menu "avançado" (o segundo menu "avançado", existem dois botões denominados "avançado" para cada repositório), localize o campo de texto "Local subdiretório para repo (opcional)". Você pode especificar lá o subdiretório no diretório "espaço de trabalho" para o qual deseja copiar o projeto. Você pode mapear o sistema de arquivos do meu computador de desenvolvimento.

O "segundo menu avançado" não existe mais; em vez disso, o que precisa ser feito é usar o botão "Adicionar" (na seção "Comportamentos adicionais") e escolher "Fazer check-out para um subdiretório"

  • se você estiver usando ant, como agora o arquivo build.xml com os destinos de construção não no diretório raiz da área de trabalho, mas em um subdiretório, será necessário refletir isso na configuração "Invocar Ant". Para fazer isso, em "Invocar ant", pressione "Avançado" e preencha o texto de entrada "Build file", incluindo o nome do subdiretório em que o build.xml está localizado.

Espero que ajude.

GaRRaPeTa
fonte
3
Isso deve estar desatualizado. No momento da redação, o snippet GIT do plug-in Multiple SCMs não contém o subcaminho opcional.
precisa
12
Em cada repositório, há uma lista suspensa chamada "Adicionar". Nele, você pode encontrar a opção "Finalizar compra em um subdiretório", que executa o mesmo.
Gary Ye
1
Segui o seu guia com o plug-in SCM múltiplo e o git, mas tenho outro problema engraçado. Parece não querer fazer o checkout adequado do mesmo ramo (desenvolvimento) para diferentes repositórios. Ele tenta fazer check-out de uma confirmação por hash (que é válida apenas no primeiro repositório). Alguma idéia de como resolver isso?
Lefteris
O maior problema com o plug-in SCM múltiplo é o seguinte: "No momento, os gatilhos do tipo pós-confirmação não funcionam (pelo menos para a subversão); portanto, é necessário configurar a pesquisa do tipo 'cron'".
grayaii
1
Os pipelines exigem que você aprenda uma nova DSL, que é um pouco demais para o trabalho muito simples (confira o código de vários repositórios) que queremos que ele faça. Atenha-se ao plug-in Multiple SCM até que uma GUI decente apareça no DSL do pipeline Jenkins. Posso informar que ele foi muito bem trabalhar com Jenkins 2,17
Burak Arslan
41

Como o plug - in SCMs múltiplo está obsoleto.

Com o Jenkins Pipeline, é possível fazer check-out de vários repositórios git e depois de construí-lo usando gradle

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

Você pode considerar o uso de submódulos git em vez de um pipeline personalizado como este.

Palhaço
fonte
Obrigado!!! O dirbloco é fundamental, eu não conseguia entender por que estava vendo o repo clonado mais recente no espaço de trabalho do meu trabalho.
bonh
como a noção de "mudanças" é considerada em vários SCMs? É apenas a soma das alterações vistas de todos os repositórios que compõem os trabalhos? Seria bom especificá-los de cada um, se possível, 23 changes from repo XXX, 3 changes from repo YYYou algo mais compacto nesse sentido.
jxramos
20

Usei o Multiple SCMs Plugin em conjunto com o Git Plugin com sucesso com Jenkins.

Frederik Deweerdt
fonte
3
obrigado, ótimo, eu sou capaz de colocar 2 caminhos de bitbucket na seção do repositório e agora como posso dizer ao ramo 1 do checkout "desenvolver" do repo 1 e ao ramo "correções" do checkout do repo 2? Eu vejo os ramos para construir parte no Jenkins, como posso configurar o nome do repositório e Refsec no especificador de ramo (em branco para 'any') para que cada um possa verificar o ramo correspondente que eu quero? ou estou fazendo isso errado e devo clicar no booleano que diz "Multiple SCMs"?
Pelos
@pelos Você conseguiu encontrar a solução?
precisa
no momento não usamos o arquivo yml e fizemos os dois fluxos de trabalho diferentes com as tarefas regulares
24/06/19
5

Dependendo dos relacionamentos dos repositórios, outra abordagem é adicionar o outro repositório (repositórios) como sub - módulos git a um dos repositórios. Um submódulo git cria uma referência para os outros repositórios. Esses repositórios de sub-módulo não são clonados, a menos que você especifique o --recursivesinalizador ao clonar o "superprojeto" (termo oficial).

Aqui está o comando para adicionar um submódulo ao projeto atual:

git submodule add <repository URI path to clone>

Estamos usando o Jenkins v1.645 e o git SCM fará um clone recursivo imediato para superprojetos. Voila, você obtém os arquivos de superprojeto e todos os arquivos de repo dependentes (submódulo) em seus próprios diretórios respectivos no mesmo espaço de trabalho da tarefa Jenkins.

Não atestando que esta é a abordagem correta , é uma abordagem.

mikehwang
fonte
5

Jenkins: SCM múltiplo - descontinuado. Plug-in GIT - não funciona para vários repositórios.

Script / pipeline como código - é o caminho a percorrer.

AKS
fonte
2

Eu também tive esse problema. Eu o resolvi usando o Trigger / call builds em outros projetos. Para cada repositório, chamo o projeto downstream usando parâmetros.

Projeto principal:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

Então, para cada repositório, chamo um projeto downstream como este:

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

Projeto downstream: Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 
Torbjörn Gard
fonte
1

Check-out mais de um repo em um momento em um único espaço de trabalho é possível com Jenkins + Git Plugin (talvez apenas em versões mais recentes?).

Na seção "Gerenciamento do código-fonte", não selecione "Git", mas "Vários SCMs" e adicione vários repositórios git.

Certifique-se de que em todos, exceto um, você adicione como "Comportamento adicional" a ação "Fazer check-out em um subdiretório" e especifique um subdiretório individual.

JRA_TLL
fonte
Acredito que desta maneira você está usando o plug-in Multiple SCM (obsoleto) em vez do plug-in Git de baunilha.
Robert
0

Estamos usando o git-repo para gerenciar nossos múltiplos repositórios GIT. Há também um plug-in Jenkins Repo que permite fazer check-out de todo ou parte dos repositórios gerenciados pelo git-repo no mesmo espaço de trabalho de trabalho do Jenkins.

vladisld
fonte
Como exatamente você resolve o problema nesta pergunta? Eu tenho instalado o plugin que você mencionou, e ler sobre repo eo plugin, mas eu não posso ver como configurar Jenkins para clonar dois repos para executar em um projeto ...
GreenAsJade
Para usar o Repo, é necessário criar o repositório especial que conterá apenas os arquivos de manifesto. Neste arquivo, você especifica todas as informações sobre outros repositórios. O formato exato dos arquivos de manifesto é descrito no arquivo docs / manifest-format.txt do projeto git-repo ( gerrit.googlesource.com/git-repo/+/master/docs/… ). Ao configurar a parte do trabalho do Jenkins Repo - você especifica o local do repositório 'manifest' e, opcionalmente, o nome dos arquivos 'manifest' (você pode ter vários). Todos os repositórios especificados no manifesto serão clonados.
precisa