Como configurar o gancho de confirmação de postagem do Git

126

Como acionar uma compilação remotamente do Jenkins?
Como configurar o Git post commit hook?

Meu requisito é que, sempre que forem feitas alterações no repositório Git para um projeto específico, ele iniciará automaticamente a construção do Jenkins para esse projeto.

Na seção Jenkins gatilho, selecionei gatilho remotamente.
No .gitdiretório, o diretório hooks existe, pois precisamos configurar o arquivo post commit.
Estou confuso como acionar uma compilação a partir daí (sei que alguma parte devemos usar o comando curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

Eu coloquei esse comando no diretório de ganchos do servidor git (gancho de confirmação de postagem).
Sempre que as alterações ocorrem no repositório, ele está executando a compilação automatizada.

Quero verificar no changeset se em pelo menos um arquivo java existe a compilação deve começar.
Suponha que os desenvolvedores tenham alterado apenas arquivos xml ou arquivos de propriedades que a construção não deve iniciar.
Junto com xml, suponha que os .javaarquivos estejam lá, a construção deve começar.

phanikumar Raja
fonte
Editei minha resposta para abordar a segunda parte da sua pergunta.
VonC 10/10/12

Respostas:

164

Como mencionado em "A pesquisa deve morrer: acionando o Jenkins constrói a partir de um gancho git ", você pode notificar Jenkins sobre um novo commit:

Com o mais recente plugin Git 1.1.14 (que acabei de lançar agora), agora você pode fazer isso com mais facilidade> simplesmente executando o seguinte comando:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Isso varrerá todos os trabalhos configurados para verificar o URL especificado e, se eles também estiverem configurados com pesquisa, acionará imediatamente a pesquisa (e, se encontrar uma alteração que vale a pena construir, uma construção será acionada por sua vez. )

Isso permite que um script permaneça o mesmo quando os trabalhos entram e saem no Jenkins.
Ou, se você tiver vários repositórios em um único aplicativo host de repositório (como Gitosis), poderá compartilhar um único script de gancho pós-recebimento com todos os repositórios. Por fim, esse URL não requer autenticação, mesmo para o Jenkins protegido, porque o servidor não usa diretamente nada que o cliente esteja enviando. Ele executa a pesquisa para verificar se há uma alteração antes de realmente iniciar uma compilação.

Conforme mencionado aqui , certifique-se de usar o endereço correto para o servidor Jenkins:

como estamos executando o Jenkins como servidor da Web autônomo na porta 8080, o URL deveria estar sem o /jenkinsseguinte:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Para reforçar esse último ponto, o ptha acrescenta nos comentários :

Pode ser óbvio, mas tive problemas com:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

O parâmetro url deve corresponder exatamente ao que você tem no URL do repositório do seu trabalho Jenkins.
Ao copiar exemplos, deixei de fora o protocolo, no nosso caso ssh://, e não funcionou.


Você também pode usar um gancho simples de pós-recebimento, como em " Builds baseadas em push usando Jenkins e GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Configure o seu trabalho Jenkins para poder "Trigger build remotamente" e usar um token de autenticação ( 1qaz2wsxneste exemplo).

No entanto, este é um script específico do projeto, e o autor menciona uma maneira de generalizá-lo.
A primeira solução é mais fácil, pois não depende de autenticação ou de um projeto específico.


Quero verificar no conjunto de alterações se pelo menos um arquivo java está lá, a compilação deve iniciar.
Suponha que os desenvolvedores tenham alterado apenas arquivos XML ou arquivos de propriedades; a construção não deve ser iniciada.

Basicamente, seu script de construção pode:

  • coloque notas de 'build' (veja git notes) na primeira chamada
  • nas chamadas subsequentes, pegue a lista de commits entre HEADde seu candidato ramo de construção e o commit referenciado pelo git notes'construir' ( git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • seu script pode analisar essa lista e decidir se precisa continuar com a compilação.
  • em qualquer caso, crie / mova seu git notes' build' para HEAD.

Maio de 2016: cwhsu aponta nos comentários o seguinte URL possível:

você pode usar apenas curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENse definir a configuração do gatilho no seu item

http://i.imgur.com/IolrOOj.png


Em junho de 2016, polaretto aponta nos comentários :

Eu queria acrescentar que, com apenas um pouco de script de shell, você pode evitar a configuração manual de URL, especialmente se você tiver muitos repositórios em um diretório comum.
Por exemplo, usei essas expansões de parâmetro para obter o nome do repositório

repository=${PWD%/hooks}; 
repository=${repository##*/} 

e depois use-o como:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VonC
fonte
oi von como você disse na primeira chamada, eu tenho que colocar um build notes.my a primeira chamada é ler o arquivo .java sempre que o desenvolvedor enviar as alterações para o git repo. Eu sou novo em todas essas coisas, por isso estou perguntando a cada passo. por favor, não se importe e eu tenho que concluir esta tarefa.
Phanikumar Raja
Isso é muito útil para mim. Eu escrevi Git hook com a ajuda deste tópico. Tnx galera!
22412 Kirill Bazarov
Eu tive que adicionar a chamada de curl ao arquivo pós-recebimento, o que não está totalmente claro nesta resposta. Muito útil de qualquer maneira!
precisa saber é o seguinte
1
@IgorGanapolsky na pasta hooks do seu repo bare que está recebendo commits e que deve chamar jenkins:yourRepo.git/hooks/post-receive
VonC
2
Pode ser óbvio, mas eu tinha problemas com: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. O parâmetro url deve corresponder exatamente ao que você tem no URL do repositório do seu trabalho Jenkins. Ao copiar exemplos, deixei de fora o protocolo, no nosso caso, ssh: // e não funcionou.
Pt
17

Espero que isso ajude: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

É apenas uma questão de usar curlpara acionar um trabalho Jenkins usando os ganchos do git fornecidos pelo git.
O comando

curl http://localhost:8080/job/someJob/build?delay=0sec

pode executar um trabalho Jenkins, onde someJobé o nome do trabalho Jenkins.

Procure a hookspasta na sua pasta .git oculta. Renomeie o post-commit.samplearquivo para post-commit. Abra-o com o bloco de notas, remova a : Nothinglinha e cole o comando acima.

É isso aí. Sempre que você faz uma confirmação, o Git aciona os comandos pós-confirmação definidos no arquivo.

Nav
fonte
Depois de fazer o commit na máquina dev, o pós-recebimento é chamado, e não o pós-commit. Verificado colocando instruções de log nos dois ganchos. Estou lendo os documentos incorretamente, não deve ser o pós-confirmação que é chamado?
Shirish Hirekodi
@ Shirish: Isso é estranho. Talvez você está fazendo algo diferente
Nav
isto é compilado com sucesso quando eu tenho o envio da última alteração por envio, mas não é compilado quando eu envio as alterações ... ???
3

Como a resposta anterior mostrou um exemplo de como o gancho completo pode parecer, aqui está o código do meu gancho pós-recebimento de trabalho:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

Nesse caso, aciono trabalhos de Jenkins apenas quando pressiono para mestre e não para outros ramos.

Zitrax
fonte
1
Como você vincula esse script Python ao Jenkins? Ou você apenas executa uma vez?
IgorGanapolsky 30/01
Jenkins não sabe sobre esse gancho, a parte principal é carregar o URL do notifyCommit no servidor jenkins, o que acionará uma pesquisa. Acho que a pesquisa está ativada, mas sem uma programação do lado de Jenkins.
Zitrax
Então, onde esse script python reside? Eu suponho que você amarrá-lo com a instalação do git para rastrear commits ...
IgorGanapolsky
1
Resposta tardia - mas o local do script estaria no servidor git em ganchos / pós-recebimento. Leia sobre os ganchos do git para saber mais.
Zitrax 06/0314
3

Quero acrescentar às respostas acima que se tornará um pouco mais difícil se a autorização do Jenkins estiver ativada.

Depois de ativá-lo, recebi uma mensagem de erro informando que o usuário anônimo precisa de permissão de leitura.

Vi duas soluções possíveis:

1: Alterando meu gancho para:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: definindo autorização baseada em projeto.

As soluções anteriores têm a desvantagem de expor minha senha no arquivo do gancho. Inaceitável no meu caso.

O segundo funciona para mim. Nas configurações globais de autenticação, tive que ativar o usuário Geral> Ler para Anônimo. No projeto que eu queria acionar, tive que ativar Trabalho> Compilar e Trabalho> Ler para Anônimo.

Essa ainda não é uma solução perfeita, porque agora você pode ver o projeto no Jenkins sem login. Pode haver uma solução ainda melhor usando a abordagem anterior com o login http, mas ainda não descobri.

anhoppe
fonte