У меня есть шаг развертывания в моей сборке Jenkins, который выполняется внутри контейнера docker. На этапе развертывания выполняется применение терраформ. См. Код ниже:
развертывание. sh
#!/usr/bin/env bash
terraform init
terraform workspace new test || true
terraform workspace select test
terraform apply -auto-approve
Jenkinsfile
#!/usr/bin/env groovy
node {
def buildContainer = docker.build("test-image")
// checkout and test / build code here
stage("deploy") {
buildContainer.inside {
sh "./deploy.sh"
}
}
// rest of the pipeline
}
Я развертываю внутри облачных распределений с помощью terraform, что может занять до 20 минут , В идеале, если кто-то остановит сборку Jenkins на этапе развертывания, тогда развертывание terraform сможет изящно закрыть и записать состояние в удаленную корзину s3, в противном случае мне придется вручную согласовывать состояние.
То, что я на самом деле вижу, - это время выполнения задания terraform, получающего два прерывания в быстрой последовательности, означающее, что оно не записывает данные в файл состояния. Код выхода - 143.
То, что я пробовал:
- Оборачивание кода внутри этапа развертывания в groovy try catch. Но это все равно заставляет сценарий развертывания внезапно останавливаться
- Использование прерываний для SIGTERM в развертывании. sh код, чтобы вызовы terraform не отвечали на SIGTERM
- Запись python кода для переноса terraform вызывает и перехватывает все сигналы (кроме SIGKILL)
Пример вывода из Jenkins при остановке сборки:
Deploying stack 'test'
Two interrupts received. Exiting immediately. Note that data loss may have occurred.
Error: operation canceled
script returned exit code 143
Как лучше всего справиться с этим случаем ?