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 작성하기
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
'Jenkins' 카테고리의 다른 글
[Jenkins] check element in groovy array/hash/collection/list (0) | 2022.11.16 |
---|---|
[Jenkins] stage skip 하기 (when, if) (0) | 2022.11.16 |
Jenkins 설치하기 (Ubuntu) (0) | 2022.10.11 |
Jenkins - GitHub Webhooks 설정하기 (0) | 2022.10.10 |
Jenkins - GitHub 연동하기 (0) | 2022.10.10 |