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.
Vale la pena evidenziare semplicemente perché il messaggio di errore è lungo. L'eventuale errore è: npm: comando non trovato –
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. –
metti 'source/path_to_bash_profile' sopra il tuo afterinstall.sh – Chris