6

Sto provando a distribuire su Amazon Elastic Beanstalk a livello di codice da un lavoro di Jenkins. Sulla mia macchina di sviluppo, questo è il più semplice:Come distribuire un'applicazione Python su Amazon Elastic Beanstalk da Jenkins?

eb deploy $(AWS_ELASTIC_BEANSTALK_ENVIRONMENT) 

su Jenkins, dovrebbe essere semplice come configurare il seguente come un comando build:

virtualenv env && source env/bin/activate && pip install awsebcli 
mkdir -p .elasticbeanstalk 
cat <<EOF> .elasticbeanstalk/config.yml 
branch-defaults: 
    master: 
    environment: myenv 
global: 
    application_name: myapp 
    default_ec2_keyname: null 
    default_platform: 64bit Amazon Linux 2014.09 v1.0.9 running Python 2.7 
    default_region: us-west-2 
    profile: eb-cli 
    sc: git 
EOF 
eb deploy myenv 

Tuttavia, questo non riesce con il seguente traccia :

[EnvInject] - Loading node environment variables. 
Building remotely on standard Amazon Linux 2014.09 AMI (i-d39710df) (x) in workspace /media/ephemeral0/jenkins/workspace/My_Job 
Fetching changes from the remote Git repository 
Fetching upstream changes from [email protected]:myapp.git 
Checking out Revision be45db94111f9ab49fe8031eb583307d2fb9921c (origin/master) 
[My_Job] $ /bin/sh -xe /tmp/hudson8633484437962332339.sh 
+ virtualenv env 
New python executable in env/bin/python2.7 
Not overwriting existing python script env/bin/python (you must use env/bin/python2.7) 
Installing Setuptools..................................................................................................................done. 
Installing Pip....................................................................................................................................done. 
+ source env/bin/activate 
++ deactivate nondestructive 
++ unset pydoc 
++ '[' -n '' ']' 
++ '[' -n '' ']' 
++ '[' -n /bin/sh -o -n '' ']' 
++ hash -r 
++ '[' -n '' ']' 
++ unset VIRTUAL_ENV 
++ '[' '!' nondestructive = nondestructive ']' 
++ VIRTUAL_ENV=/media/ephemeral0/jenkins/workspace/My_Job/env 
++ export VIRTUAL_ENV 
++ _OLD_VIRTUAL_PATH=/usr/local/bin:/bin:/usr/bin:/opt/aws/bin 
++ PATH=/media/ephemeral0/jenkins/workspace/My_Job/env/bin:/usr/local/bin:/bin:/usr/bin:/opt/aws/bin 
++ export PATH 
++ '[' -n '' ']' 
++ '[' -z '' ']' 
++ _OLD_VIRTUAL_PS1= 
++ '[' x '!=' x ']' 
+++ basename /media/ephemeral0/jenkins/workspace/My_Job/env 
++ '[' env = __ ']' 
+++ basename /media/ephemeral0/jenkins/workspace/My_Job/env 
++ PS1='(env)' 
++ export PS1 
++ alias 'pydoc=python -m pydoc' 
++ '[' -n /bin/sh -o -n '' ']' 
++ hash -r 
+ pip install awsebcli 
Requirement already satisfied (use --upgrade to upgrade): awsebcli in ./env/lib/python2.7/site-packages 
Downloading/unpacking setuptools>=7.0 (from awsebcli) 
    Running setup.py egg_info for package setuptools 

Requirement already satisfied (use --upgrade to upgrade): pyyaml>=3.11 in ./env/lib/python2.7/site-packages (from awsebcli) 
Requirement already satisfied (use --upgrade to upgrade): six==1.8.0 in ./env/lib/python2.7/site-packages (from awsebcli) 
Requirement already satisfied (use --upgrade to upgrade): cement==2.4 in ./env/lib/python2.7/site-packages (from awsebcli) 
Requirement already satisfied (use --upgrade to upgrade): python-dateutil>=2.2 in ./env/lib/python2.7/site-packages (from awsebcli) 
Requirement already satisfied (use --upgrade to upgrade): jmespath>=0.4.1 in ./env/lib/python2.7/site-packages (from awsebcli) 
Installing collected packages: setuptools 
    Found existing installation: setuptools 0.9.7 
    Uninstalling setuptools: 
     Successfully uninstalled setuptools 
    Running setup.py install for setuptools 

    Installing easy_install script to /media/ephemeral0/jenkins/workspace/My_Job/env/bin 
    Installing easy_install-2.7 script to /media/ephemeral0/jenkins/workspace/My_Job/env/bin 
