コンテンツにスキップ

CircleCI

このセクションでは、継続的インテグレーションサービスとしてCircleCIを使用します。簡単に言うと、CircleCIはソフトウェアのビルド、テスト、デプロイを自動化します。さまざまなプログラミング言語をサポートしており、今回のケースではCrystal言語をサポートしています。

このセクションでは、CircleCIがどのように継続的インテグレーションの概念を実装しているかを確認するための設定例をいくつか紹介します。

CircleCI orbs

例を示す前に、CircleCI orbsについて触れておく価値があります。公式ドキュメントでは、次のように定義されています。

Orbsは、再利用可能なコマンド、エグゼキュータ、ジョブを定義することで、一般的に使用される設定部分を1行のコードに凝縮することができます。

今回のケースでは、CrystalのOrbを使用します。

ビルドとスペックの実行

`latest`を使った簡単な例

簡単な例から始めましょう。**最新の** Crystalリリースを使用してテストを実行します。

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test

orbs:
  crystal: manastech/crystal@1.0
version: 2.1

できました!簡単でしたね!Orbsは抽象化レイヤーを構築することで、設定ファイルを読みやすく直感的にしています。

ジョブcrystal/testが何をしているのか疑問に思った場合は、いつでもソースコードを確認できます。

`nightly`の使用

ナイトリー版のCrystalリリースを使用するのは、以下のとおり簡単です。

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          name: test-on-nightly
          executor:
            name: crystal/default
            tag: nightly

orbs:
  crystal: manastech/crystal@1.0
version: 2.1

特定のCrystalリリースの使用

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          name: test-on-0.30
          executor:
            name: crystal/default
            tag: 0.30.0

orbs:
  crystal: manastech/crystal@1.0
version: 2.1

Shardsパッケージのインストール

`crystal/test`ジョブは内部で`crystal/shard-install` orbコマンドを実行するため、心配する必要はありません。

バイナリ依存関係のインストール

アプリケーションや一部のShardでは、ライブラリやパッケージが必要になる場合があります。これらのバイナリ依存関係は、Aptコマンドを使用してインストールできます。

`libsqlite3`開発パッケージをインストールする例を以下に示します。

.circleci/config.yml
workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          pre-steps:
            - run: apt-get update && apt-get install -y libsqlite3-dev

orbs:
  crystal: manastech/crystal@1.0
version: 2.1

サービスの利用

次に、外部サービス(例:MySQL)を使用してスペックを実行してみましょう。

.circleci/config.yml
executors:
  crystal_mysql:
    docker:
      - image: 'crystallang/crystal:latest'
        environment:
          DATABASE_URL: 'mysql://root@localhost/db'
      - image: 'mysql:5.7'
        environment:
          MYSQL_DATABASE: db
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

workflows:
  version: 2
  build:
    jobs:
      - crystal/test:
          executor: crystal_mysql
          pre-steps:
            - run:
                name: Waiting for service to start (check dockerize)
                command: sleep 1m
            - checkout
            - run:
                name: Install MySQL CLI; Import dummy data
                command: |
                        apt-get update && apt-get install -y mysql-client
                        mysql -h 127.0.0.1 -u root --password="" db < test-data/setup.sql

orbs:
  crystal: manastech/crystal@1.0
version: 2.1

注意

`pre-steps`で明示的に`checkout`を行うのは、`test-data/setup.sql`ファイルを使用できるようにするためです。

キャッシング

ジョブ`crystal/test`を使用する場合、内部でコマンドwith-shards-cacheが使用されるため、キャッシングはデフォルトで有効になっています。