多くのシステム開発でバージョン管理が使われており、テストを自動化する仕組みも導入されています。それなのにIoT向けの開発になると、途端にターミナル上で直接コーディングしたり、テストが不十分になったりします。これでは多人数での本格的なIoT開発もできません。

そこで今回はCircleCIを用いてプロジェクトの自動テスト、そしてデプロイまでを自動化する流れを紹介します。

プロジェクトについて

今回はNode.js(JavaScript)で作成しています。そしてテストはMochaを使っています。Mochaはtestというディレクトリを作り、その中にあるJavaScriptファイルをテストファイルとして扱います。例えば以下のようなコードです。

const Sensor = require('../Sensor');
const assert = require("assert");

describe('Sensor Test', () => {

  it('Get name', () => {
    const name = 'Moisture sensor';
    const sensor = new Sensor(name);
    assert.equal(`Hello, I'm ${name}`, sensor.getName());
  });

});

CircleCIについて

CircleCIは名前の通りCIサーバを提供します。Dockerなどを使ってテスト環境を作れますので、幅広い開発環境に対応しています。GitHubとの連携も容易で、GitHubプロジェクトを指定するだけです。そうすればプルリクエストを作成すれば自動的にテストを開始してくれます。

CircleCI用の設定ファイルは .circleci/config.yml に作成します。設定内容についてはコメントを参照してください。

version: 2
jobs:
  build:
    # テスト環境はDockerのNode.js 7.10を用います
    docker:
      - image: circleci/node:7.10
    # 実行ディレクトリです
    working_directory: ~/repo
    # テストのステップです
    # 1. コードをチェックアウト
    # 2. キャッシュから読み込み(あれば)
    # 3. プロジェクトで使っているNode.jsライブラリをインストール)
    # 4. キャッシュを保存
    # 5. テストを実行
    steps:
      - checkout
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "package.json" }}
          - v1-dependencies-
      - run: yarn install
      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}
      - run: yarn test
  deploy:
    # テストが終わった後のコードです。
    # 実行内容としてはテストとほぼ同じですが、テストは行わずに build.js を実行します(後述)
    docker:
      - image: circleci/node:7.10
    working_directory: ~/repo
    steps:
      - checkout
      - run: yarn install
      - run: node build.js
# テストとデプロイの定義です
# デプロイはmasterブランチに変化があった場合のみ行います
workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build 
          filters:
            branches:
              only: master

コツとしてはデプロイのフローにおいてmasterブランチに更新があった(プルリクエストをマージした)タイミングだけ実行する点です。

リリースを作成する

プルリクエストをマージした後、リリースを作成すればisaaxに通知されます。しかし、この作業を手動で行うのは面倒です。そこで、これもNode.jsで build.js として記述します。

const octokit = require('@octokit/rest')();
const fs = require('fs');

(async () => {
  const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
  octokit.authenticate({
    type: 'token',
    token: process.env.GITHUB_TOKEN
  });
  const res = await octokit.repos.createRelease({
    owner: pkg.repository.user,
    repo: pkg.repository.name,
    tag_name: `v${pkg.version}`
  });
})();

GITHUB_TOKEN はリポジトリへの書き込み権限を持ったトークンです。これはGitHubの設定画面で作成します。そして、そのトークンをコードに直接書くのではなく、CircleCIの環境変数設定で定義します。この辺りは process.env.GITHUB_TOKEN で取得できます。

リリースはGitHubのAPIに対応したライブラリで作成します。その際、package.json の内容を読み込んで登録しています。バージョン情報も取得していますので、プルリクエストを作成する場合(masterを更新する場合)はバージョン番号を必ず上げるようにします。

まとめ

このようにすれば、Gitでブランチを作成してプッシュした後、プルリクエストを作成、テストを実行してマージ、その結果がリリースとして登録されてIoTデバイスのコードが更新されるという流れができあがります。面倒なリリース作成であったり、IoTデバイスへのコード反映が自動的に行われます。ぜひお試しください。

isaaxは皆さんのIoTアプリケーション開発を強力にサポートします。ぜひお試しを!
Isaax IoT


Leave a Reply

Your email address will not be published. Required fields are marked *