本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/52a393aee1ba57999196 |
概要
Slave 8台から空いている Slave を選択して実行する例.
次のパターンを書き残しておく.
Jenkins バージョンは Jenkins 2.314 である.
1. 単に実行するだけ
2. どの Slave(node) で実行しているか表示する
3. 選択された Node によって処理を変える(1)
4. 選択された Node によって処理を変える(2)
環境
下記で構築した Master(1台) - Slave(8台) [SSH通信] を使って Pipeline を書いてみる.
(OS は Linux である)
・[シリーズ] docker-compose を使って同一物理マシン上に Jenkins Master(docker) - Slave(docker) [SSH通信]を構築する
コード
各 Slave でコマンド「hostname」を実行して「sleep 120」するジョブ.
1. 単に実行するだけ
文字列の中で「||
」を使ってノードを定義してやる.
そして、連続してジョブを実行すると、各 Slave に割り振られる動作が見られる.
また、特定の Slave の同時実行数を 2 や 3 にしてやると、並列実行していることも見られる.
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage ("stage-1") {
steps {
sh "hostname ; sleep 120"
}
}
}
}
2. どの Slave(node) で実行しているか表示する
declarative 組込みコマンドの echo を使ってログ表示させる.
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage('setup') {
steps {
script {
NODENAME = "${env.NODE_NAME}"
}
}
}
stage ("stage-1") {
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 120"
}
}
}
}
3. 選択された Node によって処理を変える(1)
ここでは sleep の待機時間を変えている.
が、条件分岐が長い. (改善は次の 4 で行う)
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage('setup') {
steps {
script {
NODENAME = "${env.NODE_NAME}"
}
}
}
stage ("stage for slave001") {
when {
expression {
NODENAME == 'slave001'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 101"
}
}
stage ("stage for slave002") {
when {
expression {
NODENAME == 'slave002'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 102"
}
}
stage ("stage for slave003") {
when {
expression {
NODENAME == 'slave003'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 103"
}
}
stage ("stage for slave004") {
when {
expression {
NODENAME == 'slave004'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 104"
}
}
stage ("stage for slave005") {
when {
expression {
NODENAME == 'slave005'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 105"
}
}
stage ("stage for slave006") {
when {
expression {
NODENAME == 'slave006'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 106"
}
}
stage ("stage for slave007") {
when {
expression {
NODENAME == 'slave007'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 107"
}
}
stage ("stage for slave008") {
when {
expression {
NODENAME == 'slave008'
}
}
steps {
echo "「${NODENAME}」で実行します."
sh "hostname ; sleep 108"
}
}
}
}
4. 選択された Node によって処理を変える(2)
Map型変数(いわゆるハッシュ) を使って、ノード名とパラメータ(sleep秒数)を定義しておく.
なお、ブロック内で変数に def
を定義するとローカル変数になり、異なる stage からは参照できなくなる.
stage 名に変数を使うためには、
stages/stage/steps/script/stage
という青文字 の階層で stage を使わないといけない. (違っていたら指摘ください)
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage('setup') {
steps {
script {
NODENAME = "${env.NODE_NAME}"
Map MAP_N_S = [ // N_S is node and seconds
'slave001': '101',
'slave002': '102',
'slave003': '103',
'slave004': '104',
'slave005': '105',
'slave006': '106',
'slave007': '107',
'slave008': '108',
]
SLEEP_SEC = MAP_N_S[NODENAME]
}
}
}
stage('stage-1') {
steps {
script {
stage ("stage for ${NODENAME}") {
script {
echo "「${NODENAME}」で実行します. 待機秒数は ${SLEEP_SEC} です."
sh "hostname ; sleep ${SLEEP_SEC}"
}
}
}
}
}
}
}
参考サイト