Search Results for ""

言語ガイド: Haskell

このガイドでは、CircleCI 2.0 で基本的な Haskell アプリケーションをビルドする方法について説明します。お急ぎの場合は、以下の設定ファイルの例をプロジェクトのルート ディレクトリにある .circleci/config.yml に貼り付け、ビルドを開始してください。

概要

CircleCI でビルドを行う Haskell プロジェクトのサンプルは、以下のリンクから確認できます。

このプロジェクトには、コメント付きの CircleCI 設定ファイル .circleci/config.yml が含まれます。

設定ファイルの例

version: 2.1
jobs:
  build:
    docker:
      - image: fpco/stack-build:lts
    steps:
      - checkout
      - restore_cache:
          # 依存関係のキャッシュについては https://circleci.com/ja/docs/2.0/caching/ をお読みください
          name: キャッシュされた依存関係の復元
          keys:
            - cci-demo-haskell-v1-{{ checksum "stack.yaml" }}-{{ checksum "package.yaml" }}
            - cci-demo-haskell-v1-{{ checksum "stack.yaml" }}
      - run:
          name: 依存関係の解決・更新
          command: stack --no-terminal setup
      - run:
          name: テストの実行
          command: stack --no-terminal test
      - run:
          name: 実行可能ファイルのインストール
          command: stack --no-terminal install
      - save_cache:
          name: 依存関係のキャッシュ
          key: cci-demo-haskell-v1-{{ checksum "stack.yaml" }}-{{ checksum "package.yaml" }}
          paths:
            - "/root/.stack"
            - ".stack-work"
      - store_artifacts:
          # アーティファクト (https://circleci.com/ja/docs/2.0/artifacts/) に表示するためにテスト サマリーをアップロードします
          path: ~/.local/bin/circleci-demo-haskell-exe
          destination: circleci-demo-haskell-exe

設定ファイルの詳細

config.yml は必ず version キーから始めます。 このキーは、互換性を損なう変更に関する警告を表示するために使用します。

version: 2.1

次に、jobs キーを記述します。 1 つひとつのジョブがワークフロー内の各段階を表します。 このサンプル アプリケーションには 1 つの build ジョブのみが必要なので、このキーの下にすべてのステップとコマンドを記述します。

実行処理は 1 つ以上のジョブで構成されます。 この実行では ワークフローを使用しないため、build ジョブを記述する必要があります。

ジョブの各ステップは Executor という仮想環境で実行されます。

この例では docker Executor を使用して、カスタム Docker イメージを指定しています。 最初に記述したイメージが、ジョブのプライマリ コンテナになります。

ジョブのすべてのコマンドがこのコンテナで実行されます。

jobs:
  build:
    docker:
      - image: fpco/stack-build:lts

これで、この環境で Haskell ビルド ツール stack を実行するように設定できました。 config.yml ファイルの残りの部分はすべて steps キーのブロックです。

最初のステップで checkout を実行してリポジトリのコードをプルし、この環境に準備します。

次に、ビルド時間を短縮するために復元可能な依存関係があるかどうかを確認します。 続いて stack setup を実行し、stack.yaml 設定ファイルで指定した Haskell コンパイラーをプルします。

stack 呼び出しのすべてで --no-terminal を指定して、表示できない文字で CircleCI ログが汚れてしまう「厄介な」出力機能 (\b 文字で実装) を回避します。

    steps:

      - checkout
      - restore_cache:
          name: キャッシュされた依存関係の復元
          keys:
            - cci-demo-haskell-v1-{{ checksum "stack.yaml" }}-{{ checksum "package.yaml" }}
            - cci-demo-haskell-v1-{{ checksum "stack.yaml" }}
      - run:
          name: 依存関係の解決・更新
          command: stack --no-terminal setup
      - save_cache:
          name: 依存関係のキャッシュ
          key: cci-demo-haskell-v1-{{ checksum "stack.yaml" }}-{{ checksum "package.yaml" }}
          paths:
            - ~/.stack
            - ~/.stack-work

メモ: cabal ビルド ファイルを使用して、依存関係をキャッシュすることも可能です。 ただし、特に Haskell エコシステムに慣れていない場合は、一般に stack を使用することをお勧めします。 このデモ アプリでは stack.yamlpackage.yaml を利用しているため、この 2 つのファイルを依存関係のキャッシュ キーとして使用します。 package.yamlstack.yaml よりも頻繁に更新されるため、この 2 つのキーをキャッシュの復元に使用します。 stackcabal の違いについては、Haskell ツール スタックに関するドキュメントを参照してください。

さらに、アプリケーションのビルド コマンドを実行します。 先にテストを実行してから、実行可能ファイルをインストールします。 stack install を実行すると、バイナリが作成されて ~/.local/bin に配置されます。

      - run:
          name: テストの実行
          command: stack --no-terminal test
      - run:
          name: 実行可能ファイルのインストール
          command: stack --no-terminal install

最後に、ビルドされた実行可能ファイルを取得し、アーティファクトとして保存します。

      - store_artifacts:
          # アーティファクト (https://circleci.com/ja/docs/2.0/artifacts/) に表示するためにビルド結果をアップロードします
          path: ~/.local/bin/circleci-demo-haskell-exe 
          destination: circleci-demo-haskell-exe

完了です。 これで Haskell アプリケーション用に CircleCI を構成できました。

一般的なトラブルシューティング

stack test コマンドは、メモリ不足エラーで失敗する場合があります。 以下に示すように、stack test コマンドに -j1 フラグを追加することを検討してみてください (メモ: これにより、テストを実行するコア数を 1 に減らして、メモリ使用量を抑えられますが、テストの実行時間が長くなる可能性があります)。

      - run:
          name: テストの実行
          command: stack --no-terminal test -j1

関連項目

デプロイ ターゲットの構成例については、「デプロイの構成」を参照してください。

このガイドでは、Haskell Web アプリの最も単純な構成例を示しました。通常、実際のプロジェクトはこれよりも複雑です。場合によっては、この例で示されている構成をカスタマイズまたは微調整する必要があります (Docker イメージ、使用する設定、使用する Haskell ビルド ツールなど)。 自由に構成して試してみてください。