CircleCIで前回成功したテストから今回のテストまでに更新されたファイルの一覧を取得する

<!---


--->

流れとしてはこんな感じ。

1. APIで前回の成功テストのリビジョンを取得
2. `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)](https://circleci.com/docs/api/#summary) より

これを使えば最近成功したテストの情報を取得できそうです。cURLで最も新しい成功したテストAPIで取得してみます。circle-tokenは事前に https://circleci.com/account/api で作成しておきました。

![img](https://github.com/TakesxiSximada/TIL/raw/master/circleci/difference-files/img/circleci-api-token.png)

```sh:cURLで最も新しい成功したテスト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を使ってリビジョン番号だけ取得してみます。


```sh:レスポンスからrevisionを取得する
$ 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にまとめる


```yaml: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`...

```