2017-04 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

2017-04-13 (木)

Rails リポジトリに CircleCI 2.0 を導入した [CircleCI][Rails][Docker]

CircleCI

先日素振りがてら、個人の小さな Rails リポジトリを Dockerize しました。
https://github.com/masutaka/github-organization-watcher/pull/45

現在クローズドβの CircleCI 2.0 は Docker 前提らしいので、これも素
振りがてら移行してみました。
https://github.com/masutaka/github-organization-watcher/pull/48

CircleCI 2.0 はここから申請すれば、すぐ使えるようです。
https://circleci.com/beta-access/#request-access


移行前の印象


(1) 1.0 では宜しくやってくれたけど、2.0 は circle.yml に全部書く必
要があるみたい。面倒そう。

(2) とは言え、Dockerfile や docker-compose.yml があるし、ちょっと
やれば動くだろう。

(3) Alpine Linux の Docker Image 使えば、1.0 よりは速くなるのかな。

移行後の感想


(1) 予想に違わない面倒くささ・・・! オートマがマニュアルになった感じ。

(2) 使えませんでした /(^o^)\ 参考にはなったけど。

(3) 速い・・・!!!(移行前: 01:38、移行後: 00:30
両方ともキャッシュあり状態です。Alpine Linux もそうかもしれないけ
ど、とにかくキャッシュのリストアが速かったです(後述)。あと、
CircleCI のビルドが全体的に高速です。

circle.yml


circle.yml は 1.0 から 2.0 に移行して、このようになりました。同じ
ディレクトリにある Dockerfile や docker-compose.yml は使っていません。
https://github.com/masutaka/github-organization-watcher/pull/48/files

docker-compose を使うことも出来るそうなので、あとで試すかも。
Using docker-compose - CircleCI

実装の流れ


2.0 はローカルで circleci コマンドが使えるので、インストールします。
Running Jobs Locally - CircleCI

circleci コマンドはこの Docker イメージのラッパースクリプトでした。
Dockerfile は公開されていないようです。
https://hub.docker.com/r/circleci/picard/

checkout や restore_cache など、一部の命令はスキップされますが、
だいたい同じように動きます。

この辺を参考にしながら、実装していきました。
https://circleci.com/docs/2.0/
https://circleci.com/docs/2.0/language-ruby/

ローカルで試していた時は "apk add" が遅くて、Docker Hub に CI 専用
のイメージを置いて使ってましたが、CircleCI 上だと気にならないくら
いの速さだったので、今は ruby:2.4.0-alpine をそのまま使っています。

ハマったところ


Downloading cache archive...
Unarchiving cache...
Error untarring cache: exit status 1


restore_cache で↑これが発生してハマりました。

どうやら、Alpine Linux だと、tar と gzip がなくて失敗するそうです。
インストールしましょう。

ここに必要なコマンドが書いてありました。はい、マニュアル読め奴ですね。
Building Custom Images for Docker Executor - CircleCI

キャッシュはこの辺りが参考になりました。ありがとうございます。

- Caching in CircleCI - CircleCI
- CircleCI 2.0に移行して新機能を活用したらCIの実行時間が半分になった話 - クラウドワークス エンジニアブログ

すごいと思ったところ1


circle.yml にはこのように指定しました。

docker:
  - image: ruby:2.4.0-alpine
    environment:
      RDB_URL_BASE: postgres://postgres:@localhost
  - image: postgres:9.5-alpine



起動されたコンテナには Ruby が入っており、PostgreSQL も起動してい
るように見え、どうやっているんだろうと思っていたら、

Choosing an Executor Type - CircleCI

It’s also possible to specify multiple images. When you do this,
all containers will run in a common network. Every exposed port
will be available on localhost from a primary container.
(snip)
In a multi-image configuration job, steps are executed in the
first container listed (main container).


最初に書いたイメージがプライマリとして起動されるようです。Every
exposed port ... とか書いてあるので、PostgreSQL も起動しているよう
に見えたのは気のせいだったのかな...?

すごいと思ったところ2


キャッシュした /usr/local/bundle のリストアがめっちゃ速いです。

Restore bundler cache のところ見ると、たったの 2 秒です。
https://circleci.com/gh/masutaka/github-organization-watcher/172

まとめ


- CircleCI 2.0 は高速だった
- circle.yml に全部書く必要があるのは面倒
- Dockerize の次にやるには良いお題

2017-04 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

最終更新時間: 2017-04-13 23:09

検索
最近の話題
- 2017-04-13
  Rails リポジトリに CircleCI 2.0 を導入した
- 2017-04-08
  PS4 Pro と LG の 4K テレビ 43UH6500 で nasne は使えるのか?
- 2017-04-02
  オムロンの低周波治療器が肩こりにだいぶ効く
- 2017-03-21
  ローカル環境を出来るだけ Dockerize した
- 2017-03-12
  JAWS UG 2017 に行ってきた #jawsdays
- 2017-03-02
  DynamoDB で TTL が実装されたので、Rails4 から使ってみた
- 2017-02-26
  git-hyper-blame のセットアップ方法と使い方
最近追記された記事
- 2017-03-02-1 (41日前)
- 2017-02-25-1 (46日前)
- 2017-02-21-1 (50日前)
- 2015-06-07-1 (56日前)
- 2016-10-19-1 (65日前)
- 2016-01-01-1 (77日前)
- 2015-01-04-1 (86日前)
- 2015-06-07-1 (106日前)
- 2016-12-10-1 (124日前)
- 2016-11-05-1 (132日前)
カテゴリ
- Anthy (3)
- Apache (11)
- Apple (1)
- ATOK (4)
- au (3)
- AWS (17)
- Bazaar (1)
- Berkshelf (2)
- BigQuery (1)
- BitBar (3)
- Book (85)
- Boxen (2)
- Bugsnag (1)
- C (26)
- capistrano (3)
- chalow (56)
- ChatWork (1)
- Chef (17)
- Chrome (3)
- Chromecast (1)
- CircleCI (8)
- Comics (2)
- Cooking (10)
- cvs (15)
- cygwin (12)
- D3.js (1)
- Debian (55)
- Docker (3)
- E-mail (8)
- elasticsearch (4)
- Emacs (219)
- Emacs講座 (10)
- English (4)
- feedforce (7)
- fetchmail (3)
- Firefox (20)
- Fluentd (4)
- ftp (1)
- Game (20)
- Gem (5)
- Git (9)
- GitHub (15)
- Go (5)
- Google (1)
- gpg (4)
- GrowthForecast (7)
- Health (3)
- Heroku (9)
- Homebrew (10)
- HTML (6)
- iBook (1)
- iPhone (15)
- IRC (1)
- Jenkins (8)
- JS (1)
- Karabiner (1)
- KeySnail (3)
- Kibana (1)
- Kindle (1)
- Langrich (7)
- LDAP (6)
- Life (19)
- Linux (5)
- Mackerel (1)
- Mew (18)
- MongoDB (1)
- Mozilla (19)
- Music (1)
- MySQL (1)
- NAS (4)
- nginx (6)
- NHK (1)
- Node (1)
- ntp (4)
- OOP (1)
- OpenID (2)
- openssl (1)
- Opera (2)
- OSX (41)
- Perl (14)
- PHP (19)
- PostgreSQL (1)
- procmail (4)
- Programing (3)
- Puppet (1)
- Python (2)
- Rails (12)
- Rake (2)
- RaspberryPi (1)
- RedHat (29)
- Redmine (3)
- Rspec (1)
- Ruby (48)
- samba (3)
- screen (7)
- sed (5)
- serverspec (6)
- sh (8)
- Slack (2)
- Solaris9 (22)
- Spring (2)
- ssh (4)
- StatusNet (21)
- svn (12)
- Swift (1)
- Tablet (1)
- tdiary (3)
- Twitter (14)
- Twmode (6)
- Ubuntu (5)
- UNIX (102)
- vagrant (8)
- Video (21)
- vim (1)
- Wercker (9)
- Windows (29)
- Wine (3)
- XML (11)
- XP (1)
- zsh (25)
- インストールメモ (33)
- クイックシェイプ (12)
- ネタ (15)
- 勉強会 (14)
- 携帯 (6)
- 正規表現 (4)
過去ログ
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
Google+