Jenkins Git Plugin: Como criar tags específicas?

120

Estou tendo problemas para que Jenkins construa uma tag especificada. A tag faz parte de uma compilação parametrizada, mas não sei como passar isso para o plug-in git para criar apenas essa tag. Isso levou três horas do meu dia e eu concedi derrota aos mestres no estouro de pilha.

sksamuel
fonte
Você quer dizer que isso é diferente de stackoverflow.com/questions/7157170/… ? (terceiro resultado de google.com/… )
VonC 17/04/2012
1
"Este tem vindo a tomar 3 horas do meu dia" - Eu não sou tão preguiçoso que 3 horas de meu dia não incluem todos os links que eu poderia encontrar no google :)
sksamuel
1
Tem certeza de que deseja fazê-lo desta maneira? Você percebe que a marcação no git não é escalável ? Talvez você possa simplesmente usar uma tarefa "executar shell" para escrever um script para verificar a tag / revisão que você realmente deseja?
mpontillo

Respostas:

222

Consegui fazer isso usando o parâmetro "branches to build":

Branch Specifier (blank for default): tags/[tag-name]

Substitua [tag-name] pelo nome da sua tag.

Emmanuel Keller
fonte
5
Não sei por que isso não tem mais +1. Essa entrada no blog de notas do erics é confusa como o inferno. Isso é simples e funciona muito bem. Obrigado!
Cody S
3
Funcionou muito bem para mim. Obrigado. Meu parâmetro foi nomeado RELEASE_TAG, então usei tags / $ {RELEASE_TAG} como o valor para o especificador de filial.
Wesley Womack
3
Não foi possível fazer isso funcionar. Por algum motivo, não é possível efetuar o checkout da tag. Eu recebo: 'ERRO: Não foi possível encontrar nenhuma revisão para compilar. Verifique a configuração do repositório e da ramificação para este trabalho. ' Eu especifico tags / 3.0.1, também tentei * / tags / 3.0.1 Verifiquei se a tag existe.
lostintranslation
1
Quando tento fazer o que é sugerido nesta resposta, todas as pesquisas do repositório acionam uma compilação. O log de pesquisa do git mostrará continuamente que a "Última revisão integrada" é a revisão da tag, mas a "Última revisão remota do cabeçote remoto" é a revisão da mais recente HEAD. A lógica do plugin git parece comparar essas duas revisões, que no meu repositório são sempre desiguais e, portanto, uma nova compilação é sempre acionada.
Louis
Esta deve ser a resposta certa, com certeza, funcionou para mim e é muito simples. Eu não sondando o repositório, no entanto, acho que ainda existe esse problema.
Jeremy
76

Nenhuma dessas respostas foi suficiente para mim, usando o Jenkins CI v.1.555, o plug-in Git Client v.1.6.4 e o plug-in Git 2.0.4.

Eu queria criar um trabalho para um repositório Git para uma tag específica fixa (ou seja, não parametrizada). Eu tive que montar uma solução a partir das várias respostas, além da postagem no blog "build a Git tag" citada por Thilo .

  1. Envie sua tag para o repositório remoto com git push --tags
  2. Na seção "Git Repository" do seu trabalho, sob o título "Source Code Management", clique em "Advanced".
  3. No campo Refspec, adicione o seguinte texto: +refs/tags/*:refs/remotes/origin/tags/*
  4. Em "Ramificações a serem construídas", "Especificador de ramificação", coloque */tags/<TAG_TO_BUILD>(substituindo <TAG_TO_BUILD>pelo nome real da tag).

Adicionar o Refspec para mim acabou sendo crítico. Embora parecesse que os repositórios git estavam buscando todas as informações remotas por padrão quando deixei em branco, o plug-in Git falhou completamente ao encontrar minha tag. Somente quando especifiquei explicitamente "obter as tags remotas" no campo Refspec o plug-in Git foi capaz de identificar e criar a partir da minha tag.

