本シリーズのトップページ |
---|
https://qiita.com/robozushi10/items/52a393aee1ba57999196 |
概要
Slave 8台から空いている Slave を選択して、コマンド「hostname」を実行する.
この結果を result.txt に書き出して Jenkins の成果物として登録する例である.
次の 1, 2, 3 と実装を進め、4 で成果物を登録する.
1. Slave は実行時に一時ディレクトリ「/tmp/hoge/」でコマンド hostname を実行する
2. 作成した一時ディレクトリ「/tmp/hoge/」を削除する
3. コマンド hostname の結果を result.xt に書き出す
4. Jenkins ジョブの成果物として result.txt を登録する
なお、使用した Jenkins バージョンは Jenkins 2.314 である.
環境
下記で構築した Master(1台) - Slave(8台) [SSH通信] を使って Pipeline を書いてみる.
(OS は Linux である)
・[シリーズ] docker-compose を使って同一物理マシン上に Jenkins Master(docker) - Slave(docker) [SSH通信]を構築する
コード
1. Slave は実行時に一時ディレクトリ「/tmp/hoge/」でコマンド hostname を実行する
dir('/tmp/hgoe'){ 〜 }
と書くと、自動的にディレクトリを作成してくれる.
なお、カレントディレクトリを確認するために pwd()
を呼び出している.
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage ("stage-1") {
steps {
dir('/tmp/hoge'){
// 現在、/tmp/hoge に居ることをログ表示させる.
println(pwd())
echo "NODE: ${env.NODE_NAME}"
sh "hostname"
}
}
}
}
}
2. 作成した一時ディレクトリ「/tmp/hoge/」を削除する
上記 1 の記述だと、/tmp/hoge/ ディレクトリが残ってしまう.
そこで作業が済んだら、/tmp/hoge を削除するようにする.
が、私は (ミスしたときが心配なため) deleteDir() は使用していない...
mktemp -d -p ベースディレクトリ
によって自前で一時的な作業場を準備している.
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage ("stage-1") {
steps {
dir('/tmp/hoge'){
// 現在、/tmp/hoge に居ることをログ表示させる.
println(pwd())
echo "NODE: ${env.NODE_NAME}"
sh "hostname"
// 現在居る /tmp/hoge ディレクトリを削除する
deleteDir()
}
}
}
}
}
3. コマンド hostname の結果を result.xt に書き出す
個人的には「hostname > result.txt」で済ませてしまいたいが、
真面目に Pipeline declarative の関数 writeFile を使うと次のようになる.
なお、下記の場合は上書き作成である.
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage ("stage-1") {
steps {
dir('/tmp/hoge'){
echo "NODE: ${env.NODE_NAME}"
script {
BUFF = sh (
script: "hostname",
returnStdout: true
).trim()
writeFile file: 'result.txt', text: BUFF
}
}
}
}
}
}
4. Jenkins ジョブの成果物として result.txt を登録する
次のように
「archiveArtifacts artifacts: 'result.txt', followSymlinks: false
」
というコードを書くと、下図の通り成果物として result.txt が登録される.
Slave 側で生成したファイルが、Master 上に次のように配置されているので便利である.
「/var/jenkins_home/jobs/sample/builds/119/archive/result.txt」
pipeline {
agent {label 'slave001 || slave002 || slave003 || slave004 || slave005 || slave006 || slave007 || slave008'}
stages {
stage ("stage-1") {
steps {
dir('/tmp/hoge'){
println(pwd())
echo "NODE: ${env.NODE_NAME}"
script {
BUFF = sh (
script: "hostname",
returnStdout: true
).trim()
writeFile file: 'result.txt', text: BUFF
}
archiveArtifacts artifacts: 'result.txt', followSymlinks: false
}
}
}
}
}
参考にしたサイト
・https://stackoverflow.com/questions/48068733/create-a-temporary-directory-for-specific-steps-in-jenkins-pipeline
・Udemy Jenkins Begginer To Pro
以上