Successfully installed setuptools 
Cleaning up... 
+ mkdir -p .elasticbeanstalk 
+ cat 
+ cat .elasticbeanstalk/config.yml 
branch-defaults: 
    master: 
    environment: myenv 
global: 
    application_name: myapp 
    default_ec2_keyname: null 
    default_platform: 64bit Amazon Linux 2014.09 v1.0.9 running Python 2.7 
    default_region: us-west-2 
    profile: eb-cli 
    sc: git 
+ eb deploy myenv 
ERROR: The config profile (eb-cli) could not be found 
Build step 'Execute shell' marked build as failure 
Finished: FAILURE 

Non è chiaro il motivo per cui questo accade da quando corro sopra su una copia locale del mio progetto funziona benissimo.

Il messaggio di errore non sembra essere di grande aiuto. Non è chiaro il motivo per cui eb-cli non potrebbe essere trovato sulla macchina di Jenkins.

Quindi, per riassumere la mia domanda: come distribuire su Amazon Elastic Beanstalk da Jenkins? L'approccio sopra è corretto, ma con errori nei dettagli? O c'è un modo più semplice del tutto?

risposta

2

Ho risolto questo problema con ssh nella macchina Jenkins, eseguendo eb init, quindi confrontando lo .elasticbeanstalk/config.yml generato con quello nel here-doc che stavo usando in precedenza. I due erano diversi a causa dei diversi profili di sicurezza sulla mia macchina di sviluppo rispetto alla macchina di Jenkins.

possiamo riscrivere lo script per essere più robusto contro diversi config.yaml file come questo:

virtualenv env && source env/bin/activate && pip install awsebcli 
echo "1" | eb init myapp --region us-west-2 && eb use myenv && eb deploy myenv 

nota, usiamo echo "1" | eb init myapp --region us-west-2 per selezionare un ambiente predefinito dal eb init non prende ambiente come un argomento posizionale e quindi utilizzare eb use myenv per selezionare l'ambiente che vogliamo.

11

Per correggere l'errore config profile (eb-cli) could not be found, eliminare le credenziali utilizzate per la distribuzione in EB in ~/.aws/config per l'utente jenkins sulla macchina jenkins. Se hai creato la tua distribuzione su un computer locale, dovresti riuscire a estrarre il file direttamente da ~/.aws/config localmente. Si sarà simile a questa:

[profile eb-cli] 
aws_access_key_id = (for your IAM user) 
aws_secret_access_key = (for your IAM user) 
0

ci siamo imbattuti in questo problema di punto in bianco, questo può o non può essere rilevante, ma ho voluto ottenere questo là fuori per tutti coloro che potrebbero correre attraverso questo nuovo. L'eb-cli sembra essere leggermente cambiato e non permetterà che le credenziali vengano impostate globalmente.

nostro JenkinsFile assomiglia a questo

withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', 
credentialsId: 'iam-creds']]) { 
     sh "pip install awsebcli --upgrade --user" 
     sh "~/.local/bin/eb use my-application" 
     sh "~/.local/bin/eb deploy --verbose" 
    } 

e la nostra config.yml appare così

global: 
    application_name: my-application 
    default_ec2_keyname: application-keyname 
    ... 
    profile: eb-cli 
    sc: git 
    workspace_type: Application 

rimuovendo la chiave profile risolve il problema ... Tuttavia, questo non consente implementazioni dalla macchina locale (a meno che non c'è un modo per utilizzare le globali)

Problemi correlati