[04] declarative pipeline の使用例 -- 成果物を登録する


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/52a393aee1ba57999196|


## 概要

Slave 8台から空いている Slave を選択して、コマンド「hostname」を実行する.
この結果を result.txt に書き出して Jenkins の成果物として登録する例である.
**次の 1, 2, 3 と実装を進め、4 で成果物を登録する.**

[1. Slave は実行時に一時ディレクトリ「/tmp/hoge/」でコマンド hostname を実行する](#1-slave-は実行時に一時ディレクトリtmphogeでコマンド-hostname-を実行する)
[2. 作成した一時ディレクトリ「/tmp/hoge/」を削除する](#2-作成した一時ディレクトリtmphogeを削除する)
[3. コマンド hostname の結果を result.xt に書き出す](#3-コマンド-hostname-の結果を-resultxt-に書き出す)
[4. Jenkins ジョブの成果物として result.txt を登録する](#4-jenkins-ジョブの成果物として-resulttxt-を登録する)

なお、使用した Jenkins バージョンは Jenkins 2.314 である.


## 環境

下記で構築した Master(1台) - Slave(8台) [SSH通信] を使って Pipeline を書いてみる. 
(OS は Linux である)

・[[シリーズ] docker-compose を使って同一物理マシン上に Jenkins Master(docker) - Slave(docker) [SSH通信]を構築する](https://qiita.com/robozushi10/items/80bfd9934500b458b831)


## コード

### 1. Slave は実行時に一時ディレクトリ「/tmp/hoge/」でコマンド hostname を実行する

`dir('/tmp/hgoe'){ 〜 }` と書くと、自動的にディレクトリを作成してくれる.
なお、カレントディレクトリを確認するために `pwd()` を呼び出している.

```groovy
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 を削除するようにする.

が、<font color="red">私は (ミスしたときが心配なため) deleteDir() は使用していない...</font>

**`mktemp -d -p ベースディレクトリ` によって自前で一時的な作業場を準備している.**

```bash
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 を使うと次のようになる.
なお、下記の場合は上書き作成である.

```groovy
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」

```groovy
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
                }
            }
        }
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/832809d0-a396-cc41-822c-30b26e1bdd4d.png)

　

## 参考にしたサイト

・https://stackoverflow.com/questions/48068733/create-a-temporary-directory-for-specific-steps-in-jenkins-pipeline
・[Udemy Jenkins Begginer To Pro](https://www.udemy.com/course/jenkins-masterclass/)


以上