Jenkins Decrarative Pipeline에서 stage를 배열 정의

복수 환경을 관리하고 있는 경우 등에, 「모든 환경에 대해서 처리를 실시하고 싶다」라고 하는 경우가 있습니다.

환경마다 하나씩 처리를 실행하는 것은 번거롭다.
Pipeline에서 stage별 처리를 반복해서 쓰는 것은 귀찮습니다.
루프 처리로 실시해 버리고 싶네요.

하고 싶은 일



이런 처리입니다.
예로서 복수 리전에서 처리를 하는 케이스를 들고 있습니다.
pipeline {
    agent any
    stages{
        stage('ap-northeast-1') {
            steps{
                script{
                    echo "ap-northeast-1 の処理"
                }
            }
        }
        stage('us-east-1') {
            steps{
                script{
                    echo "us-east-1 の処理"
                }
            }
        }
    }
}

script의 내용에, 리전명만 바꾸어 몇번이나 같은 것을 쓰는 것은 귀찮거나 합니다.

배열의 Loop



다음과 같이 작성하여 변경할 부분을 변수화할 수 있습니다.
pipeline {
    agent any
    stages{
        stage('Prepare'){
            steps{
                script{
                    env_list = ["ap-northeast-1","us-east-1"]

                    env_list.each { region -> 
                        stage(region) {
                            echo "${region} の処理"
                        }
                    }
                }
            }
        }
    }
}

실행 화면은 다음과 같습니다.

Prepare Stage에서 다른 stage를 감싸고 있습니다.
이것에 의해, 배열을 전개하는 Groovy 처리를 기술할 수 있게 되어 있습니다.

어레인지 버전



map 이용



맵을 이용할 수도 있습니다.
stage마다 변동시키고 싶은 값이 2개 있을 때 편리합니다.
script{
    env_map = [
        "ap-northeast-1": "tokyo",
        "us-east-1": "virsinia"
    ]

    env_map.each { region -> 
        stage(region.key) {
            echo "${region.value} の処理"
        }
    }
}

실행 화면은 다음과 같습니다.


Parameters에서 파라미터 전환



stage에 들어가기 전에 script를 사이에 두는 것으로,
if 분기 등으로 Stage 내의 내용을 조정하는 것도 가능합니다.
pipeline {
  agent any
  parameters {
      choice(name: 'Cloud', choices: 'aws\ngcp', description: '説明')
  }
  stages{
    stage('Prepare'){
      steps{
        script{
          if (params.Cloud == 'aws'){
            env_map = [
              "tokyo": "ap-northeast-1",
              "virsinia": "us-east-1"
            ]                    
          } else if (params.Cloud == 'gcp'){
            env_map = [
              "tokyo": "asia-northeast1",
              "virsinia": "us-east4"
            ]
          }

          env_map.each { region -> 
            stage(region.key) {
              echo "${region.value} の処理"
            }
          }
        }
      }
    }
  }
}

마지막으로



Jenkins Decrarative Pipeline에서 stae를 배열로 정의하는 방법을 소개했습니다.
여러 환경으로부터의 정보 수집, 복수 환경에의 배포 등으로 활용할 수 있다고 생각합니다.

확인을 위해 Jenkins는 2.183, 플러그인은 처음 시작할 때 권장되는 것만 사용했습니다.

좋은 웹페이지 즐겨찾기