JenkinsJobの情報を取得する

#はじめに
jobの実行状況(しっかり動いているか、成功しているか)を監視できるような仕組みを作る必要があり、
備忘のため、そういった情報をjenkinsの基本的なディレクトリ構成から取得方法までをまとめました。


#Jenkinsの基本的なディレクトリ構成
jenkinsのホームディレクトリは`/var/lib/jenkins`に設定されます。
各jobは配下のjobsにjob名ごとにディレクトリが存在しています。

/var/lib/jenkins/jobs/${JOB_NAME}
　├ **config.xml**
　├ builds/
　　├${BUILD_NUMBER}/
　　　　├ **build.xml**
　　　　├ changelog.xml
　　　　├ log
       
各jobの設定ファイルは`${JENKINS_HOME}/jobs/${JOB_NAME}/config.xml`に配置されます。
ここの`config.xml`または`jenkinsコンソール`を編集することでjobの設定を変更することが可能です。

各jobのbuildごとの実行情報は`${JENKINS_HOME}/jobs/${JOB_NAME}/builds/${BUILD_NUMBER}/build.xml`に保存されます。

#job情報 config.xml
`config.xml`には下記の情報などが記載されます。
・jobの説明
・jobのデフォルト有効化フラグ
・実行されるスクリプト
(設定がある場合)
・上流job
・必要とされるパラメータ情報
・トリガー/実行タイミング(crontab形式で設定)
・過去のbuildの保存日数/保存最大数
　　などなど・・・

#Build情報　build.xml
`build.xml`には下記の情報などが記載されます。
・登録時間
・開始時間
・実行結果
・実行時間
・作業ディレクトリ情報
(設定がある場合)
・パラメータ情報
　　などなど・・・

#job/build情報の取得
###取得方法
jenkinsサーバからであれば上記のxmlファイルを参照することで基本的な情報を取得することは可能です。
他のサーバからアクセスする場合や、より詳細な情報を取得する際にはそのためのAPIが用意されています。

取得方法・取得可能情報について解説します。

**API実行の基本文法**

```sh
#jenkins内のjob一覧取得
 curl -X POST http://${JENKINS_HOST}/jenkins/api/json　
#jenkinsのjob情報取得
 curl -X POST http://${JENKINS_HOST}/jenkins/job/${JOB_NAME}/api/json
#対象jobのbuild番号別情報取得
 curl -X POST http://${JENKINS_HOST}/jenkins/job/${JOB_NAME}/${BUILD_NUMBER}/api/json
```
${JENKINS_HOST}の部分を自身(localhost:8080)に変更することでそのサーバ自身の情報取得も可能です。
結果はjsonで返ってきますが、最後の`json`部分をxmlにすることでxml形式でも取得可能です。

