6

Próbuję programowo wdrożyć do Amazon Elastic Beanstalk z pracy Jenkins. Na moim komputerze deweloperskim, jest to tak proste, jak:Jak wdrożyć aplikację Python do Amazon Elastic Beanstalk z Jenkins?

eb deploy $(AWS_ELASTIC_BEANSTALK_ENVIRONMENT) 

na Jenkins, powinno być tak proste, jak konfigurowanie następujących jako polecenie 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 

Jednak to nie z poniższego śladu :

[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 

Nie jest jasne, dlaczego tak się dzieje, ponieważ po uruchomieniu powyższego na lokalnej kopii mojego projektu działa dobrze.

Komunikat o błędzie wydaje się mało pomocny. Nie jest jasne, dlaczego eb-cli nie mógłby znaleźć się na maszynie Jenkinsa.

Podsumowując ponownie moje pytanie: Jak mogę wdrożyć w Amazon Elastic Beanstalk z Jenkins? Czy powyższe podejście jest prawidłowe, ale z błędami w szczegółach? Czy jest jakiś prostszy sposób całkowicie?

Odpowiedz

2

Rozwiązałem to przez ssh w maszynie Jenkins, uruchamiając eb init, a następnie porównując wygenerowany .elasticbeanstalk/config.yml z tym w dokumencie tutaj, którego użyłem powyżej. Oba były inne ze względu na różne profile bezpieczeństwa na mojej maszynie programistycznej w porównaniu z maszyną Jenkins.

Możemy przerobić ten skrypt, aby być bardziej odporne na różne config.yaml plików, takich jak ten:

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

Uwaga, używamy echo "1" | eb init myapp --region us-west-2 wybranie domyślnego środowiska, ponieważ eb init nie bierze środowiska jako pozycyjnym argumentu, a następnie użyć eb use myenv, aby wybrać środowisko, które chcemy.

11

Aby poprawić błąd config profile (eb-cli) could not be found, upuść poświadczenia, których używasz do wdrożenia na platformie EB, do ~/.aws/config dla swojego użytkownika jenkins na maszynie Jenkins. Jeśli zbudowałeś swoje wdrożenie na komputerze lokalnym, powinieneś być w stanie pobrać plik bezpośrednio od ~/.aws/config lokalnie. Będzie to wyglądać tak:

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

Wpadliśmy w tej kwestii znikąd, to może lub nie może być istotne, ale chciałem, aby to tam dla każdego, kto może uruchamiać się na to ponownie. Wydaje się, że eb-cli nieco się zmieniło i nie pozwoli na globalne ustalanie danych uwierzytelniających.

Nasz JenkinsFile wygląda to

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" 
    } 

a nasz config.yml wygląda następująco

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

wyjęciu kluczyka profile rozwiązuje problem ... Jednak ta uniemożliwia wdrożeń z komputera lokalnego (chyba jest sposób użycia globaliów)