Automatisches Rollback implementieren
Verwenden Sie Skripte, um das automatische Rollback zu implementieren, wenn ein Apply-Job in Resource Manager nicht erfolgreich verläuft. Bei automatischen Rollback-Skripten werden Jobfehler überwacht und eine Rollback-Prozedur definiert, die Validierung, benutzerdefinierte Trigger und Aktionen umfasst.
In Produktionsumgebungen ist eine robuste und flexible Bereitstellungsstrategie unerlässlich. Eine gängige Best Practice besteht darin, OCI Resource Manager in ein Continuous Integration/Continuous Delivery-(CI/CD-)System zu integrieren, um den gesamten Deployment-Lebenszyklus zu verwalten – einschließlich des automatischen Rollbacks.
Oracle Cloud Infrastructure (OCI) bietet eine native CI/CD-Plattform mit vollem Funktionsumfang: OCI DevOps. Dieser Service stellt die erforderlichen Tools und Pipelines bereit, um Deployment-, Test-, Monitoring- und Rollbackvorgänge nahtlos zu orchestrieren.
Automatisches Rollback-Skript
Um Ihnen den Einstieg zu erleichtern, haben wir das folgende Bash-Beispielskript bereitgestellt, das in einer OCI-Deployment-Pipeline DevOps verwendet werden kann. Dieses Skript zeigt einen Mechanismus für das automatische Rollback eines OCI Resource Manager-Stacks bei einem Deployment-Fehler.
Das Skript dient als Ausgangspunkt, den Sie an Ihre spezifischen Anforderungen anpassen können, um sicherzustellen, dass es den individuellen Anforderungen Ihrer Deployment-Workflows entspricht.
version: 0.1
component: command
timeoutInSeconds: 600
shell: bash
steps:
- type: Command
name: "Deployment Runner Functionality"
command: |
# The STACK_OCID variable is externally injected and remains unescaped.
STACK_OCID="${STACK_OCID}"
echo "Starting Resource Manager Apply Job for Stack: ${STACK_OCID}"
# 1. Create the Apply Job and capture its OCID.
job_id=$(
oci resource-manager job create-apply-job \
--execution-plan-strategy AUTO_APPROVED \
--display-name "DevOps-Apply-$(date +%s)" \
--stack-id "${STACK_OCID}" \
--wait-for-state 'ACCEPTED' \
--query 'data.id' \
--raw-output \
)
# Check if the job creation command returned a valid ID
if [ -z "$job_id" ]; then
echo "ERROR: Failed to create Resource Manager Apply job or command failed."
exit 1
fi
echo "Resource Manager Job OCID: $job_id"
# 2. Polling Loop to monitor job status
max_poll_time_seconds=600 # 10 minutes maximum wait time
poll_interval_seconds=10
elapsed_time=0
while [ $elapsed_time -le $max_poll_time_seconds ]; do
# Get the current job status.
status=$(
oci resource-manager job get \
--job-id "$job_id" \
--query 'data."lifecycle-state"' \
--raw-output \
)
echo "Time Elapsed: ${elapsed_time}s / ${max_poll_time_seconds}s - Current Job Status: $status"
if [ "$status" == "SUCCEEDED" ]; then
echo "Resource Manager Apply Job SUCCEEDED."
exit 0 # Success exit code
elif [ "$status" == "FAILED" ] || [ "$status" == "CANCELED" ]; then
echo "Resource Manager Apply Job FAILED or CANCELED."
# Check failure reason and conditionally trigger rollback
if [ "$status" == "FAILED" ]; then
# Fetch failure code
failure_code=$(
oci resource-manager job get \
--job-id "$job_id" \
--query 'data."failure-details".code' \
--raw-output \
)
if [ -z "$failure_code" ]; then
echo "No failure-details.code found in job output (field is empty or missing)"
echo "==== Full job JSON output for debugging: ===="
oci resource-manager job get \
--job-id "$job_id" \
else
echo "Failure code: $failure_code"
fi
if [ "$failure_code" == "TERRAFORM_EXECUTION_ERROR" ]; then
echo "Detected Terraform configuration error. Starting automatic rollback process..."
# Define a rollback function
automatic_rollback() {
# List all jobs, filter for successful Apply jobs, sort by time-created desc, and get latest job OCID
# Part 1: Fetch and count all succeeded APPLY jobs
matched_jobs=$(
oci resource-manager job list \
--stack-id "$STACK_OCID" \
--query 'data[?operation==`APPLY` && "lifecycle-state"==`SUCCEEDED`] | sort_by(@, &`"time-created"`)' \
)
job_count=$(echo "$matched_jobs" | jq 'length')
echo "Number of matching jobs found: $job_count"
# Part 2: Extract and print first OCID if any
last_succeeded_apply_job_ocid=$(echo "$matched_jobs" | jq -r '.[0].id // empty')
if [ -n "$last_succeeded_apply_job_ocid" ]; then
echo "Last succeeded apply job OCID: $last_succeeded_apply_job_ocid"
else
echo "No previous successful apply jobs found. Rollback skipped."
return 0
fi
echo "Invoking OCI CLI to create rollback job for OCID: $last_succeeded_apply_job_ocid"
oci resource-manager job create \
--from-json "{\"stackId\":\"${STACK_OCID}\",\"displayName\":\"DevOps-Apply-Rollback-$(date +%s)\",\"jobOperationDetails\":{\"operation\":\"APPLY_ROLLBACK\",\"executionPlanRollbackStrategy\":\"AUTO_APPROVED\",\"targetRollbackJobId\":\"$last_succeeded_apply_job_ocid\"}}" \
echo "======Apply Rollback Job Creation Complete========="
}
# Call the rollback function
automatic_rollback
fi
fi
exit 1 # Failure exit code
fi
# Wait before polling again
sleep $poll_interval_seconds
let "elapsed_time = elapsed_time + poll_interval_seconds"
done
# If the loop finished without SUCCEEDED or FAILED status
echo "Error: Resource Manager Apply Job timed out after ${max_poll_time_seconds} seconds."
exit 1Die im Skript implementierte automatische Rollback-Logik umfasst die folgenden Schritte:
- Deployment initiieren: Erstellen Sie einen Apply-Job, um die aktualisierte Terraform-Konfiguration bereitzustellen.
- Deployment-Status überwachen: Überwachen Sie den Status des Apply-Jobs kontinuierlich: Siehe Details eines Jobs abrufen.
- Fehler bewerten: Wenn der Apply-Job nicht erfolgreich verläuft, bewerten Sie vordefinierte Kriterien, um zu bestimmen, ob ein automatisches Rollback ausgelöst werden soll.
- Stabilen Status identifizieren: Rufen Sie die erfolgreichen Apply-Jobs für den Stack ab, und bestimmen Sie den Zieljob, zu dem Sie zurückrollen möchten: Siehe Jobs auflisten.
- Trigger-Rollback: Erstellen Sie einen Apply-Rollback-Job, um den Stack in den zuvor stabilen Status wiederherzustellen.