LoginSignup
5
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-23

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

  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) より

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

img

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を使ってリビジョン番号だけ取得してみます。

レスポンスから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にまとめる

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1