-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinstall.sh
executable file
·110 lines (99 loc) · 3.7 KB
/
install.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/bin/bash
set -euo pipefail
readonly DEPLOYMENT_TIME=$( date +%s )
readonly NODE_VERSION=$( jq -r .engines.node package.json )
readonly BASE_VERSION=$( cat herokles/base_version )
readonly DEPLOY_SCRIPT_VERSION=$( cat herokles/scripts_version )
readonly HELM_DEPLOYMENT="${PROJECT}-${ENV}"
function rollback_on_fail() {
local rollback_from_status=$1
helm_cmd="helm -n $PROJECT"
if $helm_cmd list -a | sed 1d | awk '{ print $1 }' | grep -q ^${HELM_DEPLOYMENT}$ ; then
current_status=$( $helm_cmd status ${HELM_DEPLOYMENT} --output json | jq -r '.info.status' )
if [[ "$current_status" =~ $rollback_from_status ]] ; then
echo "Previous helm deployment unsuccessul or not done"
rollback_to=$( $helm_cmd history --output json ${HELM_DEPLOYMENT} \
| jq -r 'map(select(.status == "superseded" or .status == "deployed" ).revision) | max' )
if [[ "$rollback_to" != null ]] ; then
echo "Rollback to last healthy version ${rollback_to}"
$helm_cmd rollback --wait --timeout 3m1s ${HELM_DEPLOYMENT} ${rollback_to}
else
echo "No healthy version available, uninstalling"
$helm_cmd delete --wait --timeout 3m1s ${HELM_DEPLOYMENT}
fi
fi
fi
}
function set_aws_creds() {
echo "Configuring aws cli."
local creds=(
"[herokles]"
"aws_access_key_id = $HEROKLES_AWS_ACCESS_KEY_ID"
"aws_secret_access_key = $HEROKLES_AWS_SECRET_ACCESS_KEY"
"region = $HEROKLES_AWS_REGION"
)
mkdir ~/.aws
printf '%s\n' "${creds[@]}" > ~/.aws/credentials
}
function installHelm() {
curl -sSL https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 -o helm-installer
bash helm-installer --version v3.12.2
}
function main() {
[[ -d ~/.aws ]] || set_aws_creds
echo "Getting environment variables."
local json_full=$( aws --profile herokles ssm get-parameters --name /${PROJECT}/${ENV} )
if [[ ! -z $( echo "$json_full" | jq -r '.InvalidParameters | .[]' ) ]] ; then
echo "Missing environment variables paramater ${PROJECT}-${ENV}"
exit 1
fi
echo "secrets:" > herokles/helm/values-envs.yaml
local json=$( echo "$json_full" | jq -r '.Parameters | .[] | .Value' )
echo "$json" | jq . >/dev/null || {
echo "Formatting error in AWS Parameter store environment variables."
exit 1
}
local key val
for key in $( echo "$json" | jq -r 'keys[]' ) ; do
val=$( echo "$json" | jq .$key )
if [[ $val == true ]] || [[ $val == false ]] || [[ $val =~ ^[0-9]+$ ]] ; then
val=\"$val\"
fi
echo " ${key}: ${val}" >> herokles/helm/values-envs.yaml
done
if [[ ! -d ~/.kube ]] && [[ -z ${KUBECONFIG:-} ]] ; then
echo "Setting up kubectl and heml"
installHelm
mkdir -p ~/.kube
echo "$HEROKLES_KUBECONFIG_BASE64" | base64 -d > ~/.kube/config
chmod 400 ~/.kube/config
fi
if [[ -f herokles/install.sh ]] ; then
echo "Install custom deployment"
source ./herokles/install.sh
fi
echo "Install Helm deployment"
rollback_on_fail pending
helm upgrade --install --wait --timeout ${HEROKLES_HELM_TIMEOUT:-3m1s} \
-n ${PROJECT} \
${HELM_DEPLOYMENT} \
${HELM_DIRECTORY:-herokles/helm} \
-f herokles/helm/values-envs.yaml \
--set DEPLOYMENT_TIME=$DEPLOYMENT_TIME \
--set DEPLOY_SCRIPT_VERSION=$DEPLOY_SCRIPT_VERSION \
--set ENV=$ENV \
--set BRANCH=$BRANCH \
--set SHA=$SHA \
--set PROJECT=$PROJECT \
--set HEROKLES_AWS_REGION=$HEROKLES_AWS_REGION \
--set HEROKLES_AWS_S3_BUILDS_BUCKET=$HEROKLES_AWS_S3_BUILDS_BUCKET \
--set HEROKLES_AWS_S3_BUILDS_FOLDER=$HEROKLES_AWS_S3_BUILDS_FOLDER \
--set BASE_VERSION=$BASE_VERSION \
--set LANG_VERSION=$NODE_VERSION \
|| {
echo "Helm deploymet failed"
rollback_on_fail failed
exit 1
}
}
main "$@"