流れとしてはこんな感じ。
- APIで前回の成功テストのリビジョンを取得
-
git dif --stat --name-only
でファイルの一覧を取得する
CirleCIのAPIで前回の成功テストの情報を取得する
GET: /project/:vcs-type/:username/:project
Build summary for each of the last 30 builds for a single git repo.
CircleCI REST API - CircleCI (https://circleci.com/docs/api/#summary) より
これを使えば最近成功したテストの情報を取得できそうです。cURLで最も新しい成功したテストAPIで取得してみます。circle-tokenは事前に https://circleci.com/account/api で作成しておきました。
$ curl 'https://circleci.com/api/v1.1/project/github/PROJECT/REPOSITORY?circle-token=MASKMASKMASKMASKMASKMASKMASKMASKMASK&limit=1&offset=0&filter=completed'
次のようなレスポンスが返されます。
[
{
"compare": "https://github.com/MASKMASK/MASK/compare/9849be5efbe1...b31f4f224547",
"previous_successful_build": null,
"build_parameters": null,
"oss": true,
"all_commit_details_truncated": false,
"committer_date": "2016-09-23T00:17:41+09:00",
"body": "",
"usage_queued_at": "2016-09-22T15:17:58.886Z",
"fail_reason": null,
"retry_of": null,
"reponame": "MASK",
"ssh_users": [],
"build_url": "https://circleci.com/gh/MASKMASK/MASK/5",
"parallel": 1,
"failed": null,
"branch": "master",
"username": "MASKMASK",
"author_date": "2016-09-23T00:17:41+09:00",
"why": "github",
"user": {
"is_user": false,
"login": "MASKMASK",
"vcs_type": "github"
},
"vcs_revision": "b31f4f2245476f5f834049ad1bd70557f4b8ef8b",
"vcs_tag": null,
"build_num": 5,
"infrastructure_fail": false,
"committer_email": "test@example.com",
"previous": {
"build_num": 2,
"status": "failed",
"build_time_millis": 14155
},
"status": "no_tests",
"committer_name": "MASKMASK",
"retries": null,
"subject": "update readme",
"vcs_type": "github",
"timedout": false,
"dont_build": null,
"lifecycle": "finished",
"no_dependency_cache": false,
"stop_time": "2016-09-22T15:18:08.591Z",
"ssh_disabled": false,
"build_time_millis": 18472,
"circle_yml": null,
"messages": [],
"is_first_green_build": false,
"job_name": null,
"start_time": "2016-09-22T15:17:50.119Z",
"canceler": null,
"all_commit_details": [
{
"committer_date": "2016-09-23T00:17:41+09:00",
"body": "",
"branch": "master",
"author_date": "2016-09-23T00:17:41+09:00",
"committer_email": "test@example.com",
"commit": "b31f4f2245476f5f834049ad1bd70557f4b8ef8b",
"committer_login": "MASKMASK",
"committer_name": "MASKMASK",
"subject": "update readme",
"commit_url": "https://github.com/MASKMASK/MASK/commit/b31f4f2245476f5f834049ad1bd70557f4b8ef8b",
"author_login": "MASKMASK",
"author_name": "MASKMASK",
"author_email": "test@example.com"
}
],
"outcome": "no_tests",
"vcs_url": "https://github.com/MASKMASK/MASK",
"author_name": "MASKMASK",
"node": null,
"queued_at": "2016-09-22T15:17:50.037Z",
"canceled": false,
"author_email": "test@example.com"
}
]
取れていますね。
(追記: 2017年 1月28日)
最も新しい成功したテストAPIで取得する https://circleci.com/api/v1.1/:project/github/:PROJECT/:REPOSITORY のAPIはPersonal API Token(アカウントに紐付くAPIトークン)ではなく、API Permission(リポジトリに紐付くAPIトークン)でも取得できます。API Permissionの場合はスコープをBuild Artifacts(view-builds)以上にする必要があります。Personal API Tokenでは他のリポジトリに対しても権限を与えることになるので、API Permissionの方が適切な場合が多いです。
(追記ここまで)
APIのレスポンスから当時使われたリビジョン番号を取得する
先ほどのレスポンスを見るとvcs_revisionがあってこれがgitのリビジョンになっているようです。jqを使ってリビジョン番号だけ取得してみます。
$ cat response.json | jq .[0].vcs_revision
"b31f4f2245476f5f834049ad1bd70557f4b8ef8b"
取得できていそうです。
Gitで差分のあったファイルの一覧を取得する
git diff --stat --name-only dce394e22941ebc4ef9c3cb6988b0bd2c12ec668...
src/qiitap/__init__.py
src/qiitap/articles.py
src/qiitap/commands/render.py
circle.ymlにまとめる
deployment:
production:
branch: master
commands:
- curl 'https://circleci.com/api/v1.1/project/github/TakesxiSximada/TIL?circle-token=$CIRCLE_TOKEN&limit=1&offset=0&filter=completed' | jq -r .[0].vcs_revision > PREV_REVISION
- git diff --stat --name-only `cat PREV_REVISION`...