YOGYUI

Jenkins::Pipeline - Slave node 오프라인 시 Stage 무시하기 본문

Software/Etc

Jenkins::Pipeline - Slave node 오프라인 시 Stage 무시하기

요겨 2023. 2. 8. 12:40
반응형

Jenkin Pipeline- Skip stage when slave node (agent) is offline

소스코드 빌드(build) 및 배포(release) 자동화 툴로 Jenkins를 유용하게 사용하고 있다

바이너리 빌드나 Unit Test를 master 노드가 아닌 다른 환경 (리눅스 환경 등)에서 진행해야 할 경우가 있는데, Pipeline에서 slave node 이름 기반으로 다음과 같이 구축해서 사용하고 있었다

pseudo-script

pipeline {
    agent any
    environment {
        SLAVE_NODE_NAME = "slave_node"
    }
    stages {
        stage('Build') {
            parallel {
                stage('Master') {
                    steps { ... }
                }
                stage('Slave') {
                    agent { label "${env.SLAVE_NODE_NAME}" }
                    steps { ... }
                }
            }
        }
    }
}

 

그런데, slave node가 offline (장비 전원이 꺼졌거나, 네트워크 연결이 끊어졌거나 등)되었을 경우 slave node에서 돌아가는 stage가 자동으로 무시되지 않고 slave가 연결될 때까지 무한 대기하게 되는 문제를 최근에 발견했다... (무지성이 이렇게나 무서운 겁니다)

 

timeout 등의 옵션을 줘도 되겠지만, step별로 timeout 파라미터를 다르게 설정하는 것도 귀찮고 해서 다른 방법을 찾아보니, pipeline에서 nodesByLabel 함수를 호출하면 특정 이름을 가진 노드를 배열(array)로 반환해준다고 한다!

https://www.jenkins.io/doc/pipeline/steps/pipeline-utility-steps

 

가이드를 따라 위의 pipeline 스크립트를 다음과 같이 수정해봤다 

pipeline {
    agent any
    environment {
        SLAVE_NODE_NAME = "slave_node"
    }
    stages {
        stage('Build') {
            parallel {
                stage('Master') {
                    steps { ... }
                }
                stage('Slave') {
                    when {
                        beforeAgent true
                        expression {
                            return nodesByLabel(env.SLAVE_NODE_NAME).size() > 0
                        }
                    }
                    agent { label "${env.SLAVE_NODE_NAME}" }
                    steps { ... }
                }
            }
        }
    }
}

when 문을 추가해서 slave node에서의 작업 수행 이전에 nodesByLabel 함수 리턴 배열의 크기가 0 이상인지를 확인해서 slave node가 online 상태인지를 체크할 수 있게 해줬다

 

slave node를 offline으로 만들어준 뒤 task를 실행해보니 'Slave' 스테이지가 무난하게 무시(skip)되는 것을 확인할 수 있었다~ Good!

끝~!

 

[Reference]

https://stackoverflow.com/questions/38231871/skip-jenkins-pipeline-steps-if-node-is-offline

반응형