Jenkins

[Jenkins] Setup Lockable Resource

thxxyj 2022. 11. 14. 10:57
728x90

1. Download Lockable Resource Plugin

https://www.jenkins.io/doc/pipeline/steps/lockable-resources/#lockable-resources-plugin

 

2. Jenkins Setting

Jenkins 관리 > 시스템 설정 > Lockable Resources 

  • Name: Jenkins에 등록한 노드 이름으로 저장
  • Labels: 같은 특징을 가진 노드 구분용으로 사용
  • 하나의 resource에 대해 공백(space)으로 구분하면 여러개의 label을 등록할 수 있음

 

ex) projectA, projectB, projectC 중 하나라도 일치하면, 해당 job이 node101을 lock 하게됨

 

3. Pipeline Script 작성하기

https://github.com/jenkinsci/lockable-resources-plugin/blob/master/src/doc/examples/scripted-vs-declarative-pipeline.md

 

3-1. Scripted Pipeline

def nodeMapping = [
    "projectA"   : "labelA_${TEST_TYPE}",
    "projectB"   : "labelB_${TEST_TYPE}",
    "projectC"   : "labelC_${TEST_TYPE}",
]
NODE_LABEL = nodeMapping[TARGET_PROJECT]

node("master") {
    lock(label: NODE_LABEL, quantity: 1, variable: "node") {
        TARGET_NODE = env.node
        echo "target node: ${TARGET_NODE}"
        stage("lock-check") {
            def lockingJob = build(
                job: 'lock-check',
                parameters: [
                    string(name: 'TARGET_NODE', value: "${TARGET_NODE}"),
                    string(name: 'TARGET_PROJECT', value: "${TARGET_PROJECT}")
                ]
            )
            lockingBuildUrl = lockingJob.getAbsoluteUrl()
            lockingBuildResult = lockingJob.getCurrentResult()
            echo "build url: ${lockingBuildUrl}"
            echo "build result: ${lockingBuildResult}"
        }
    }
}

3-2. Declarative Pipeline

def nodeMapping = [
    "projectA"   : "labelA_${TEST_TYPE}",
    "projectB"   : "labelB_${TEST_TYPE}",
    "projectC"   : "labelC_${TEST_TYPE}",
]
NODE_LABEL = nodeMapping[TARGET_PROJECT]

pipeline{
agent {label {"master"}}
    stages {
        stage('lock-check') {
            steps {
                lock(resource: null, label: NODE_LABEL, quantity: 1, variable: "node") {
                    script {
                        TARGET_NODE = env.node
                        echo "target node: ${TARGET_NODE}"
                        lockingJob = build(
                            job: 'lock-check',
                            parameters: [
                                string(name: 'TARGET_NODE', value: "${TARGET_NODE}"),
                                string(name: 'TARGET_PROJECT', value: "${TARGET_PROJECT}")
                            ]
                        )      
                        lockingBuildUrl = lockingJob.getAbsoluteUrl()
                        lockingBuildResult = lockingJob.getCurrentResult()
                        echo "build url: ${lockingBuildUrl}"
                        echo "build result: ${lockingBuildResult}"
                    }
                }
            }
        }
    }
}

 

Declarative pipeline에서 resource lock을 label 기준으로 하더라도 "resource:null을" 포함해야한다.

ex) lock(resource: null, label: TARGET_NODE_LABEL)

 

포함하지 않으면 아래와 같은 에러 발생

declarative pipeline bug 라고 한다.. https://issues.jenkins.io/browse/JENKINS-43002

 


728x90