Os submódulos Git não estão sendo atualizados no build do Jenkins

86

Eu tenho um submódulo em um projeto em Jenkins. Eu habilitei a configuração avançada para atualizar submódulos recursivamente.

Quando executo o build, vejo que o espaço de trabalho contém os arquivos do submódulo. O problema é que parece ser a primeira revisão do submódulo. Quando eu envio as alterações (repositório hospedado no GitHub), o Jenkins não parece atualizar o submódulo para obter as alterações corretas. Alguém já viu isso?

Ben
fonte

Respostas:

98

Observe que o plugin Jenkins Git 2.0 terá "comportamento avançado de submódulo", o que deve garantir atualizações adequadas dos submódulos:

git 2.0

Conforme comentado por vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" neste campo, adicione o submódulo git url.

Caminho


Owen B menciona nos comentários :

Para o problema de autenticação, há agora uma opção "Usar credenciais do remoto padrão do repositório pai"

Visto aqui em JENKINS-20941 :

https://issues.jenkins-ci.org/secure/attachment/33245/Screen%20Shot%202016-07-08%20at%2010.09.17.png

VonC
fonte
6
Mas como? Você também pode fornecer etapas detalhadas e quais opções escolher? Obrigado.
zavié de
8
@ zavié Acho que você deve escolher "Comportamento avançado dos submódulos" e depois marcar a caixa de seleção "Atualizar submódulos recursivamente" que aparecerá e clicar em Salvar.
KajMagnus
9
Isso não funciona muito bem se você estiver usando um repositório privado.
Erik
1
Funcionou perfeitamente para mim com um
repositório
3
Isso só funciona se seu repo não exigir autenticação para ler seu submódulo git. Bug do Jenkins.
Ernst Kuschke
33

Isso é abordado na documentação do plug-in Git no site Jenkins na seção: Submódulos recursivos .

excerto

O plugin GIT suporta repositórios com submódulos que, por sua vez, possuem submódulos. No entanto, isso deve ser ativado: em Configuração do Trabalho -> Gerenciamento do Código Fonte da Seção , Git -> Botão Avançado (em Ramificações para construir) -> Atualizar submódulos recursivamente .

Exemplo

Na tela de configuração do seu trabalho, na seção Gerenciamento do código-fonte, puxe o botão Adicionar para baixo e selecione "Comportamento de submódulos avançado".

   s1

                                 s2

Em seguida, selecione "Atualizar submódulos recursivamente":

   s3

slm
fonte
1
obrigado, mas isso não funcionou no momento em que tentei isso (quase 2 anos atrás)
Ben
@Ben - OK, acabei de experimentar e funcionou para mim. Pode estar relacionado às suas versões.
Slm
1
Isso só funciona se seu repo não exigir autenticação para ler seu submódulo git.
Ernst Kuschke
@ErnstKuschke - Eu acredito que Jenkins pode receber uma chave SSH para que ele também possa interagir com repos que requerem autenticação.
slm
30

Você está ciente de que seu repositório Git sempre se refere a uma revisão particular de um submódulo? Jenkins não vai mudar automaticamente a revisão.

Se você quiser fazer uma revisão mais recente do submódulo em uso, deve fazer isso em seu repositório Git local:

cd submoduledir
git pull
cd ..
git add submoduledir
git commit -m 'Updated to latest revision of submoduledir'
git push # Go and watch Jenkins build with the new revision of the submodule

Quando você faz assim, o Jenkins verifica exatamente a mesma revisão do submódulo durante a construção. O Jenkins não decide por si mesmo qual revisão do submódulo usar. Esta é a diferença fundamental entre submódulos Git e externos SVN.

Você pode querer ler uma boa referência sobre submódulos, por exemplo, http://progit.org/book/ch6-6.html .

sti
fonte
1
O link ProGit fornecido por @sti está desatualizado. Acho que este é o equivalente atual https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel
O link está quebrado (HTTPS relacionado?) - "502 Bad Gateway" .
Peter Mortensen
17

Finalmente descobri uma maneira de fazer isso e é simples.

O problema:

O clone inicial com credenciais funciona bem, mas a submoduleclonagem subsequente falha com credenciais incorretas.

  1. Clonagem automática de submódulo avançado Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours:: resulta em erro de credencial.
  2. git submodule update --initna Execute Shellseção também falha com erro de credenciais.

A solução:

Estou usando jenkins-1.574.

  1. Marque a Build Environment >> SSH Agentcaixa.
  2. Selecione as credenciais corretas (provavelmente as mesmas selecionadas na Source Code Managementseção
  3. Atualize os submódulos na Execute Shellseção

    git submodule sync
    git submodule update --init --recursive
    

Aqui está uma captura de telainsira a descrição da imagem aqui

potench
fonte
3
Essa caixa de seleção não existe mais.
adi518
11

Parece que encontrei uma solução:

Eu adicionei uma etapa de compilação para executar os seguintes comandos de shell:

git submodule foreach git checkout master
git submodule foreach git pull
Ben
fonte
Depois de fazer esses comandos, você pode precisar fazer um commit no superprojeto, pois o HEAD em seus submódulos terá sido atualizado.
slacy
Olá Ben, você poderia compartilhar sua solução com mais detalhes? Eu quero fazer a mesma coisa. Além disso, só para confirmar, sua solução git submodule atualizará os submódulos de um projeto na WORKSPACE, certo?
Kim Stacks de
não há muito mais detalhes do que isso. Acabei de adicionar essas 2 linhas ao meu processo de construção e sempre puxa a versão mais recente do submódulo.
Ben
10
Como @sti disse em outra resposta aqui, parece que você está tentando usar submódulos Git como externos SVN. Em vez de adicionar esses comandos ao Jenkins, seria melhor comprometer as versões de submódulo adequadas ao seu repositório Git principal. Jenkins sempre verificará a mesma versão dos submódulos ao construir uma versão específica de seu projeto. Compilações reproduzíveis são boas.
Cody Casterline
4
@ben Eu encontrei este comando que você pode achar mais útil, especialmente se você não estiver usando o branch master no submódulo git submodule update --init --recursive
Corey Scott
7

Se você estiver usando o módulo Jenkins Git, você pode configurá-lo para "Limpar o espaço de trabalho antes de construir", desta forma ele sempre obterá o submódulo correto.

Amin Y
fonte
2

Estou usando pipelining com script com o plug-in de checkout. Se você deseja que os submódulos sejam iguais aos do seu repositório, basta desligar a opção trackingSubmodules desta forma:

checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '[myCredentials]', url: 'https://git.myRepo.git']]])
Jochen Gunzelmann
fonte