Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

[Bug] Variáveis de ambiente não exportadas

O workflow do EC2 é executado corretamente. Porém, ao acessar a máquina EC2 via SSH, vejo nos logs que a aplicação não chegou a subir pois as variáveis de ambiente não foram carregadas. Segue exemplo do que acontece ao tentar ver as variáveis e o meu arquivo de workflow

echo $DB_USER

(O espaço em branco é o retorno: vazio)

- name: executing remote ssh commands using password
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.REMOTE_HOST }}
        username: ${{ secrets.REMOTE_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        port: 22
        script: |
          export DB_HOST=${{ secrets.DBHOST }}
          export DB_USER=${{ secrets.DBUSER }}
          export DB_PASSWORD=${{ secrets.DBPASSWORD }}
          export DB_NAME=${{ secrets.DBNAME }}
          export DB_PORT=${{ secrets.DBPORT }}
          export PORT=8000
          chmod +x main
          nohup ./main > nohup.out 2> nohup.err < /dev/null &
  • Já verifiquei o secrets do repositório, os nomes estão corretos
  • Modifiquei o nome das variáveis no código também
    • stringDeConexao := "host="+os.Getenv("DB_HOST")+" user="+os.Getenv("DB_USER")+" password="+os.Getenv("DB_PASSWORD")+" dbname="+os.Getenv("DB_NAME")+" port="+os.Getenv("DB_PORT")+" sslmode=disable"
  • O log do step de execução dos comandos SSH aponta que os comandos foram executados corretamente
2 respostas

Olá Marcelo. Tudo bem?
Parabéns por trazer uma descrição tão detalhada do problema, isso facilita bastante a análise.
Pelo que você relatou, o workflow está executando corretamente e os comandos export também estão sendo processados durante a sessão SSH. No entanto, existe um detalhe importante: as variáveis exportadas ficam disponíveis apenas naquele processo de shell em que foram definidas.
Como a aplicação está sendo iniciada com nohup e enviada para segundo plano, vale verificar se ela realmente está herdando o ambiente da sessão atual.
Uma forma simples de testar é adicionar comandos de depuração antes da execução do binário, por exemplo:

echo $DB_HOST
echo $DB_USER
env | grep DB_

Outro ponto importante é que, ao acessar a EC2 posteriormente via SSH e executar echo $DB_USER, é esperado que o retorno seja vazio, pois trata-se de uma nova sessão SSH, independente daquela utilizada pelo GitHub Actions.
Uma abordagem bastante utilizada em produção é criar um arquivo .env ou um arquivo de configuração durante o deploy e carregá-lo explicitamente antes de iniciar a aplicação. Isso evita problemas relacionados ao escopo das variáveis de ambiente entre processos e sessões.
Além disso, você pode adicionar logs temporários na aplicação Go para verificar se o os.Getenv() está realmente retornando valores no momento da inicialização. Dessa forma, será possível identificar se o problema está no carregamento das variáveis ou na forma como a aplicação está sendo executada.
Sua investigação já está bem encaminhada, e o fato de os comandos aparecerem corretamente no log do workflow indica que você está próximo de encontrar a causa raiz.
Teste ai e avise.
Bons estudos.

solução!

Olá, Ronaldo!
Obrigado pela explicação!
Eu pesquisei e vi tanto essa abordagem de criar um arquivo .env quanto a abordagem de passar as variáveis de ambiente apenas para o processo. Resolvi implementar a segunda opção e funcionou perfeitamente (ela só exige cuidado ao reiniciar o processo, pois as variáveis podem ser perdidas). Fica aqui o registro do novo trecho de código:

    - name: executing remote ssh commands using password
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.REMOTE_HOST }}
        username: ${{ secrets.REMOTE_USER }}
        key: ${{ secrets.SSH_PRIVATE_KEY }}
        port: 22
        script: |
          chmod +x main

          env \
            DB_HOST="${{ secrets.DBHOST }}" \
            DB_USER="${{ secrets.DBUSER }}" \
            DB_PASSWORD="${{ secrets.DBPASSWORD }}" \
            DB_NAME="${{ secrets.DBNAME }}" \
            DB_PORT="${{ secrets.DBPORT }}" \
            PORT=8000 \
          nohup ./main > nohup.out 2> nohup.err < /dev/null &