Обработка остановки работы Jenkins, когда развернута середина Terraform - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть шаг развертывания в моей сборке 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

Как лучше всего справиться с этим случаем ?

...