Implementando o Rollback Automático
Use scripts para implementar rollback automático quando um job de aplicação falhar no Resource Manager. Os scripts de rollback automáticos envolvem o monitoramento de falhas de job e a definição de um procedimento de rollback que inclui validação, acionadores personalizados e ações.
Em ambientes de produção, é essencial estabelecer uma estratégia de implantação robusta e flexível. Uma prática recomendada comum é integrar o OCI Resource Manager a um sistema de Integração Contínua/Entrega Contínua (CI/CD) para gerenciar todo o ciclo de vida da implantação, incluindo rollback automático.
A Oracle Cloud Infrastructure (OCI) oferece uma plataforma de CI/CD nativa e totalmente equipada: OCI DevOps. Esse serviço fornece as ferramentas e os pipelines necessários para orquestrar perfeitamente as operações de implantação, teste, monitoramento e rollback.
Script de reversão automática
Para ajudar você a começar, fornecemos a seguinte amostra de script Bash, que pode ser usada em um pipeline de implantação do OCI DevOps. Este script demonstra um mecanismo para fazer rollback automaticamente de uma pilha do OCI Resource Manager no caso de uma falha na implantação.
O script serve como um ponto de partida que você pode personalizar para atender às suas necessidades específicas, garantindo que ele se alinhe às necessidades exclusivas dos seus fluxos de trabalho de implantação.
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 1A lógica de reversão automática implementada no script inclui as seguintes etapas:
- Iniciar Implantação: Crie um job de aplicação para implantar a configuração atualizada do Terraform.
- Monitorar Status da Implantação: monitore continuamente o status do job de aplicação: Consulte Obtendo Detalhes de um Job.
- Avaliar Falha: Se o job de aplicação falhar, avalie critérios predefinidos para determinar se um rollback automático deve ser acionado.
- Identificar Estado Estável: recupera os jobs de aplicação bem-sucedidos da pilha e determina o job de destino para o qual você deseja fazer rollback: Consulte Listando Jobs.
- Rollback do Trigger: Crie um job de rollback de aplicação para restaurar a pilha para o estado estável anteriormente.