###取得可能情報
※各種結果class,プロパティは[jenkins公式](https://javadoc.jenkins-ci.org/hudson/model/Result.html)を参照

実行コマンド

```sh
#jenkins内のjob一覧取得
 curl -X POST http://${JENKINS_HOST}/jenkins/api/json
```

<details><summary>結果sample1</summary><div>

```json

{
  "_class": "hudson.model.Hudson",
  "assignedLabels": [
    {
      "name": "master"
    }
  ],
  "mode": "NORMAL",
  "nodeDescription": "the master Jenkins node",
  "nodeName": "",
  "numExecutors": 3,
  "description": null,
  "jobs": [
    {
      "_class": "hudson.model.FreeStyleProject",
      "name": "job1",
      "url": "http://${JENKINS_HOST}/jenkins/job/job1/",
      "color": "blue"
    },
    {
      "_class": "hudson.model.FreeStyleProject",
      "name": "job2",
      "url": "http://${JENKINS_HOST}/jenkins/job/job1/",
      "color": "disabled"
    },
    {
      "_class": "hudson.model.FreeStyleProject",
      "name": "job3",
      "url": "http://${JENKINS_HOST}/jenkins/job/job1/",
      "color": "blue_anime"
    }
  ],
  "overallLoad": {},
  "primaryView": {
    "_class": "hudson.model.AllView",
    "name": "all",
    "url": "http://${JENKINS_HOST}/"
  },
  "quietingDown": false,
  "slaveAgentPort": -1,
  "unlabeledLoad": {
    "_class": "jenkins.model.UnlabeledLoadStatistics"
  },
  "useCrumbs": false,
  "useSecurity": false
}
```

</div></details>


実行コマンド

```sh
#jenkinsのjob情報取得
 curl -X POST http://${JENKINS_HOST}/jenkins/job/${JOB_NAME}/api/json
```

<details><summary>結果sample2</summary><div>

```json
{
  "_class": "hudson.model.FreeStyleProject",
  "actions": [
    {
      "_class": "com.cloudbees.plugins.credentials.ViewCredentialsAction"
    }
  ],
  "description": "ここにはjobの説明",
  "displayName": "jobの表示名",
  "displayNameOrNull": null,
  "fullDisplayName": "job名の表示フルテキスト",
  "fullName": "job名のフルテキスト",
  "name": "jobの名前",
  "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/",
  "buildable": false,
  "builds": [
    {
      "_class": "hudson.model.FreeStyleBuild",
      "number": 1,
      "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/"
    }
  ]
  "color": "disabled",
  "firstBuild": {
    "_class": "hudson.model.FreeStyleBuild",
    "number": 1,
    "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/"
  },
  "healthReport": [
    {
      "description": "Build stability: No recent builds failed.",
      "iconClassName": "icon-health-80plus",
      "iconUrl": "health-80plus.png",
      "score": 100
    }
  ],
  "inQueue": false,
  "keepDependencies": false,
  "lastBuild": {
    "_class": "hudson.model.FreeStyleBuild",
    "number": 1,
    "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/"
  },
  "lastCompletedBuild": {
    "_class": "hudson.model.FreeStyleBuild",
    "number": 1,
    "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/"
  },
  "lastFailedBuild": null,
  "lastStableBuild": {
    "_class": "hudson.model.FreeStyleBuild",
    "number": 1,
    "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/"
  },
  "lastSuccessfulBuild": {
    "_class": "hudson.model.FreeStyleBuild",
    "number": 1,
    "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/"
  },
  "lastUnstableBuild": null,
  "lastUnsuccessfulBuild": null,
  "nextBuildNumber": 2,
  "property": [],
  "queueItem": null,
  "concurrentBuild": false,
  "downstreamProjects": [],
  "labelExpression": null,
  "scm": {
    "_class": "hudson.scm.NullSCM"
  },
  "upstreamProjects": []
}
  
```
</div></details>

実行コマンド

```sh
#対象jobのbuild番号別情報取得
 curl -X POST http://${JENKINS_HOST}/jenkins/job/${JOB_NAME}/${BUILD_NUMBER}/api/json
```

<details><summary>結果sample3</summary><div>

```json

{
  "_class": "hudson.model.FreeStyleBuild",
  "actions": [
    {
      "_class": "hudson.model.CauseAction",
      "causes": [
        {
          "_class": "hudson.model.Cause$UserIdCause",
          "shortDescription": "Started by user anonymous",
          "userId": null,
          "userName": "anonymous"
        }
      ]
    }
  ],
  "artifacts": [],
  "building": false,
  "description": null,
  "displayName": "#1",
  "duration": 100,
  "estimatedDuration": 100,
  "executor": null,
  "fullDisplayName": "job1 #1",
  "id": "1",
  "keepLog": false,
  "number": 1,
  "queueId": 1,
  "result": "SUCCESS",
  "timestamp": 1575005659380,
  "url": "http://${JENKINS_HOST}/jobs/${JOB_NAME}/1/",
  "builtOn": "",
  "changeSet": {
    "_class": "hudson.scm.EmptyChangeLogSet",
    "items": [],
    "kind": null
  },
  "culprits": []
}
```
</div></detail>

<br>

また下記のように、より詳細な情報を取得するにはdepthパラメータを付与することで詳細階層を指定できます。
値の数値を大きくすればするほど詳細なレスポンスを取得できます。

```sh
#jenkins内のjob一覧取得 depth=1
 curl -X POST http://${JENKINS_HOST}/jenkins/api/json?depth=1
```

#おまけ　APIの結果をより見やすく
[jqコマンド](https://stedolan.github.io/jq/)を利用するとAPIの結果をより見やすく整形・取得してくれます。

###jobのURLを取得する例

```sh
#APIの実行結果をjob.txtに格納
curl-X POST http://${JENKINS_HOST}/jenkins/api/json > job.txt
#結果sample1から1つめのjobのURLを取得
cat job.txt | jq .jobs[1].url
```
結果

```
"http://${JENKINS_HOST}/jenkins/job/job1/"
```




#参考
[JenkinsAPIでジョブ情報を取得する](https://qiita.com/tamikura@github/items/033ab9180561b6232509)
[jqコマンドを使う日常のご紹介](https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af)