@@ -25,7 +25,7 @@ blue="\e[34m"
25
25
h1 () {
26
26
printf " \n${bold}${underline} %s${reset} \n" " $( echo " $@ " | sed ' /./,$!d' ) "
27
27
}
28
- h2 () {
28
+ h2 () {
29
29
printf " \n${bold} %s${reset} \n" " $( echo " $@ " | sed ' /./,$!d' ) "
30
30
}
31
31
info () {
@@ -92,7 +92,7 @@ installAwsCli() {
92
92
runCommand " sudo apt-get install -y python-pip"
93
93
success " Installing PIP (` pip --version` ) succeeded"
94
94
fi
95
-
95
+
96
96
h2 " Installing AWS CLI"
97
97
runCommand " sudo pip install awscli"
98
98
}
@@ -104,13 +104,13 @@ vercomp() {
104
104
fi
105
105
local IFS=.
106
106
local i ver1=($1 ) ver2=($2 )
107
-
107
+
108
108
# fill empty fields in ver1 with zeros
109
109
for (( i= ${# ver1[@]} ; i< ${# ver2[@]} ; i++ ))
110
110
do
111
111
ver1[i]=0
112
112
done
113
-
113
+
114
114
for (( i= 0 ; i< ${# ver1[@]} ; i++ ))
115
115
do
116
116
if [[ -z ${ver2[i]} ]]
@@ -162,13 +162,13 @@ if ! typeExists "aws"; then
162
162
else
163
163
# aws-cli 1.9.8 is required for proper SSE syntax
164
164
AWS_FULL_VER=$( aws --version 2>&1 )
165
- AWS_VER=$( echo $AWS_FULL_VER | sed -e ' s/aws-cli\///' | sed -e ' s/ Python.*//' )
165
+ AWS_VER=$( echo $AWS_FULL_VER | sed -e ' s/aws-cli\///' | sed -e ' s/ Python.*//' )
166
166
vercomp $AWS_VER " 1.9.8"
167
167
if [[ $? == 2 ]]; then
168
168
h2 " Installing updated AWS CLI version ($AWS_VER < 1.9.8)"
169
169
installAwsCli
170
- fi
171
-
170
+ fi
171
+
172
172
success " Dependencies met $( aws --version 2>&1 ) "
173
173
fi
174
174
@@ -184,7 +184,7 @@ if [ -z "$AWS_CODE_DEPLOY_KEY" ]; then
184
184
# Ensure an access key has already been set
185
185
if [ $( aws configure list | grep access_key | wc -l) -lt 1 ]; then
186
186
error " No AWS_CODE_DEPLOY_KEY specified and AWS cli is not configured with an access key via env, config, or shared credentials"
187
- exit 1
187
+ exit 1
188
188
fi
189
189
success " AWS Access Key already configured."
190
190
else
@@ -196,7 +196,7 @@ if [ -z "$AWS_CODE_DEPLOY_SECRET" ]; then
196
196
# Ensure an access key secret has already been set
197
197
if [ $( aws configure list | grep secret_key | wc -l) -lt 1 ]; then
198
198
error " No AWS_CODE_DEPLOY_SECRET specified and AWS cli is not configured with an access secret via env, config, or shared credentials"
199
- exit 1
199
+ exit 1
200
200
fi
201
201
success " AWS Secret Access Key already configured."
202
202
else
@@ -208,7 +208,7 @@ if [ -z "$AWS_CODE_DEPLOY_REGION" ]; then
208
208
# Ensure AWS region has already been set
209
209
if [ $( aws configure list | grep region | wc -l) -lt 1 ]; then
210
210
error " No AWS_CODE_DEPLOY_REGION specified and AWS cli is not configured with an existing default region via env, config, or shared credentials"
211
- exit 1
211
+ exit 1
212
212
fi
213
213
success " AWS Region already configured."
214
214
else
@@ -304,7 +304,7 @@ if [ $? -ne 0 ]; then
304
304
if [ -n " $EC2_TAG_FILTERS " ]; then
305
305
DEPLOYMENT_GROUP_CREATE=" $DEPLOYMENT_GROUP_CREATE --ec2-tag-filters $EC2_TAG_FILTERS "
306
306
fi
307
-
307
+
308
308
runCommand " $DEPLOYMENT_GROUP_CREATE " \
309
309
" Creating deployment group \" $DEPLOYMENT_GROUP \" for application \" $APPLICATION_NAME \" failed" \
310
310
" Creating deployment group \" $DEPLOYMENT_GROUP \" for application \" $APPLICATION_NAME \" succeeded"
@@ -318,10 +318,11 @@ h1 "Step 6: Checking Application Source"
318
318
APP_SOURCE=$( readlink -f " ${AWS_CODE_DEPLOY_APP_SOURCE:- .} " )
319
319
320
320
if [ ! -d " $APP_SOURCE " -a ! -e " $APP_SOURCE " ]; then
321
- error " The specified application source \" ${APP_SOURCE} \" does not exist."
322
- exit
321
+ # Note: Use original variable for output as the readlink can potentially evaluate to ""
322
+ error " The specified application source \" ${AWS_CODE_DEPLOY_APP_SOURCE} \" does not exist."
323
+ exit 1
323
324
fi
324
- if [ -d " $APP_SOURCE " ]; then
325
+ if [ -d " $APP_SOURCE " ]; then
325
326
if [ ! -e " $APP_SOURCE /appspec.yml" ]; then
326
327
error " The specified source directory \" ${APP_SOURCE} \" does not contain an \" appspec.yml\" in the application root."
327
328
exit 1
@@ -334,17 +335,17 @@ if [ -d "$APP_SOURCE" ]; then
334
335
DEPLOYMENT_COMPRESS_ORIG_DIR_SIZE=$( du -hs $APP_SOURCE | awk ' { print $1}' )
335
336
APP_LOCAL_FILE=" ${AWS_CODE_DEPLOY_S3_FILENAME% .* } .zip"
336
337
APP_LOCAL_TEMP_FILE=" /tmp/$APP_LOCAL_FILE "
337
-
338
+
338
339
runCommand " cd \" $APP_SOURCE \" && zip -rq \" ${APP_LOCAL_TEMP_FILE} \" ." \
339
- " Unable to compress \" $APP_SOURCE \" "
340
+ " Unable to compress \" $APP_SOURCE \" "
340
341
DEPLOYMENT_COMPRESS_FILESIZE=$( ls -lah " ${APP_LOCAL_TEMP_FILE} " | awk ' { print $5}' )
341
342
BUNDLE_TYPE=" zip"
342
343
success " Successfully compressed \" $APP_SOURCE \" ($DEPLOYMENT_COMPRESS_ORIG_DIR_SIZE ) into \" $APP_LOCAL_FILE \" ($DEPLOYMENT_COMPRESS_FILESIZE )"
343
344
else
344
345
APP_SOURCE_BASENAME=$( basename " $APP_SOURCE " )
345
346
APP_SOURCE_FILESIZE=$( ls -lah " ${APP_SOURCE} " | awk ' { print $5}' )
346
347
EXTENSION=" ${APP_SOURCE#* .} "
347
-
348
+
348
349
if [ $EXTENSION == " tar" ]; then
349
350
BUNDLE_TYPE=" tar"
350
351
elif [ $EXTENSION == " tar.gz" ]; then
@@ -355,10 +356,10 @@ else
355
356
error " Unsupported bundle type for application source file: ${APP_SOURCE_BASENAME} - Must be tar, zip or tgz"
356
357
exit 1
357
358
fi
358
-
359
+
359
360
APP_LOCAL_FILE=$APP_SOURCE_BASENAME
360
361
APP_LOCAL_TEMP_FILE=$APP_SOURCE
361
-
362
+
362
363
success " Valid source file: $APP_SOURCE_BASENAME ($BUNDLE_TYPE ) ($APP_SOURCE_FILESIZE )"
363
364
fi
364
365
@@ -403,24 +404,24 @@ else
403
404
" Unable to list directory contents \" $S3_BUCKET /\" " \
404
405
" " \
405
406
S3_LS_OUTPUT
406
-
407
+
407
408
# Sort the output by date first
408
409
S3_LS_OUTPUT=$( echo " $S3_LS_OUTPUT " | sort)
409
410
410
411
# Filter out S3 prefixes (These do not count, especially useful in root bucket location)
411
412
S3_FILES=()
412
413
IFS=$' \n ' ;
413
- for line in $S3_LS_OUTPUT ; do
414
+ for line in $S3_LS_OUTPUT ; do
414
415
if [[ ! $line =~ ^[[:space:]]+PRE[[:space:]].* $ ]]; then
415
416
S3_FILES+=(" $line " )
416
417
fi
417
418
done
418
-
419
+
419
420
S3_TOTAL_FILES=${# S3_FILES[@]}
420
421
S3_NUMBER_FILES_TO_CLEAN=$(( $S3_TOTAL_FILES - $S3_DEPLOY_LIMIT ))
421
422
if [ $S3_NUMBER_FILES_TO_CLEAN -gt 0 ]; then
422
423
h2 " Removing oldest $S3_NUMBER_FILES_TO_CLEAN file(s) ..."
423
- for line in " ${S3_FILES[@]} " ; do
424
+ for line in " ${S3_FILES[@]} " ; do
424
425
if [ $S3_NUMBER_FILES_TO_CLEAN -le 0 ]; then
425
426
success " Successfuly removed $(( $S3_TOTAL_FILES - $S3_DEPLOY_LIMIT )) file(s)"
426
427
break
@@ -490,12 +491,12 @@ note "You can follow your deployment at: https://console.aws.amazon.com/codedepl
490
491
DEPLOYMENT_OVERVIEW=${AWS_CODE_DEPLOY_DEPLOYMENT_OVERVIEW:- true}
491
492
if [ " true" = " $DEPLOYMENT_OVERVIEW " ]; then
492
493
h1 " Deployment Overview"
493
-
494
- DEPLOYMENT_GET=" aws deploy get-deployment --output json --deployment-id \" $DEPLOYMENT_ID \" "
494
+
495
+ DEPLOYMENT_GET=" aws deploy get-deployment --output json --deployment-id \" $DEPLOYMENT_ID \" "
495
496
h2 " Monitoring deployment \" $DEPLOYMENT_ID \" for \" $APPLICATION_NAME \" on deployment group $DEPLOYMENT_GROUP ..."
496
497
info " $DEPLOYMENT_GET "
497
498
printf " \n"
498
-
499
+
499
500
while :
500
501
do
501
502
DEPLOYMENT_GET_OUTPUT=" $( eval $DEPLOYMENT_GET 2>&1 ) "
@@ -504,7 +505,7 @@ if [ "true" = "$DEPLOYMENT_OVERVIEW" ]; then
504
505
error " Deployment of application \" $APPLICATION_NAME \" on deployment group \" $DEPLOYMENT_GROUP \" failed"
505
506
exit 1
506
507
fi
507
-
508
+
508
509
# Deployment Overview
509
510
IN_PROGRESS=$( echo " $DEPLOYMENT_GET_OUTPUT " | jsonValue " InProgress" | tr -d " \r\n " )
510
511
PENDING=$( echo " $DEPLOYMENT_GET_OUTPUT " | jsonValue " Pending" | tr -d " \r\n " )
@@ -517,18 +518,18 @@ if [ "true" = "$DEPLOYMENT_OVERVIEW" ]; then
517
518
if [ " $SKIPPED " == " " ]; then SKIPPED=" -" ; fi
518
519
if [ " $SUCCEEDED " == " " ]; then SUCCEEDED=" -" ; fi
519
520
if [ " $FAILED " == " " ]; then FAILED=" -" ; fi
520
-
521
+
521
522
# Deployment Status
522
523
STATUS=$( echo " $DEPLOYMENT_GET_OUTPUT " | jsonValue " status" | tr -d " \r\n" | tr -d " " )
523
524
ERROR_MESSAGE=$( echo " $DEPLOYMENT_GET_OUTPUT " | jsonValue " message" )
524
-
525
+
525
526
printf " \r${bold}${blink} Status${reset} | In Progress: $IN_PROGRESS | Pending: $PENDING | Skipped: $SKIPPED | Succeeded: $SUCCEEDED | Failed: $FAILED | "
526
527
527
528
# Print Failed Details
528
529
if [ " $STATUS " == " Failed" ]; then
529
530
printf " \r${bold} Status${reset} | In Progress: $IN_PROGRESS | Pending: $PENDING | Skipped: $SKIPPED | Succeeded: $SUCCEEDED | Failed: $FAILED |\n"
530
531
error " Deployment failed: $ERROR_MESSAGE "
531
-
532
+
532
533
# Retrieve failed instances. Use text output here to easier retrieve array. Output format:
533
534
# INSTANCESLIST i-1497a9e2
534
535
# INSTANCESLIST i-23a541eb
@@ -538,22 +539,22 @@ if [ "true" = "$DEPLOYMENT_OVERVIEW" ]; then
538
539
" " \
539
540
" " \
540
541
LIST_INSTANCES_OUTPUT
541
-
542
+
542
543
INSTANCE_IDS=($( echo " $LIST_INSTANCES_OUTPUT " | sed -r ' s/INSTANCESLIST\s+//g' ) )
543
544
INSTANCE_IDS_JOINED=$( printf " , %s" " ${INSTANCE_IDS[@]} " )
544
545
success " Found ${# INSTANCE_IDS[@]} failed instance(s) [ ${INSTANCE_IDS_JOINED: 2} ]"
545
-
546
+
546
547
# Enumerate over each failed instance
547
548
for i in " ${! INSTANCE_IDS[@]} " ; do
548
549
FAILED_INSTANCE_OUTPUT=$( aws deploy get-deployment-instance --deployment-id $DEPLOYMENT_ID --instance-id ${INSTANCE_IDS[$i]} --output text)
549
550
printf " \n${bold} Instance: ${INSTANCE_IDS[$i]}${reset} \n"
550
-
551
+
551
552
echo " $FAILED_INSTANCE_OUTPUT " | while read -r line; do
552
-
553
+
553
554
case " $( echo $line | awk ' { print $1; }' ) " in
554
-
555
+
555
556
INSTANCESUMMARY)
556
-
557
+
557
558
printf " Instance ID: %s\n" " $( echo $line | awk ' { print $3; }' ) "
558
559
printf " Status: %s\n" " $( echo $line | awk ' { print $5; }' ) "
559
560
printf " Last Updated At: %s\n\n" " $( date -d @$( echo $line | awk ' { print $4; }' ) ) "
@@ -566,56 +567,56 @@ if [ "true" = "$DEPLOYMENT_OVERVIEW" ]; then
566
567
LIFECYCLEEVENTS)
567
568
# For now, lets just strip off start/stop times. Also convert tabs to spaces
568
569
lineModified=$( echo " $line " | sed -r ' s/[0-9]+\.[0-9]+//g' | sed ' s/\t/ /g' )
569
-
570
+
570
571
# Bugfix: Ubuntu 12.04 has some weird issues with spacing as seen on CircleCI. We fix this
571
572
# by just condensing down to single spaces and ensuring the proper separator.
572
573
IFS=$' '
573
574
ARGS=($( echo " $lineModified " | sed -r ' s/\s+/ /g' ) )
574
-
575
+
575
576
if [ ${# ARGS[@]} == 3 ]; then
576
577
case " ${ARGS[2]} " in
577
578
Succeeded)
578
579
printf " ${bold}${green} ✔ [%s]${reset} \t%s\n" " ${ARGS[2]} " " ${ARGS[1]} "
579
580
;;
580
-
581
+
581
582
Skipped)
582
583
printf " ${bold} [%s]${reset} \t%s\n" " ${ARGS[2]} " " ${ARGS[1]} "
583
584
;;
584
-
585
+
585
586
Failed)
586
587
printf " ${bold}${red} ✖ [%s]${reset} \t%s\n" " ${ARGS[2]} " " ${ARGS[1]} "
587
588
;;
588
589
esac
589
-
590
+
590
591
else
591
592
echo " [UNKNOWN] (${# ARGS[@]} ) $lineModified "
592
593
fi
593
594
;;
594
-
595
+
595
596
DIAGNOSTICS)
596
597
# Skip diagnostics if we have "DIAGNOSTICS Success Succeeded"
597
598
if [ " $( echo $line | awk ' { print $2; }' ) " == " Success" ] && [ " $( echo $line | awk ' { print $3; }' ) " == " Succeeded" ]; then
598
599
continue
599
600
fi
600
-
601
+
601
602
# Just pipe off the DIAGNOSTICS
602
603
printf " ${red} %s${reset} \n" " $( echo $line | sed -r ' s/^DIAGNOSTICS\s*//g' ) "
603
- ;;
604
-
604
+ ;;
605
+
605
606
* )
606
607
printf " ${red}${line}${reset} \n"
607
608
;;
608
-
609
+
609
610
esac
610
611
611
612
done # end: while
612
-
613
+
613
614
done # ~ end: instance
614
-
615
+
615
616
printf " \n\n"
616
617
exit 1
617
618
fi
618
-
619
+
619
620
# Deployment succeeded
620
621
if [ " $STATUS " == " Succeeded" ]; then
621
622
printf " \r${bold} Status${reset} | In Progress: $IN_PROGRESS | Pending: $PENDING | Skipped: $SKIPPED | Succeeded: $SUCCEEDED | Failed: $FAILED |\n"
0 commit comments