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?

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


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


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 .


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


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

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.


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']]])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.