Como eu automatizo git pulls de um repositório privado usando os ganchos do Github?

2

Tenho certeza de que há muitas perguntas semelhantes para isso, mas a minha é um pouco mais específica. Eu tenho um servidor usado para testes, e o dono do site quer que ele se atualize automaticamente quando alguém acessa os repositórios. Pensei em usar os ganchos do Github para enviar alguns dados para uma URL específica, sinalizando que é hora de uma atualização. No entanto, nossos repositórios são privados, e se eu executar um shell_exec () em PHP, ele é executado como www-data, que não pode ter chaves ssh. Eu não quero colocar senhas em texto puro, e estou bastante confuso sobre como eu vou permitir que o usuário autentique. Alguém pode fornecer algum conselho? Eu tenho puxado meu cabelo por muito tempo sobre algo que parece ser bem simples.

    
por Justin Folvarcik 04.06.2015 / 19:12

2 respostas

2

A razão pela qual a etapa git pull falha é porque no Ubuntu, o Apache executa o script como o usuário www-data . Assim, git procura as chaves ssh associadas ao usuário www-data e, ao não encontrá-las, não consegue concluir a solicitação git pull .

No Ubuntu 16.04, o usuário www-data recebe o diretório inicial /var/www . Este é o diretório no qual git procura as chaves ssh para negociar a transferência. Assim, a solução é fazer o GitHub acreditar que o usuário www-data é real, atribuindo a ele um conjunto válido de chaves. Para detalhar as etapas:

Note: This assumes that you have sudo access.

  1. Crie um diretório /var/www/.ssh de propriedade de www-data:www-data

    $ sudo mkdir -p /var/www/.ssh
    $ sudo chown -R www-data:www-data /var/www/.ssh
    
  2. Crie chaves ssh no diretório

    $ cd /var/www/.ssh
    $ sudo ssh-keygen -t rsa -b 2048
    

    Quando ssh-keygen solicita que o diretório coloque as chaves, escolha /var/www/id_rsa

  3. Assegure-se de que as permissões e a propriedade das chaves estejam corretas. chown to www-data:www-data conforme necessário.

    $ ls -la /var/www/.ssh/
    total 24K
    drwxr-xr-x 2 www-data www-data 4.0K Apr 29 23:58 ./
    drwxr-xr-x 5 root     root     4.0K Apr 30 00:06 ../
    -rw------- 1 www-data www-data 1.7K Apr 29 23:33 id_rsa
    -rw-r--r-- 1 www-data www-data  394 Apr 29 23:33 id_rsa.pub
    
  4. Copie a chave id_rsa.pub para as chaves ssh autorizadas nas configurações do repositório do GitHub.

  5. É importante garantir que git pull funcione quando executado como o usuário www-data . O uso do ssh também precisa incluir a identidade do servidor do GitHub no arquivo known_hosts . No entanto, o usuário www-data não possui um shell de login por padrão. Então temos que usar um truque simples:

    $ sudo vi /etc/passwd
    

    Encontre a linha para www-data e altere a /usr/sbin/nologin para /bin/bash e salve o arquivo. A entrada para www-data deve ser semelhante a:

    www-data:x:33:33:www-data:/var/www:/bin/bash
    
  6. Altere para o usuário www-data

    $ sudo su
    # su - www-data
    
  7. Uma vez que você está logado como www-data , vá para o repositório git e execute um git pull manualmente.

  8. O processo ssh solicitará que você adicione a identidade do servidor GitHub ao arquivo known_hosts e use o par de chaves em /var/www/.ssh para concluir o git pull .

  9. Se for bem sucedido, você deve estar definido. Tente push um commit para o GitHub de outro computador e verifique se o script PHP executa a solicitação pull .

  10. Redefina o arquivo /etc/passwd para seu estado original com o shell de login do usuário www-data como /usr/sbin/nologin

por 02.05.2018 / 03:04
1

Existem muitas maneiras. Aqui está um:

  1. Esse método requer apenas autenticação básica, portanto, gere um UUID para usar como um token de autenticação. Por exemplo: link
  2. Configure o webhook do repo do GitHub para acionar seu webhook, adicionando o UUID como um token: link
  3. Coloque um arquivo webhook.php na raiz do seu site que verifique o token e não faça nada além de sinalizar o site para uma atualização:

    <?php
    $token = "yourUUID";
    if($_GET['token'] != $token) {
        die("Unauthorized source!");
    } else {
        touch(__DIR__ . '/git_pull_needed');
    }
    
  4. Crie um cronjob que seja executado com freqüência (a cada minuto?) e saia se o arquivo git_pull_needed não existir. Se existir , a tarefa poderá executar git pull , após o que excluirá o arquivo git_pull_needed . Nota: O usuário que este cronjob é executado pode ser root ou preferencialmente algum usuário 'deploy' que tenha uma chave SSH com permissão somente leitura no GitHub e permissão de escrita para o webroot.

Os principais benefícios deste método desacoplado são o baixo risco de expor o webhook.php para o exterior (um atacante só pode disparar um git pull se ele adivinhar o token), a desconexão entre o servidor web e o usuário 'user' segurando a tecla ssh e o limitador de taxa simples integrado.

    
por 28.10.2015 / 12:37

Tags