【Jenkins】Remote access API でジョブ情報を取得する

CI/CD

はじめに

こんにちは株式会社TIELECのタカシユウトです。この記事ではJenkinsのRemote access APIについて紹介します。Remote access APIを使うことで、ジョブやビルドの情報をプログラムから取得できます。

Remote access API

https://wiki.jenkins.io/display/JA/Remote+access+API

もっとも初期からあると思われるAPIです。

具体的には次のようなことができます。

  1. プログラムでJenkinsから情報を取得する
  2. 新しいビルドを起動する
  3. ジョブの作成、コピー といったことができます。

使い方としてはURLの後ろに /api/json とつければ 色々情報が取れますというもの。

フォルダの情報取得

以下のページからdecrative-pipelineという名称のフォルダより情報を取得してみます。 http://jenkins.tielec.blog:8080/job/decrative-pipeline/


APIで情報を取得します。 http://jenkins.tielec.blog:8080/job/decrative-pipeline/api/json

見やすいように整形したものがこちらです。

Jsonをクリックで展開します

{ 
   "_class":"com.cloudbees.hudson.plugins.folder.Folder",
   "actions":[ 
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 
         "_class":"com.cloudbees.plugins.credentials.ViewCredentialsAction"
      }
   ],
   "description":"repository: https://github.com/sakamaki-y123/jenkins-continuous-delivery",
   "displayName":"decrative-pipeline",
   "displayNameOrNull":null,
   "fullDisplayName":"decrative-pipeline",
   "fullName":"decrative-pipeline",
   "name":"decrative-pipeline",
   "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/",
   "healthReport":[ 
      { 
         "description":"Worst health: decrative-pipeline » 07_read_json: Build stability: 3 out of the last 5 builds failed.",
         "iconClassName":"icon-health-20to39",
         "iconUrl":"health-20to39.png",
         "score":40
      }
   ],
   "jobs":[ 
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"01_hello_world",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/01_hello_world/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"02_use_sh_step",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/02_use_sh_step/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"03_write_file",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"04_archive_artifacts",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/04_archive_artifacts/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"05_clean_workspace",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/05_clean_workspace/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"06_copy_artifacts",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/06_copy_artifacts/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"07_read_json",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/07_read_json/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"08_parallel_step",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/08_parallel_step/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"09_agent_docker",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/09_agent_docker/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"10_use_multiple_docker",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/10_use_multiple_docker/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"11_read_and_write_yaml",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/11_read_and_write_yaml/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"12_input_request",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/12_input_request/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"13_conditional_run_stage",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/13_conditional_run_stage/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"14_run_ansible",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/14_run_ansible/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"15_use_shared_library",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/15_use_shared_library/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"16_use_global_variables",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/16_use_global_variables/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"17_nested_stage",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/17_nested_stage/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"18_matrix_build",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/18_matrix_build/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"19_random_kitten_generator",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/19_random_kitten_generator/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"20_search_youtube_video",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/20_search_youtube_video/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"21_amazon_translator",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/21_amazon_translator/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"22_download_hot_bokete_images",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/22_download_hot_bokete_images/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"23_download_random_kitten_images",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/23_download_random_kitten_images/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"24_download_beautiful_landscape-video",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/24_download_beautiful_landscape-video/",
         "color":"blue"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
         "name":"25_upload_artifact_to_dropbox",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/25_upload_artifact_to_dropbox/",
         "color":"blue"
      }
   ],
   "primaryView":{ 
      "_class":"hudson.model.AllView",
      "name":"all",
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/"
   },
   "views":[ 
      { 
         "_class":"hudson.model.AllView",
         "name":"all",
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/"
      }
   ]
}

フォルダ内にあるジョブのURLや名前などが確認できてきます。

ジョブの情報取得

続いて、03_write_file のジョブの情報を取得してみます。 http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/


APIで情報を取得してみます。 http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/api/json

Jsonをクリックで展開します

{ 
   "_class":"org.jenkinsci.plugins.workflow.job.WorkflowJob",
   "actions":[ 
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 
         "_class":"com.cloudbees.plugins.credentials.ViewCredentialsAction"
      }
   ],
   "description":"03_write_file",
   "displayName":"03_write_file",
   "displayNameOrNull":null,
   "fullDisplayName":"decrative-pipeline » 03_write_file",
   "fullName":"decrative-pipeline/03_write_file",
   "name":"03_write_file",
   "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/",
   "buildable":true,
   "builds":[ 
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
         "number":17,
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
         "number":16,
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/16/"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
         "number":15,
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/15/"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
         "number":14,
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/14/"
      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
         "number":13,
         "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/13/"
      }
   ],
   "color":"blue",
   "firstBuild":{ 
      "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
      "number":13,
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/13/"
   },
   "healthReport":[ 
      { 
         "description":"Build stability: No recent builds failed.",
         "iconClassName":"icon-health-80plus",
         "iconUrl":"health-80plus.png",
         "score":100
      }
   ],
   "inQueue":false,
   "keepDependencies":false,
   "lastBuild":{ 
      "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
      "number":17,
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/"
   },
   "lastCompletedBuild":{ 
      "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
      "number":17,
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/"
   },
   "lastFailedBuild":null,
   "lastStableBuild":{ 
      "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
      "number":17,
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/"
   },
   "lastSuccessfulBuild":{ 
      "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
      "number":17,
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/"
   },
   "lastUnstableBuild":null,
   "lastUnsuccessfulBuild":null,
   "nextBuildNumber":18,
   "property":[ 
      { 
         "_class":"hudson.model.ParametersDefinitionProperty",
         "parameterDefinitions":[ 
            { 
               "_class":"hudson.model.TextParameterDefinition",
               "defaultParameterValue":{ 
                  "_class":"hudson.model.StringParameterValue",
                  "name":"OUTPUT_TEXT",
                  "value":""
               },
               "description":"",
               "name":"OUTPUT_TEXT",
               "type":"TextParameterDefinition"
            }
         ]
      },
      { 
         "_class":"com.coravy.hudson.plugins.github.GithubProjectProperty"
      }
   ],
   "queueItem":null,
   "concurrentBuild":true,
   "resumeBlocked":false
}

