結論から書くと、cronあたりで定期的にAPIを叩けばよいです。

CircleCIの定期実行に関して調べるとNightly buildsを使うこちらの記事とかが検索でてきます。「Nightly builds」もドキュメントを読んだ感じではすぐできそうだけども、そんなんじゃなくてcurlあたりで1行でAPI叩いてビルドしたい。と思いました。

というわけでCircleCI REST APIを参考にしながらやってみました。

APIのトークン作成


プロジェクトのセッティングから「API Permissinos」を選択。

次に「Create token」でスコープ「All」を選択します。「All」じゃないとAPI叩いた時に権限不足でビルドできません。

作成したTokenを控えます。

APIをたたく


curlでPOSTリクエストを送ります。

1
curl -X POST https://circleci.com/api/v1.1/project/:vcs種別/:ユーザー名/:プロジェクト/tree/:ブランチ?circle-token=作成したトークン

もう少し具体的に書いてみましょう。これをGitHubの私のリポジトリでやってみると、下記のようになります。

1
curl -X POST https://circleci.com/api/v1.1/project/github/YoshinoriN/docker-gitbucket-orchestration/tree/master?circle-token=トークン

成功した場合

成功した場合は下記のようなJSONが返ってきます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
"compare" : null,
"previous_successful_build" : {
"build_num" : 4,
"status" : "success",
"build_time_millis" : 191888
}
,

"build_parameters" : { },
"oss" : true,
"committer_date" : null,
"body" : null,
"usage_queued_at" : "2017-03-01T12:32:19.873Z",
"fail_reason" : null,
"retry_of" : null,
"reponame" : "docker-gitbucket-orchestration",
"ssh_users" : [ ],
"build_url" : "https://circleci.com/gh/YoshinoriN/docker-gitbucket-orchestration/5",
"parallel" : 1,
"failed" : null,
"branch" : "master",
"username" : "YoshinoriN",
"author_date" : null,
"why" : "api",
"user" : {
"is_user" : false,
"login" : "none"
}
,

"vcs_revision" : "38ea5c7d2ed188007c0584db8a13bbedcb763d25",
"vcs_tag" : null,
"build_num" : 5,
"infrastructure_fail" : false,
"committer_email" : null,
"previous" : {
"build_num" : 4,
"status" : "success",
"build_time_millis" : 191888
}
,

"status" : "not_running",
"committer_name" : null,
"retries" : null,
"subject" : null,
"vcs_type" : "github",
"timedout" : false,
"dont_build" : null,
"lifecycle" : "not_running",
"no_dependency_cache" : false,
"stop_time" : null,
"ssh_disabled" : false,
"build_time_millis" : null,
"circle_yml" : null,
"messages" : [ ],
"is_first_green_build" : false,
"job_name" : null,
"start_time" : null,
"canceler" : null,
"platform" : "1.0",
"outcome" : null,
"vcs_url" : "https://github.com/YoshinoriN/docker-gitbucket-orchestration",
"author_name" : null,
"node" : null,
"canceled" : false,
"author_email" : null
}

Webで見てみると、ロボットのアイコンでビルドがはじまってます。

失敗した場合

失敗した場合は下記のようなJSONが返ってきます。

1
2
3
4
5
6
7
8
9
//権限がない・トークンが間違ってる
{
"message" : "Permission denied"
}

//プロジェクトがない
{
"message" : "Project not found"
}

定期実行するには…?


cronとかやればいいと思います。24時間稼働してるサーバーがない…?どうすればいいんでしょうね…?Herokuあたりでなんとかできそうな気もします。後はCircleCI以外のWebUIでスケジュールを組めるCIサービスを使うとかでしょうか…CIサービスごとの定期実行の比較は下記の記事が参考になります。

無料で使える CI サービス比較(定期実行編)

なんでCircleCIなん…?


やりたいリポジトリのビルドを既にCircleCIでやってたので。あとは、Dockerのビルドができて、かつ簡単に定期実行できそうかどうかで判断しました。

なんでやりたかったん?


DockerのベースイメージにAlpine Linuxを使用しているのですが、その中で使用しているパッケージの更新が早すぎてしょっちゅうビルドできなくなってしまっていたからです。このリポジトリ、たまにクローンしている人がいるみたいなので前々から定期的にビルドする必要があるな~と思ってました。今回でとりあえずVPSから一日一回cronでビルドのAPIを叩くようにしたので、以前より早くビルドエラーに気付けるようになると思います。