Travis CI からの移行
Travis CI から CircleCI に移行する方法を概説します。
このドキュメントで使用しているビルド構成の例は、JavaScript のサンプル リポジトリを基にしています。 説明のために範囲を限定したシナリオを想定し、このサンプル リポジトリのオーナーが CI ツールを使用して以下の目的を達成したいと考えているものとします。
- コードのプッシュ時に、ビルドおよびすべてのテストを実行する
- 初回のビルド後にすべての依存関係をキャッシュして、ビルド時間の短縮を図る
- 環境変数を安全に使用する
- ビルド時に毎回
test-results.xml
ファイルをアップロードして、オンラインでアクセスできるようにする
前提条件
リポジトリがリンクされた CircleCI アカウントをお持ちになっていることを前提としています。 まだアカウントをお持ちでない場合は、CircleCI の入門ガイドを参照してください。
設定ファイル
Travis でも CircleCI でも、CI プロバイダーでの実行内容を決定するために設定ファイルを使用します。 Travis の場合、構成内容はリポジトリのルートにある .travis.yml
ファイルに保存します。 CircleCI の場合は、リポジトリのルートにある .circleci/config.yml
ファイルに保存します。
Travis CI | CircleCI | 説明 |
---|---|---|
language: | docker.image | Docker Executor を使用して、対象言語に対応する Docker イメージを指定します。 |
dist: | machine | CircleCI の Linux VM Executor は Ubuntu VM です。 設定ファイルで バージョンを指定できます。 |
os: | docker、machine、macos | OS ではなく、Docker、Linux VM、MacOS の実行環境を提供します。 |
cache components: | restore_cache:、save_cache: | キャッシュの復元機能と保存機能を使用して、ビルド内のキャッシュを制御します。 |
before_cache | run: | キャッシュする前にコマンドを実行する場合は、単にキャッシュ ステップの前に run: ステップを記述します。 |
before_install: | run: | CircleCI では、コマンドをステージまたはタイプに分割しません。 run: ステップを使用して任意のコマンドを指定し、必要に応じて順序付けします。 条件付きステップの使用方法については、設定ファイルに関するドキュメントを参照してください。 |
install: | run: | 上記を参照。 |
before_script | run: | 上記を参照。 |
script: | run: | 上記を参照。 |
after_script: | run: | 上記を参照。 |
deploy: | deploy: | deploy: ステップを使用して、ビルド アーティファクトをデプロイします。 |
env: | environment: | environment: 要素を使用して、環境変数を指定します。 |
matrix: | workflows: | CircleCI ではワークフローを使用して複数のジョブをオーケストレーションできます。 |
stage: | requires: | requires: 要素を使用して、ジョブの依存関係を定義し、ワークフローでの並列ビルドを制御します。 |
コンテナの使用
CircleCI では、チェックアウトされたコードを実行 (ビルド、テストなど) する環境を Executor と呼びます。
ユーザーは実行する言語とディストリビューションを選択するのではなく、Docker イメージ、クリーンな Linux VM、またはクリーンな macOS VM を実行環境として選択して、必要な依存関係をインストールするための任意の実行コマンドを記述できます。 ただし、言語に基づいてビルドを実行するうえでは、特定の Docker イメージ (Node.js など) を使用するのが確実な方法です。 任意のカスタム Docker イメージも使用できますが、CircleCI では .config
ファイルにおける一般的なシナリオを想定して調整された Docker イメージを複数用意しています。
コードのプッシュ時のビルド
ドキュメント冒頭のリンク先にあるサンプル リポジトリは、記事の作成、読み取り、更新、削除を行う基本的なアプリケーションです。 アプリケーションは MERN
スタックを使用してビルドし、クライアント上でテストを実行し、コードのプッシュ時に毎回 REST API を実行します。
このサンプルリ ポジトリに対してテストを実行する場合、Travis のシンプルな構成内容では、先頭部は以下のようになります。
language: node_js
services: mongodb
before_install:
- npm i -g npm@5
node_js:
- "5"
cache: npm
基本的なビルドの場合、Travis CI の構成では、言語に関する最もよく知られた依存関係とビルド ツールを使用し、1 つのジョブ ライフサイクルにおいてオーバーライド可能なデフォルトのコマンドとしてそれらを抽象化します。 このビルドを実行すると、Travis CI は自動的に install
ステップとして npm install
を実行し、script
ステップとして npm start
を実行します。
CI 環境をさらに制御する必要があるときには、フックを使用して install
ステップと script
ステップの前後でコマンドを実行できます。 上記の例では、「before フック」を使用して npm バージョンを 5
に固定するように指定しています。 フックでシェル スクリプトを実行することも可能です。実行するシェル スクリプトは、通常、リポジトリのルートの .travis
フォルダーに格納します。
CircleCI で同じ結果を得るために必要な構成をサンプル リポジトリから以下に抜粋します。
version: 2
jobs:
build:
working_directory: ~/mern-starter
docker:
- image: circleci/node:4.8.2
- image: mongo:3.4.4
steps:
- checkout
- run:
name: npm の更新
command: 'sudo npm install -g npm@5'
- restore_cache:
key: dependency-cache-{{ checksum "package-lock.json" }}
- run:
name: npm wee のインストール
command: npm install
- save_cache:
key: dependency-cache-{{ checksum "package-lock.json" }}
paths:
- ./node_modules
- run:
name: テスト
command: npm test
上記の構成では、特に言語を必要としていません。また、ユーザーは任意の数の steps
を指定して実行でき、ステップの順序にも制約はありません。 Docker を利用することで、特定のバージョンの Node.js と MongoDB が各 command
で使用可能になります。
依存関係のキャッシュ
CircleCI では、依存関係をキャッシュおよび復元するタイミングとその方法を設定ファイルで制御できます。 上記の CircleCI の .circleci/config.yml
では、特に package-lock.json
ファイルのチェックサムに基づいて依存関係のキャッシュをチェックしています。 package-lock.json
に限らず、任意のキーに基づいてキャッシュを設定したり、一連のキャッシュ パスに対して宣言した順序でキャッシュを保留するよう設定したりすることができます。 ビルド時にキャッシュを作成および復元する方法のカスタマイズについては「依存関係のキャッシュ」を参照してください。
Travis の構成の場合、依存関係のキャッシュは、ビルド時の script
フェーズの後に発生し、使用している言語に関連付けられます。 .travis.yml
の例では、cache: npm
キーを使用することで、依存関係はデフォルトで node_modules
をキャッシュするようになっています。
環境変数
Travis と CircleCI はいずれも、ビルド時に環境変数を使用できます。
CircleCI の .circleci/config.yml
では、ビルド構成のステップ、ジョブ、またはコンテナ内に環境変数を直接含めることができます。 これらはパブリック変数であり、暗号化されていません。 Travis CI では、暗号化された環境変数を構成に直接含めることができます (travis
gem をインストールしている場合に限ります)。
Web アプリケーションでの環境変数の設定
Travis CI のリポジトリ設定を使用している場合は、CircleCI のプロジェクト設定のページで簡単に環境変数を設定できます。 詳細については、「プロジェクトでの環境変数の設定」を参照してください。
CircleCI では、コンテキストを使用することで、すべてのプロジェクト間で安全に環境変数を共有できます。
メモ: CircleCI には、定義済み環境変数が複数用意されています。
アーティファクトのアップロード
Travis CI では、AWS S3 を使用して手動で、または GitHub リリースのアタッチメントとしてビルド アーティファクトをアップロードできます。
CircleCI では、アーティファクトのアップロードは設定ファイル内の 1 ステップとして実行します。
- run:
name: テスト
command: npm test
- run:
name: コード カバレッジの生成
command: './node_modules/.bin/nyc report --reporter=text-lcov'
- store_artifacts: # < test-results.xml を保存します。Web アプリまたは API から使用できます
path: test-results.xml
prefix: tests
- store_artifacts:
path: coverage
prefix: coverage
- store_test_results:
path: test-results.xml
アーティファクトのアップロードが完了すると、ブラウザー上でジョブ ページの [Artifacts (アーティファクト)] タブでアーティファクトを確認したり、CircleCI API からアクセスしたりすることができます。 詳細については、「ビルド アーティファクトの保存」を参照してください。
高度なツール
Travis でさらに高度な構成を行いたい場合は、ビルド マトリックス (複数の並列ジョブの実行を指定する構成) やビルド ステージ (ジョブをステージにグループ化して並列実行したり、順次前のジョブの成功に基づいてジョブを順次実行したりする機能) が利用できます。
CircleCI では、.circleci/config.yml
で ワークフロー を使用することで、ジョブのグループ化と実行順序、並列処理の利用、ビルドのファンインまたはファンアウト、順次実行ビルドを定義できます。 ワークフローを使用すると、ビルド構成に対して複雑できめ細かな制御を行えるようになります。