Maneira ideal de criar e implantar um site como um pacote .deb

4

Eu tenho lutado com a implantação (principalmente PHP) de sites como arquivos .deb por algum tempo e me pergunto se há uma maneira melhor do que o meu método bastante complicado. Meu objetivo é a integração contínua no meu servidor de temporariedade e um clique para o servidor ao vivo a partir do Jenkins.

Meu caso de uso agora:

  • Desenvolvendo código no OSX
  • Controle de versão no Git
  • A origem contém a pasta debian / com scripts de controle, postinst e prerm
  • Script de compilação do Phing executado localmente em um ambiente de fakeroot
    • copia arquivos para uma pasta de compilação / tmp espelhando o layout do sistema de arquivos
    • configura a propriedade do arquivo como root / www-data conforme apropriado
    • executa dpkg-deb --build $ {build.dir} $ {working.dir}
    • copia o pacote para o repositório private deb na minha LAN

Eu tentei configurar um servidor de CI do Jenkins para assistir ao repositório do Git para commits e executar automaticamente uma compilação. O problema é que Jenkins é executado como seu próprio usuário que não tem permissão para definir as permissões de arquivo como acima. Eu também não consigo ver uma maneira óbvia de executar a compilação Phing em um ambiente fakeroot de dentro do Jenkins.

Minhas perguntas são:

  • Existe uma maneira melhor de configurar a propriedade e as permissões corretas de arquivos, em vez de ter que copiar tudo para um diretório temporário e ter um passo Phing para chmod tudo?
    • O comando dpkg-deb realmente precisa de todas as permissões de arquivo configuradas no sistema de arquivos antecipadamente? Existe algo que eu poderia colocar na pasta debian / que configuraria essas permissões quando o .deb fosse instalado?
  • Como posso fazer com que Jenkins execute um script de construção que tenha os direitos corretos para configurar a propriedade do arquivo?

Eu posso ter entendido mal como o .debs funciona, mas parece bastante inconveniente que a propriedade do arquivo em seu código-fonte do sistema de arquivos local precise espelhar o destino!

Estou aberto a sugestões sobre qualquer outra compilação e sistemas de IC que as pessoas usem para realizar uma tarefa semelhante.

    
por DanForys 17.06.2012 / 11:56

2 respostas

3

Parece que você cria um pacote binário debian quase manualmente usando o comando dpkg-deb. Embora essa abordagem não seja tão ruim, você obterá um tratamento melhor de muitas coisas se tentar construir pacotes criando os pacotes de origem e, em seguida, criando pacotes binários a partir deles (mesmo que sejam arquivos independentes de arquitetura, como os PHP) . Isso requer uma configuração única de vários arquivos no diretório debian/ .

Existe um arquivo debian/rules especial que decide o que rodar para construir pacotes Debian de diferentes tipos (isto é, fonte, binário, independente de binário) e para manter o próprio diretório de construção. Você pode considerar a execução de todas as suas ferramentas de compilação a partir desse arquivo, em vez de invocá-las uma a uma. Para consertar o problema de configurar proprietários / permissões durante a construção do usuário não privilegiado, você precisaria executar todo o processo de criação de pacotes Debian sob fakeroot wrapper. Para pacotes debian oficiais, isso pode ser feito executando fakeroot debian/rules binary . No entanto, isso é invocado a partir do dpkg-buildpackage , então você acabou de executar fakeroot dpkg-buildpackage .

O Debian é ótimo por suas ferramentas de desenvolvedor (veja os pacotes debhelper , devscripts e relacionados) e parece que você também não está usando (obviamente porque você constrói os pacotes sob outro sistema operacional). Eles vão lhe poupar muito tempo. Por exemplo, há dh_fixperms , que corrigirá permissões e problemas de propriedade para você, dh_install para colocar arquivos nos locais corretos, dh_link para criar links simbólicos necessários e outros scripts dh_ . Você pode querer ver como isso funciona no mundo real, então aqui está um lista de software implementado em PHP e empacotado no Debian .

Outra boa ferramenta para você será o git-buildpackage , que é um wrapper para ferramentas de compilação do Debian desenvolvidas para construir pacotes mantidos sob o Git DVCS.

Você pode querer dar uma olhada nas informações gerais para construir com o Git na página wiki Debian .

Infelizmente não existe phing no Debian, então você pode querer pedir a alguém para empacotá-lo para o Debian (assim você teria sua pilha de compilação completa disponível no Debian) ou apenas cozinhar um chroot do Debian com debootstrap e instalar o phing manualmente nele.

Se você está aderindo aos pacotes Debian como um mecanismo primário de implementação junto com algum sistema de CI, aqui estão alguns pontos:

  1. Pegue toda a pilha de compilação no Debian, se possível. Isto lhe dará a possibilidade de construir seu software em um chroot Debian limpo, usando ferramentas como pbuilder ou cowbuilder . Caso contrário, cozinhe uma caixa Debian para construção. Você pode querer criar uma máquina virtual e fornecê-la a outros desenvolvedores.
  2. Organize um repositório Debian restrito (a criação da chave GPG para assinatura automática para o repositório é suficiente para reduzir os avisos vindos do apt) e coloque os pacotes lá. Adicione-o ao arquivo de configuração /etc/apt/sources.list.d/my-repository.list das caixas de destino. Não esqueça de importar sua chave. Isso fornecerá informações sobre dependências que você não saberia se instalasse o pacote com apenas dpkg -i *.deb até a fase de instalação em si.
  3. Você pode querer instalar seus sites de pacotes regularmente (como releases / nightly / etc) em vez de instalá-los em todas as construções para economizar tempo e largura de banda. Estou usando principalmente o rsync e alguns Makefile para atualizar o banco de dados (ideia emprestada da migração de esquema do banco de dados Ruby).
  4. Você pode querer executar alguns comandos administrativos do agente do IC sem senha (por exemplo, recarregando a configuração do servidor da Web quando ela é atualizada com sudo invoke-rc.d nginx reload . Se estiver, restrinja-se a executar comandos exatos modificando /etc/sudoers , respectivamente.
por 18.06.2012 / 13:15
2

Um pacote Debian é um arquivo multi-parte que contém os dados, e controla as informações /debian . O arquivo de dados é basicamente extraído no estado em que se encontra. O archive de controle é extraído e, na maioria das vezes, movido para /var/lib/dpkg/info e os scripts pre | post-inst | rm são chamados quando apropriado. Se você quiser mudar alguma coisa depois que seus arquivos forem extraídos, faça isso no seu postinst.

but it seems rather inconvenient that the file ownership on your local filesystem source code has to mirror the destination!

Geralmente, as pessoas criam um chroot ou uma máquina virtual que espelha a arquitetura para a qual eles estão criando o pacote. Tentar construir um pacote para um sistema Debian a partir do OSX é bastante incomum.

Does the dpkg-deb command really need all the file permissions set up on the filesystem beforehand?

Essa é a maneira normal de lidar com as permissões. Modificar permissões postinstall é a exceção e não a regra.

    
por 17.06.2012 / 12:45