2015-12-02 15 views
5

Attualmente sto cercando di automatizzare la distribuzione di un'applicazione nodejs su un'istanza EC2 tramite Github e AWS Codedeploy. Ho seguito le istruzioni da here il più fedelmente possibile, ma ho avuto un problema con il mio evento hook AfterInstall.Problema di NPM che distribuisce un'istanza nodejs utilizzando AWS codedeploy

Ecco il mio file yml:

version: 0.0 
os: linux 
files: 
    - source: /backend 
    destination: /home/ec2-user/signal 
permissions: 
    - object:/
    pattern: "**" 
    owner: ec2-user 
    group: ec2-user 
hooks: 
    ApplicationStop: 
    - location: backend/app/deploy/stop.sh 
     timeout: 10 
     runas: ec2-user 
    BeforeInstall: 
    - location: backend/app/deploy/beforeinstall.sh 
     timeout: 1200 
     runas: ec2-user 
    AfterInstall: 
    - location: backend/app/deploy/afterinstall.sh 
     timeout: 1200 
     runas: ec2-user 
    ApplicationStart: 
    - location: backend/app/deploy/start.sh 
     timeout: 60 
     runas: ec2-user 
ValidateService: 
    - location: backend/app/deploy/validate.sh 
     timeout: 60 
     runas: ec2-user 

invoco la distribuirli via AWS CLI in questo modo:

aws deploy create-deployment --application-name Signal --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name Production --description "Deployment" --github-location repository=githubusername/repository,commitId=ABCD123 --ignore-application-stop-failures 

tutto funziona bene, fino a raggiungere la fase AfterInstall e la mia 'AfterInstall. sh 'è eseguito. Il file è simile al seguente:

#!/bin/bash 
cd /home/ec2-user/signal/app/ 
npm install 

e produce il seguente log degli errori, causando una distribuzione non riuscita:

Codice di errore: ScriptFailed

Messaggio: Script in posizione specificata: backend /app/deploy/afterinstall.sh eseguito come utente ec2-utente non riuscito con il codice di uscita 127

LifecycleEvent - AfterInstall 
Script - backend/app/deploy/afterinstall.sh 
[stderr]/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/afterinstall.sh: line 7: npm: command not found 

Tuttavia, se ssh nella mia istanza EC2, passare sia la directory temp:

/opt/codedeploy-agent/deployment-root/be9902d2-8af0-46fd-b186-23ead6bea5a4/d-SBW6YCLKC/deployment-archive/backend/app/deploy/ 

o

cd /home/ec2-user/signal/app/ 

e manualmente, eseguire 'NPM install', o eseguire il mio script via. /afterinstall.sh, quindi npm funziona correttamente.

Perché le cose sono diverse per l'agente Codedeploy? Sto usando 'runas: ec2-user', quindi presumo che le autorizzazioni siano le stesse di quando sono ssh'ed nella casella come ec2-user.

Quale cosa idiota sto sbagliando? Molte, molte grazie.

+0

Vale la pena evidenziare semplicemente perché il messaggio di errore è lungo. L'eventuale errore è: npm: comando non trovato –

+0

Suppongo che sia in esecuzione come 'ec2-user' ma non esegua gli script di accesso come '.bash_profile' e' .bashrc', quindi non ha npm sul sentiero. –

+0

metti 'source/path_to_bash_profile' sopra il tuo afterinstall.sh – Chris

risposta

12

Come osservato con precisione nei commenti di mbaird e Chris, era che non avevo il mio set PATH. Quindi npm, e nodo, e pm2 e ... tutto fallito.

Attraverso la sperimentazione, è emerso che avevo bisogno di ristabilire il mio percorso con ogni fase del processo di implementazione di Codedeploy. Così in cima alla mia stop.sh/beforeinstall.sh/afterinstall.sh/start.sh, ho incluso:

source /home/ec2-user/.bash_profile 

e la vita era buono. Mi sono imbattuto in altri problemi con pm2 che non avviava il nodo nella giusta directory di lavoro, ma un simile tweaking agli script di codedeploy ha funzionato.

Questo era tutto ovvio a ben vedere, ma sono estremamente grato per l'aiuto. Grazie ragazzi!

+1

Vuoi condividere le modifiche che menzioni, perché sembra che sto cercando lo stesso? – Galya

+1

Questa è la risposta corretta. Assicurati di rimuovere #!/Bin/bash e sostituirlo con la linea sorgente. Ho sbattuto la testa contro il muro su quello per un'ora. –

-2

L'agente host utilizza l'ambiente root piuttosto ridotto. Un codice di uscita di 127 indica che il sistema operativo non riesce a trovare alcun file necessario per caricare lo script (potrebbe essere lo script di qualcosa che è necessario per eseguirlo).

La cosa migliore da fare è assicurarsi che npm sia installato per root.

Poiché, l'agente host fornisce/etc/profile quando viene avviato come servizio, è inoltre possibile aggiungere tutto ciò che è necessario per ottenere il funzionamento di npm.

+2

Non eseguire il nodo come root. –

Problemi correlati