Pergunta

Estou movendo meus testes contínuos para um servidor dedicado (o teste automático diminui muito o laptop local). O que eu gostaria é para o meu servidor de teste (que está executando o CruiseControl.rb) para obter continuamente minhas mais recentes alterações (comprometidas) via Git - idealmente, sem alterações no meu próprio fluxo de trabalho. Eu sou o único desenvolvedor que trabalha neste projeto.

Antes de obter o servidor de teste, eu tinha:

  • Meu laptop como meu principal sistema de desenvolvimento
  • Vários ramos no meu repositório local.
  • Uma cópia de trabalho local, apontando para uma das filiais. Eu alterno entre ramificações com frequência (geralmente para novos recursos).
  • Uma conta do GitHub, para a qual eu frequentemente empurro as filiais locais para as filiais remotas espelhadas. (Isso é principalmente para usar um backup externo; não estou compartilhando nenhum código para o meu projeto atual). Eu tento pressionar para o Github pelo menos no final de cada dia de trabalho, embora ocasionalmente esqueça.

Eu gostaria de manter tudo isso intacto. Além disso, agora tenho:

  • O servidor de teste
  • ... executando o CruiseControl.rb
  • Um clone do meu repositório de laptop no meu servidor de teste. (Atualmente não é clonagem do Github)
  • Uma cópia de trabalho local no servidor de teste, a partir do qual o CC está construindo/testando.
  • Esta cópia de trabalho aponta para uma filial Git em particular (é claro)

Eu tenho tentado que meu servidor de teste obtenha automaticamente qualquer ramificação em que estou trabalhando na minha cópia de trabalho de laptop e construa a partir disso. (Isso imitaria os testes contínuos do AutoTest sem consumir recursos do sistema).

Coisas que tentei sem sucesso:

  • Origem/cabeça do checkout do Git: Isso deixa os arquivos bem, mas quebra o CruiseControl porque não gosta da cópia de trabalho "sem ramificação".
  • Git checkout - -track -b a_branch Origin/a_branch: isso funciona bem para obter arquivos, e o CC gosta, mas coloca o servidor de teste em uma ramificação específica. Ao alternar as filiais no laptop, pararei efetivamente de testar meu trabalho atual.
  • Git checkout - -track -b my_testing_branch Origin/Head: Isso também obtém arquivos construtáveis, mas sofre com o mesmo problema do comando acima. Criar uma filial a partir de origem/cabeça só pega a cabeça para a filial "padrão", por isso também é pegajoso.

Existe alguma maneira de obter um bom sistema de teste contínuo remoto (com ou sem ramificações Git) que não envolve grandes alterações no meu fluxo de trabalho?

Foi útil?

Solução

Outra opção é escrever um gancho Isso notifica o servidor de teste do novo código a ser puxado. Em particular, um post-commit Hook é provavelmente uma rota melhor. Então, toda vez que você se compromete, pode informar o servidor de teste sobre o que puxar e de qual ramificação.

Outras dicas

Você pode ter uma filial de testes dedicada na qual mescla seu trabalho atual.
Você pode forçar a substituição do conteúdo dessa ramificação pela confirmação do atual ramo de trabalho (ver Git mescle -s, e quanto a "deles" pergunta).

Em seguida, no servidor de CI, você inicializa com:

 $ git fetch laptopRepo
 $ git checkout -b testingBranch laptopRepo/testingBranch

Isso implica uma primeira etapa no lado do laptop para publicar algum trabalho atual para testar.

Esta não é a melhor solução, mas é algo ...

O servidor de teste pode ser executado git remote show origin Para ver qual filial está atualmente ativa no seu laptop. Por exemplo,

$ git remote show origin
* remote origin
  Fetch URL: blade:/var/scratch/code
  Push  URL: blade:/var/scratch/code
  HEAD branch: foo
  Remote branches:
    foo tracked
    bar tracked
    qux tracked

Então, o repositório de origem está atualmente no foo ramo.

Eu não vi um comando de baixo nível que lhe dará diretamente para que você tenha que analisá -lo com isso (talvez alguém tenha uma maneira melhor). Exemplo,

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ echo $b
foo

Agora, desde origin/foo vai agir de maneira semelhante a origin/HEAD (Nenhuma filial local) e seu CruiseControl não gosta disso, você provavelmente deve apenas criar uma filial local na máquina de teste e simplesmente retê-la para o local mais recente:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ git reset --hard origin/$b

Observe que isso é um pouco frágil desde HEAD Eu nem sempre é o que você acha que é. Por exemplo, durante uma rebase HEAD estará se movendo para trás e para frente. Se o seu servidor de teste verifica HEAD No seu laptop durante uma rebase, pode obter um local inválido ou indesejado.

Acho que tive uma solução muito boa invertendo o relacionamento entre os dois sistemas. Em vez de fazer o servidor de teste puxar do repositório do laptop, eu poderia fazer com que o laptop pressione as alterações no servidor para ser testado.

Primeiro, adiciono um controle remoto no repositório do laptop:

git remote add testing <url of testing server>

Então, sempre que tenho código para teste, faço um empurrão:

git push -f testing HEAD:master

Isso funcionará de qualquer ramo em que estou atualmente. O -F garante que eu tire o que quer que já esteja nesse ramo; Não terei que me preocupar com nenhuma ancestralidade.

Na verdade, isso não colocará o código mais recente em uma cópia de trabalho, mas as pesquisas da CruiseControl podem resolver isso. Eu também poderia ter um gancho do lado do servidor que atualiza uma cópia de trabalho e Executa a suíte de teste (eu nem precisaria de CC naquele momento).

Provavelmente vou querer adicionar um comando commit+push combinado a um script ou pseudônimo; Isso me dará meu compromisso e teste de um comando. Se, por algum motivo, eu quero fazer uma confirmação sem um empurrão de teste (ou vice -versa), também tenho essas opções.

Hospedeiro no github e use seu Ganchos pós-recreação. É assim que serviços como Devver e RuCoderun faça isso.

Eu pensei em pular o Git e ir para uma solução compartilhada/nfs/rsync, mas isso tem um grande problema: ela não é acionada por/limitada a compromissos, então acabarei recebendo construções quebradas positivas enquanto eu ' m no meio de digitar algo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top