Atualização 2014-5-7 : Infelizmente, esta solução possui um efeito colateral indesejável para o Jenkins CI (v.1.555) e o mecanismo de notificação por push do repositório Git no Stash Webhook para Jenkins : sempre que uma ramificação do repositório é atualizada de uma só vez, os trabalhos de criação de tags também serão acionados novamente. Isso leva a muitas recriações desnecessárias dos mesmos trabalhos de tag repetidamente. Tentei configurar os trabalhos com e sem a opção "Forçar sondagem usando espaço de trabalho" e parecia não ter efeito. A única maneira de impedir que Jenkins faça compilações desnecessárias para os trabalhos de tag é limpar o campo Refspec (por exemplo, excluir o +refs/tags/*:refs/remotes/origin/tags/*).

Se alguém encontrar uma solução mais elegante, edite esta resposta com uma atualização. Eu suspeito, por exemplo, que talvez isso não aconteça se o refspec for especificamente, +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>e não o asterisco. Por enquanto, no entanto, esta solução está funcionando para nós, apenas removemos o Refspec extra após o trabalho ser bem-sucedido.

gotgenes
fonte
4
Para "adicionar o texto a seguir" ao refspec ... se o seu refspec foi anteriormente +refs/heads/*:refs/remotes/origin/*, será agora +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (Eu não tenho trabalhado com refspecs muito, assim que tomou alguma experimentação para aprender que este campo é delimitado por espaço.)
driftcatcher
1
Um +1 extra para esta solução. As soluções anteriores também não funcionaram para mim.
Whitespy9 31/05
16

Você não pode dizer ao Jenkins para construir a partir de um nome de referência? Se sim, então é

refs/tags/tag-name

De todas as perguntas que vejo sobre Jenkins e Hudson, sugiro mudar para o TeamCity. Não tive que editar nenhum arquivo de configuração para que o TeamCity funcionasse.

Andrew T Finnell
fonte
Você não é a primeira pessoa a sugerir a cidade da equipe, na verdade. É realmente muito melhor assim? Eu posso dar uma olhada.
Sksamuel
1
@monkjack Tentei a mesma sintaxe em um dos meus repositórios e funcionou. Você pode listar suas tags atuais? Tem certeza de que você empurrou especificamente que marca para o repo remoto comgit push --tags
Andrew T Finnell
4
Chegando perto. Eu não estava colocando as tags no controle remoto, mas agora estou. Eu posso conseguir que o jenkins construa agora usando refs / tags / harpercollins-1.0.16, no entanto, ele sempre insiste em construir a cabeça, independentemente do que eu coloquei lá. Confirmei que o controle remoto possui a tag (pode ser vista no gitweb) e fazer um instantâneo dessa tag confirma que tudo está lá corretamente.
Sksamuel
6
O TeamCity é proprietário, tornando-o praticamente inútil.
gíria
2
Ah, sim, mudar de ferramenta gratuita para comercial é a escolha certa! Quando jetbrains reinventar a roda e criar um novo rastreador de bugs, você proporá a outras pessoas que mudam do bugzilla para isso?
M1ld
11

Se você estiver usando os pipelines Jenkins e quiser fazer check-out de uma tag específica (por exemplo: um TAGparâmetro de sua compilação), eis o que você pode fazer:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}
Vincent de Lagabbe
fonte
9

Em uma Jenkins mais recente (1.639 e superior), você pode:

  1. basta especificar o nome da tag no campo 'Ramificações a serem construídas'.
  2. em uma construção parametrizada, você pode usar o parâmetro como variável em um mesmo campo 'Ramos para construção', ou seja, $ {Branch_to_build}.
  3. Você pode instalar o Git Parameter Plugin, que fornecerá funcionalidade listando todos os ramos e tags disponíveis.
m1ld
fonte
1
De fato, apenas inserir um nome de marca também funcionou para mim. Embora a documentação para isso no plug-in git ainda diga especificamente que fazer isso não deve funcionar: "<tagName>: Isso não funciona, pois a tag não será reconhecida como tag. Use refs / tags / <tagName>."
Zitrax 21/04
Isso funcionou para mim no Jenkins 1.532.3, eu apenas especifiquei a versão da tag (por exemplo 1.0.1) nos ramos para construir o campo.
andre
9

Eu fiz algo assim e funcionou:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

insira a descrição da imagem aqui

O log de Jenkins confirmou que estava obtendo a fonte da tag

Verificando a revisão 0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)

Hasan Shaik
fonte
Isso é ótimo para criar todas as tags, obrigado! Adicionar o refspectruque foi clicar no botão Avançado.
styfle
9

Defino o campo Avançado-> Refspec como refs/tags/[your tag name]. Isso parece mais simples do que as várias outras sugestões para o Refspec, mas funcionou muito bem para mim.

ATUALIZAÇÃO 23/7/2014 - Na verdade, após mais testes, verifica-se que isso não funcionou como esperado. Parece que a versão HEAD ainda estava sendo retirada. Desfaça isso como a resposta aceita. Acabei obtendo uma solução de trabalho seguindo o post de gotgenes neste tópico (30 de março). O problema mencionado nesse post de acionamento desnecessário de compilações não foi um problema para mim, pois meu trabalho é acionado a partir de um trabalho upstream, não da pesquisa do SCM.

ATUALIZAÇÃO ABRIL DE 2018 - Observe nos comentários que isso funciona para uma pessoa e concorda com a documentação de Jenkins.

Nebu
fonte
Só queria observar que - quatro anos depois que essa resposta foi publicada - refs/tags/<tagname>é o que a documentação do Jenkins diz que deve ser usado e está funcionando bem para mim. Talvez o plug-in estivesse com defeito no momento da postagem original, mas ... a partir de abril de 2018, esta é a resposta correta.
Evadeflow
Atualizando meu comentário anterior: Na verdade, descobri que posso omitir o refs/tagsprefixo e apenas usá-lo <tagname>. YMMV, mas ... está funcionando bem para os meus propósitos.
Evadeflow
3

Consegui convencer Jenkins a criar uma tag, definindo o Refspec e o Especificador de filial, conforme detalhado nesta postagem do blog .

Eu também tive que definir o Nome do Repositório (como "origem" no meu caso) para poder referenciá-lo no Refspec (caso contrário, ele aparentemente usaria um nome gerado aleatoriamente).

Thilo
fonte
2

O que eu fiz no final foi:

  • criou uma nova filial jenkins-targete conseguiu que Jenkins acompanhasse
  • mesclar a partir de qualquer ramo ou tag que eu quero construir no jenkins-target
  • uma vez que a compilação estava funcionando, testes passando etc, simplesmente crie uma tag a partir da jenkins-targetramificação

Não tenho certeza se isso funcionará para todos, meu projeto era bem pequeno, não havia muitas tags e outras coisas, mas é fácil de fazer, não é necessário mexer com refspecs, parâmetros e outras coisas :-)

Hugh Perkins
fonte
Eu gosto dessa abordagem muito simples.
Zochhuana
2

Você pode criar até mesmo um tipo de tag, por exemplo 1.2.3-alpha43, usando curingas:

Refspec: +refs/tags/*:refs/remotes/origin/tags/*

Especificador de filial: origin/tags/1.2.3-alpha*

Você também pode marcar " Criar quando uma alteração é enviada ao GitHub " para acionar o envio, mas é necessário adicionar a ação "criar" ao webhook

riverfall
fonte
1

Adicionando meus dois centavos aqui, pois não vi uma resposta que use a opção "Construir com parâmetros" no Jenkins.

Aqui estou usando o console do navegador Jenkins CI para o projeto starwars_api e consegui construir diretamente com "Construir com parâmetros" com o valor refs / tags / tag-name

  1. escolha a opção "construir com parâmetros".
  2. adicione valor na caixa como "refs / tags / tag_142" (tag_name = tag_142 no meu exemplo)

construir com o nome da tag ref

anayagam
fonte