Usando o RVM dentro de um contexto de serviço

3

Eu tenho um usuário configurado no Ubuntu 14.

Se eu verificar quando logado como usuário

build@linux-build-agent-1:~$ type rvm | head -1
rvm is a function

No entanto, esta máquina será um agente teamcity ...

Quando um trabalho é executado no contexto do serviço teamcity, vemos

[13:19:11][Step 1/1] RVM is not a function, selecting rubies with 'rvm use ...' will not work.
[13:19:11][Step 1/1] 
[13:19:11][Step 1/1] You need to change your terminal emulator preferences to allow login shell.
[13:19:11][Step 1/1] Sometimes it is required to use '/bin/bash --login' as the command.
[13:19:11][Step 1/1] Please visit https://rvm.io/integration/gnome-terminal/ for an example.

Eu tentei vários comandos tentando forçar o serviço a ser executado em um shell de login

su - build -c 'source "$HOME/.rvm/scripts/rvm" && /home/build/buildAgent/bin/agent.sh start'


sudo -u build -i bash -lc '/home/build/buildAgent/bin/agent.sh start'
su - build -c '/home/build/buildAgent/bin/agent.sh start'

dentro do script /etc/init.d/ sem efeito.

Se eu executar source "$HOME/.rvm/scripts/rvm na cabeça do script em teamcity, então tudo está OK, mas há vários usuários e não posso pedir a todos que se lembrem de fazer isso.

Foi assim que instalei o RVM ou ...?

Para esclarecer:

1) quando estou logado como o usuário sobre SSH rvm está instalado corretamente e funciona como esperado. Conforme mostrado por type rvm | head -1 = > 'rvm é uma função' 2) quando um serviço efetua login, pois o usuário rvm não está funcionando corretamente.

Eu quero que o rvm funcione quando executado no contexto do serviço, para que os usuários não precisem explicitamente source "$HOME/.rvm/scripts/rvm em seus scripts de construção

Normalmente, esse problema é causado por não ser executado como um shell de login. Então eu preciso saber como executar um serviço como um shell de login. Ou como lidar com o rvm para que ele possa funcionar fora do contexto de shell de login

    
por Paul D'Ambra 01.03.2017 / 14:24

1 resposta

1

Quando você executa su - build -c foo.sh , está iniciando um shell de login, que então inicia foo.sh . O script foo.sh , no entanto, está executando em sua própria subshell (é assim que os scripts funcionam) e o tipo dessa shell depende do shebang line do script. Então, su - -c foo.sh não está fazendo foo.sh rodar em um shell de login, ele está apenas executando um shell de login que então inicia foo.sh .

Portanto, edite /home/build/buildAgent/bin/agent.sh e altere isso:

#!/bin/sh

para isso:

#!/bin/sh -l

Isso fará com que seja executado em um shell de login e faça com que ele leia os arquivos /etc/profile e ~/.profile e traga sua função. Por favor, note que ~/.bash_profile não é relevante aqui. Este é um arquivo que é lido apenas por bash , e não sh , que, no Ubuntu, é na verdade dash .

    
por terdon 01.03.2017 / 15:07