Skip to content

Commit d0d16f9

Browse files
Fix issue to resolve ConfigMap values (#518)
* chore: don't stop on failed deployments * fix: resolve values from ConfigMap * fix: apply startup command defined in docker-compose.yml * fix: use args as this is used in k8s instead of CMD
1 parent 2643d97 commit d0d16f9

1 file changed

Lines changed: 79 additions & 4 deletions

File tree

ci/deploy-k8s-aws/scripts/deploy-services.sh

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ extract_image_info() {
7070
# $3 - Ports (JSON array)
7171
# $4 - Environment variables (JSON object)
7272
# $5 - Environment file reference (from docker-compose)
73+
# $6 - Command (string or JSON array)
7374
#
7475
# Output:
7576
# deployment-${service_name}.yaml
@@ -80,6 +81,7 @@ create_deployment_yaml() {
8081
local ports=$3
8182
local env_vars=$4
8283
local env_file=$5
84+
local command=$6
8385

8486
echo "Generating deployment manifest for $service_name..."
8587

@@ -109,6 +111,23 @@ spec:
109111
imagePullPolicy: $([ "${image##*:}" == "latest" ] && echo "Always" || echo "IfNotPresent")
110112
EOF
111113

114+
# Add command as args if defined (docker-compose command -> k8s args)
115+
if [ ! -z "$command" ] && [ "$command" != "null" ]; then
116+
echo " args:" >> "deployment-${service_name}.yaml"
117+
# Check if command is a JSON array or a string
118+
if echo "$command" | jq -e 'type == "array"' >/dev/null 2>&1; then
119+
# Command is an array
120+
echo "$command" | jq -r '.[]' | while read -r cmd_part; do
121+
echo " - \"$cmd_part\"" >> "deployment-${service_name}.yaml"
122+
done
123+
else
124+
# Command is a string - split by spaces or use as single entry
125+
cmd_str=$(echo "$command" | jq -r '.')
126+
# For a simple string command like "start", add it as a single array element
127+
echo " - \"$cmd_str\"" >> "deployment-${service_name}.yaml"
128+
fi
129+
fi
130+
112131
# Add container ports if defined
113132
if [ ! -z "$ports" ] && [ "$ports" != "null" ]; then
114133
echo " ports:" >> "deployment-${service_name}.yaml"
@@ -131,7 +150,32 @@ EOF
131150
# Add specific environment variables if defined in docker-compose
132151
if [ "$env_vars" != "null" ] && [ "$env_vars" != "{}" ]; then
133152
echo " env:" >> "deployment-${service_name}.yaml"
134-
echo "$env_vars" | jq -r 'to_entries | .[] | " - name: " + .key + "\n value: \"" + (.value | tostring) + "\""' >> "deployment-${service_name}.yaml"
153+
154+
# Process each environment variable
155+
echo "$env_vars" | jq -r 'to_entries | .[]' | jq -c '.' | while read -r entry; do
156+
key=$(echo "$entry" | jq -r '.key')
157+
value=$(echo "$entry" | jq -r '.value // ""')
158+
159+
# Check if value is a variable reference like ${VAR_NAME}
160+
if [[ "$value" =~ ^\$\{([^}]+)\}$ ]]; then
161+
# Extract the ConfigMap key name (remove ${ and })
162+
configmap_key="${BASH_REMATCH[1]}"
163+
164+
# Use valueFrom to reference the ConfigMap key
165+
cat >> "deployment-${service_name}.yaml" << EOF
166+
- name: $key
167+
valueFrom:
168+
configMapKeyRef:
169+
name: app-config
170+
key: $configmap_key
171+
optional: true
172+
EOF
173+
else
174+
# Use literal value (for non-variable-reference values)
175+
echo " - name: $key" >> "deployment-${service_name}.yaml"
176+
echo " value: \"$value\"" >> "deployment-${service_name}.yaml"
177+
fi
178+
done
135179
fi
136180

137181
echo "✓ Deployment manifest created: deployment-${service_name}.yaml"
@@ -202,6 +246,9 @@ EOF
202246
# Initialize processed services tracker
203247
> processed_services.txt
204248

249+
# Initialize failed deployments tracker
250+
> failed_deployments.txt
251+
205252
# Get list of current deployments in namespace
206253
echo "Fetching current deployments in namespace $NAMESPACE..."
207254
kubectl get deployments -n "$NAMESPACE" -o json 2>/dev/null | jq -r '.items[].metadata.name' > current_deployments.txt || touch current_deployments.txt
@@ -219,6 +266,7 @@ cat services.json | jq -c '.' | while read -r service; do
219266
ports=$(echo "$service" | jq -c '.ports')
220267
env_vars=$(echo "$service" | jq -c '.environment')
221268
env_file=$(echo "$service" | jq -c '.env_file')
269+
command=$(echo "$service" | jq -c '.command')
222270

223271
echo ""
224272
echo "===================================================================="
@@ -247,7 +295,8 @@ cat services.json | jq -c '.' | while read -r service; do
247295
echo "✓ Deployment updated successfully"
248296
else
249297
echo "✗ Deployment rollout failed or timed out"
250-
exit 1
298+
echo " ⚠ Continuing with remaining deployments..."
299+
echo "$name|update-timeout" >> failed_deployments.txt
251300
fi
252301
else
253302
echo "✓ Image is up to date, no action needed"
@@ -256,7 +305,7 @@ cat services.json | jq -c '.' | while read -r service; do
256305
echo "⚡ Deployment '$name' does not exist, creating new deployment..."
257306

258307
# Create deployment manifest
259-
create_deployment_yaml "$name" "$image" "$ports" "$env_vars" "$env_file"
308+
create_deployment_yaml "$name" "$image" "$ports" "$env_vars" "$env_file" "$command"
260309

261310
# Apply deployment
262311
kubectl apply -f "deployment-${name}.yaml"
@@ -275,7 +324,8 @@ cat services.json | jq -c '.' | while read -r service; do
275324
echo "✓ Deployment is ready"
276325
else
277326
echo "✗ Deployment failed to become ready"
278-
exit 1
327+
echo " ⚠ Continuing with remaining deployments..."
328+
echo "$name|create-timeout" >> failed_deployments.txt
279329
fi
280330
fi
281331

@@ -287,3 +337,28 @@ echo ""
287337
echo "===================================================================="
288338
echo "All services from docker-compose.yml have been processed"
289339
echo "===================================================================="
340+
341+
# Check for failed deployments
342+
if [ -s failed_deployments.txt ]; then
343+
echo ""
344+
echo "⚠ WARNING: Some deployments encountered issues:"
345+
echo ""
346+
while IFS='|' read -r service reason; do
347+
case "$reason" in
348+
update-timeout)
349+
echo " - $service: Update rollout timed out"
350+
;;
351+
create-timeout)
352+
echo " - $service: New deployment failed to become ready"
353+
;;
354+
esac
355+
done < failed_deployments.txt
356+
echo ""
357+
echo "These services were deployed but may not be fully operational."
358+
echo "Check the verification step for current status."
359+
echo ""
360+
else
361+
echo ""
362+
echo "✓ All deployments completed successfully"
363+
echo ""
364+
fi

0 commit comments

Comments
 (0)