はじめに
こんにちは株式会社TIELECのタカシユウトです。この記事ではJenkinsのRemote access APIについて紹介します。Remote access APIを使うことで、ジョブやビルドの情報をプログラムから取得できます。
Remote access API
https://wiki.jenkins.io/display/JA/Remote+access+API
もっとも初期からあると思われるAPIです。
具体的には次のようなことができます。
- プログラムでJenkinsから情報を取得する
- 新しいビルドを起動する
- ジョブの作成、コピー といったことができます。
使い方としては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冊でしっかり身につく本

コメント