ビルドの実行履歴などの情報が取得できています。

ビルド結果の情報取得

続いて最新の実行結果に関する情報を取得してみます。このときの最新のビルド番号は17でした。 http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/


APIでの取得結果はこちら http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/api/json

Jsonをクリックで展開します

{ 
   "_class":"org.jenkinsci.plugins.workflow.job.WorkflowRun",
   "actions":[ 
      { 
         "_class":"hudson.model.CauseAction",
         "causes":[ 
            { 
               "_class":"hudson.model.Cause$UpstreamCause",
               "shortDescription":"Started by upstream project "decrative-pipeline/08_parallel_step" build number 9",
               "upstreamBuild":9,
               "upstreamProject":"decrative-pipeline/08_parallel_step",
               "upstreamUrl":"job/decrative-pipeline/job/08_parallel_step/"
            }
         ]
      },
      { 

      },
      { 
         "_class":"hudson.model.ParametersAction",
         "parameters":[ 
            { 
               "_class":"hudson.model.TextParameterValue",
               "name":"OUTPUT_TEXT",
               "value":"hoge hoge"
            }
         ]
      },
      { 
         "_class":"hudson.plugins.git.util.BuildData",
         "buildsByBranchName":{ 
            "refs/remotes/origin/master":{ 
               "_class":"hudson.plugins.git.util.Build",
               "buildNumber":17,
               "buildResult":null,
               "marked":{ 
                  "SHA1":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
                  "branch":[ 
                     { 
                        "SHA1":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
                        "name":"refs/remotes/origin/master"
                     }
                  ]
               },
               "revision":{ 
                  "SHA1":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
                  "branch":[ 
                     { 
                        "SHA1":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
                        "name":"refs/remotes/origin/master"
                     }
                  ]
               }
            }
         },
         "lastBuiltRevision":{ 
            "SHA1":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
            "branch":[ 
               { 
                  "SHA1":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
                  "name":"refs/remotes/origin/master"
               }
            ]
         },
         "remoteUrls":[ 
            "https://github.com/sakamaki-y123/jenkins-continuous-delivery.git"
         ],
         "scmName":""
      },
      { 
         "_class":"hudson.plugins.git.GitTagAction"
      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.cps.EnvActionImpl"
      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 

      },
      { 
         "_class":"org.jenkinsci.plugins.pipeline.modeldefinition.actions.RestartDeclarativePipelineAction"
      },
      { 

      },
      { 
         "_class":"org.jenkinsci.plugins.workflow.job.views.FlowGraphAction"
      },
      { 

      },
      { 

      },
      { 

      }
   ],
   "artifacts":[ 

   ],
   "building":false,
   "description":null,
   "displayName":"#17",
   "duration":47339,
   "estimatedDuration":18597,
   "executor":null,
   "fullDisplayName":"decrative-pipeline » 03_write_file #17",
   "id":"17",
   "keepLog":false,
   "number":17,
   "queueId":84830,
   "result":"SUCCESS",
   "timestamp":1567136586337,
   "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/17/",
   "changeSets":[ 
      { 
         "_class":"hudson.plugins.git.GitChangeSetList",
         "items":[ 
            { 
               "_class":"hudson.plugins.git.GitChangeSet",
               "affectedPaths":[ 
                  "pipeline/decrative-pipeline/pipeline_19_random_kitten_generator.groovy"
               ],
               "commitId":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
               "timestamp":1565431885000,
               "author":{ 
                  "absoluteUrl":"http://jenkins.tielec.blog:8080/user/noreply",
                  "fullName":"noreply"
               },
               "authorEmail":"noreply@github.com",
               "comment":"Update pipeline_19_random_kitten_generator.groovyn",
               "date":"2019-08-10 19:11:25 +0900",
               "id":"2ae5f87662481e3cedaf98b9b6faa64e4e8e0a7f",
               "msg":"Update pipeline_19_random_kitten_generator.groovy",
               "paths":[ 
                  { 
                     "editType":"edit",
                     "file":"pipeline/decrative-pipeline/pipeline_19_random_kitten_generator.groovy"
                  }
               ]
            }
         ],
         "kind":"git"
      }
   ],
   "culprits":[ 
      { 
         "absoluteUrl":"http://jenkins.tielec.blog:8080/user/noreply",
         "fullName":"noreply"
      }
   ],
   "nextBuild":null,
   "previousBuild":{ 
      "number":16,
      "url":"http://jenkins.tielec.blog:8080/job/decrative-pipeline/job/03_write_file/16/"
   }
}

ビルドの実行結果や、実行時間、上流のジョブなど、より詳細な情報を取得できています。

まとめ

この記事では、JenkinsのAPIを使ってジョブの情報を取得する方法について紹介しました。APIを活用することで、Jenkinsの情報をプログラムから取得したり、自動化を進めることができます。

おすすめ書籍

[

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[

Jenkins

[

サーバ/インフラエンジニアの基本がこれ1冊でしっかり身につく本

コメント

タイトルとURLをコピーしました