Groovy 스크립트를 사용하여 Jenkins 파이프라인을 통해 지연 시간 25분으로 애플리케이션을 5번 다시 시작하는 방법

Groovy 스크립트를 사용하여 Jenkins 파이프라인을 통해 지연 시간 25분으로 애플리케이션을 5번 다시 시작하는 방법

Groovy 스크립트를 사용하여 각 시작 사이에 25분의 지연을 두고 총 5회 jenkins 파이프라인을 통해 애플리케이션을 다시 시작할 수 있습니까?

//service update command need to execute..
stage('haproxy restart') {
   script{
 sh '''
docker service update --force abc-haproxy-${qa_env}-haproxy //5 times need to execute, delay between restart is 25 minutes.
  '''}

답변1

사이에 지연을 두고 5번만 반복했다면, 중간에 절전 모드를 사용하면서 명령을 5번만 반복하세요.

//service update command need to execute..
stage('haproxy restart') {
  script{
    sh '''
      docker service update --force abc-haproxy-${qa_env}-haproxy
      sleep 25m
      docker service update --force abc-haproxy-${qa_env}-haproxy
      sleep 25m
      docker service update --force abc-haproxy-${qa_env}-haproxy
      sleep 25m
      docker service update --force abc-haproxy-${qa_env}-haproxy
      sleep 25m
      docker service update --force abc-haproxy-${qa_env}-haproxy
    '''}

Gnu 수면은 25m25분으로 이해됩니다. 전부는 아니지만 대부분의 다른 수면에는 숫자(문자가 없는 경우)가 초로 표시됩니다. 시스템의 절전 모드가 문자를 인식하지 못하는 경우 60초에 25분을 곱하여 해당 숫자를 사용하십시오.

이렇게 하면 전체 명령이 전체 시간 동안 차단됩니다(따라서 최소 4 x 25분 + docker 명령에 소요되는 시간). 또한 Jenkins에 대한 경험이 거의 없습니다. 이것이 다른 파이프라인에 해로운지는 모르겠습니다.


지연에 대하여

마지막 반품부터 다음 출시까지 지연이 있나요? 아니면 마지막 부팅부터 다음 부팅까지 지연이 있습니까?

명령(이 경우 docker)이 몇 초만 소요된다면 문제가 되지 않습니다. 그러나 명령에 몇 분이 걸리면 추가 시간을 처리해야 합니다.

예를 들어 docker 명령이 약 5분 정도 소요되는 경우입니다. 그런 다음 첫 번째 부팅부터 5분의 Docker 실행 시간이 주어지고 다음 부팅까지 25분의 절전 시간이 제공됩니다. 실행부터 실행까지 총 30분이 소요됩니다. 위의 코드를 통해 얻은 장면입니다.

또는 docker가 5분 동안 실행된 경우 20분 동안만 절전 모드로 전환되어 시작부터 다음 시작까지의 총 시간은 25분이 됩니다. 다행스럽게도 이는 쉘 코드로 구현하는 것이 매우 간단합니다.

//service update command need to execute..
stage('haproxy restart') {
  script{
    sh '''
      docker service update --force abc-haproxy-${qa_env}-haproxy &
      sleep 25m
      wait
      docker service update --force abc-haproxy-${qa_env}-haproxy &
      sleep 25m
      wait
      docker service update --force abc-haproxy-${qa_env}-haproxy &
      sleep 25m
      wait
      docker service update --force abc-haproxy-${qa_env}-haproxy &
      sleep 25m
      wait
      docker service update --force abc-haproxy-${qa_env}-haproxy
    '''}

&끝에 있는 앰퍼샌드( )는 docker 명령이 백그라운드에서 실행되도록 합니다. 그 결과 절전 모드가 "즉시" 실행되기 시작하고 최대 절전 모드가 docker 명령과 동시에 시작됩니다. docker 명령에 5분이 걸리는 경우 sleep은 5분 동안 절전 모드로 유지되었으며 마지막 시작 이후 총 25분 동안 20분 동안 계속 절전 모드로 전환됩니다.

운영 체제 장부 관리 등으로 인해 항상 약간의 마이크로초 지연이 있기 때문에 "즉시"가 따옴표로 묶여 있습니다. 그러나 25분간 자고 5회만 반복하면 무시해도 될 정도입니다.

마지막 docker 명령에는 명령이 제대로 완료될 때까지 기다리고 싶기 때문에 & 기호가 없습니다(따라서 배경도 없습니다). 그렇지 않으면 마지막 docker 명령이 (백그라운드에서) 계속 실행 중이더라도 jenkins는 단계가 완료된 것으로 간주할 수 있습니다. 다시 말하지만 저는 Jenkins에 대한 경험이 거의 없기 때문에 복잡한 세부 사항을 모릅니다.

wait 명령을 사용하면 sh는 다음 명령을 계속하기 전에 백그라운드 프로세스가 완료될 때까지 기다리게 됩니다. 효과적으로 앰퍼샌드를 취소합니다. 따라서 docker 명령이 25분 이상 걸리고 절전 모드가 완료되면 sh는 다음 명령을 시작하기 전에 docker 명령이 반환될 때까지 기다립니다.

그렇지 않으면 기다릴 필요가 없습니다. docker 명령이 25분 이상 소요되면 절전 모드가 완료되고 다음 docker 명령이 아직 실행 중인 docker 명령과 병렬로 시작됩니다. docker 명령을 병렬로 실행하면 시스템 리소스가 고갈될 수 있으므로 불만이 생길 수 있습니다.


보너스:

코드 중복을 줄이기 위해 명령을 쉘 함수에 넣을 수 있습니다.

//service update command need to execute..
stage('haproxy restart') {
  script{
    sh '''
      dodocker() {
        docker service update --force abc-haproxy-$1-haproxy
      }
      dodocker ${qa_env}
      sleep 25m
      dodocker ${qa_env}
      sleep 25m
      dodocker ${qa_env}
      sleep 25m
      dodocker ${qa_env}
      sleep 25m
      dodocker ${qa_env}
    '''}

반복 횟수의 유연성을 높이기 위해 루프를 작성할 수 있습니다.

//service update command need to execute..
stage('haproxy restart') {
  script{
    sh '''
      dodocker() {
        docker service update --force abc-haproxy-$1-haproxy
      }
      seq ${repeat} | while read _ ; do
        dodocker ${qa_env}
        sleep 25m
      done
      dodocker ${qa_env}
    '''}

마지막 dodocker 반복은 그 이후에는 잠자기 상태가 아니므로 루프에 포함되지 않으므로 반복을 1 이하로 설정하십시오.

인간 친화적인 로그 출력을 위해 절전 단계를 설정할 수 있습니다.

//service update command need to execute..
stage('haproxy restart') {
  script{
    sh '''
      dodocker() {
        docker service update --force abc-haproxy-$1-haproxy
      }
      seq ${repeat} | while read r ; do
        echo "repeat number $r"
        dodocker ${qa_env}
        seq ${delay} | while read d ; do
          echo "delay minute $d"
          sleep 1m
        done
      done
      dodocker ${qa_env}
    '''}

이렇게 하면 로그 파일을 따라가며 프로세스가 얼마나 실행되었는지 확인할 수 있습니다. 결국 25분씩 4번을 하면 거의 2시간이 됩니다.

관련 정보