Skip to content

Commit bf90232

Browse files
committed
Add retry logic to the deploy-api stage
1 parent 5b6457a commit bf90232

1 file changed

Lines changed: 33 additions & 29 deletions

File tree

.github/scripts/deploy_api.sh

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
11
#!/usr/bin/env bash
22
set -eu pipefail
33

4+
invoke_lambda_with_retry() {
5+
local function_name="$1"
6+
local payload_file="$2"
7+
local max_attempts=3
8+
local delay=30
9+
10+
for attempt in $(seq 1 "$max_attempts"); do
11+
echo "Invoking ${function_name} (attempt ${attempt} of ${max_attempts})"
12+
aws lambda invoke --function-name "${function_name}" --cli-binary-format raw-in-base64-out --payload "file://${payload_file}" out.txt > response.json
13+
14+
if ! eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
15+
return 0
16+
fi
17+
18+
echo "Error calling lambda (attempt ${attempt} of ${max_attempts})"
19+
cat out.txt
20+
21+
if [ "$attempt" -lt "$max_attempts" ]; then
22+
echo "Retrying in ${delay} seconds..."
23+
sleep "$delay"
24+
fi
25+
done
26+
27+
echo "Lambda ${function_name} failed after ${max_attempts} attempts"
28+
return 1
29+
}
30+
431
echo "API type: ${API_TYPE}"
532
echo "Specification path: ${SPEC_PATH}"
633
echo "Specification version: ${VERSION_NUMBER}"
@@ -31,7 +58,7 @@ put_secret_lambda=lambda-resources-ProxygenPTLMTLSSecretPut
3158
instance_put_lambda=lambda-resources-ProxygenPTLInstancePut
3259
spec_publish_lambda=lambda-resources-ProxygenPTLSpecPublish
3360

34-
if [[ "$APIGEE_ENVIRONMENT" =~ ^(int|sandbox|prod)$ ]]; then
61+
if [[ "$APIGEE_ENVIRONMENT" =~ ^(int|sandbox|prod)$ ]]; then
3562
put_secret_lambda=lambda-resources-ProxygenProdMTLSSecretPut
3663
instance_put_lambda=lambda-resources-ProxygenProdInstancePut
3764
spec_publish_lambda=lambda-resources-ProxygenProdSpecPublish
@@ -71,7 +98,7 @@ if [[ "${IS_PULL_REQUEST}" == "true" ]]; then
7198
jq '."x-nhsd-apim".temporary = true' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
7299
fi
73100

74-
# Find and replace the specification version number
101+
# Find and replace the specification version number
75102
jq --arg version "${VERSION_NUMBER}" '.info.version = $version' "${SPEC_PATH}" > temp.json && mv temp.json "${SPEC_PATH}"
76103

77104
# Find and replace the x-nhsd-apim.target.url value
@@ -138,12 +165,7 @@ if [[ "${ENABLE_MUTUAL_TLS}" == "true" ]]; then
138165
--arg proxygenSecretName "${proxygen_private_key_arn}" \
139166
'{apiName: $apiName, environment: $environment, secretName: $secretName, secretKey: $secretKey, secretCert: $secretCert, kid, $kid, proxygenSecretName: $proxygenSecretName}' > payload.json
140167

141-
aws lambda invoke --function-name "${put_secret_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json
142-
if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
143-
echo 'Error calling lambda'
144-
cat out.txt
145-
exit 1
146-
fi
168+
invoke_lambda_with_retry "${put_secret_lambda}" payload.json
147169
echo "Secret stored successfully"
148170

149171
else
@@ -163,13 +185,7 @@ if [[ "${DRY_RUN}" == "false" ]]; then
163185
--arg proxygenSecretName "${proxygen_private_key_arn}" \
164186
'{apiName: $apiName, environment: $environment, specDefinition: $spec, instance: $instance, kid: $kid, proxygenSecretName: $proxygenSecretName}' > payload.json
165187

166-
aws lambda invoke --function-name "${instance_put_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json
167-
168-
if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
169-
echo 'Error calling lambda'
170-
cat out.txt
171-
exit 1
172-
fi
188+
invoke_lambda_with_retry "${instance_put_lambda}" payload.json
173189
echo "Instance deployed"
174190
else
175191
echo "Would call ${instance_put_lambda}"
@@ -187,13 +203,7 @@ if [[ "${APIGEE_ENVIRONMENT}" == "int" ]]; then
187203
--arg proxygenSecretName "${proxygen_private_key_arn}" \
188204
'{apiName: $apiName, environment: $environment, specDefinition: $spec, instance: $instance, kid: $kid, proxygenSecretName: $proxygenSecretName}' > payload.json
189205

190-
aws lambda invoke --function-name "${spec_publish_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json
191-
192-
if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
193-
echo 'Error calling lambda'
194-
cat out.txt
195-
exit 1
196-
fi
206+
invoke_lambda_with_retry "${spec_publish_lambda}" payload.json
197207
echo "Spec deployed"
198208
else
199209
echo "Would call ${spec_publish_lambda}"
@@ -212,13 +222,7 @@ if [[ "${APIGEE_ENVIRONMENT}" == "internal-dev" && "${IS_PULL_REQUEST}" == "fals
212222
--arg proxygenSecretName "${proxygen_private_key_arn}" \
213223
'{apiName: $apiName, environment: $environment, specDefinition: $spec, instance: $instance, kid: $kid, proxygenSecretName: $proxygenSecretName}' > payload.json
214224

215-
aws lambda invoke --function-name "${spec_publish_lambda}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt > response.json
216-
217-
if eval "cat response.json | jq -e '.FunctionError' >/dev/null"; then
218-
echo 'Error calling lambda'
219-
cat out.txt
220-
exit 1
221-
fi
225+
invoke_lambda_with_retry "${spec_publish_lambda}" payload.json
222226
echo "Spec deployed"
223227
else
224228
echo "Would call ${spec_publish_lambda}"

0 commit comments

Comments
 (0)