Travis CI からの移行
Travis CI から CircleCI に移行する方法を概説します。
このドキュメントで使用しているビルドの設定ファイル例は、 JavaScript のサンプルリポジトリを基にしています。
前提条件
本ドキュメントでは、以下を前提としています。
- リポジトリがリンクされた CircleCI アカウントをお持ちになっていることを前提としています。 まだアカウントをお持ちでない場合は、CircleCI の 入門ガイドを参照してください。
- CircleCI では、チェックアウトされたコードを実行 (ビルド、テストなど) する環境を Executor と呼びます。
CircleCI に移行する理由
- 同時実行のスケーリング: CircleCI の 月額の Performance プランでは、最大 80 のジョブを同時実行することができ、 Custom プランではさらに多くのジョブを同時実行することができます。 Travis CI で同時実行できるジョブの数は、各プランでそれぞれ 1、2、5、10 個までです。
- リソースクラス: CircleCI ジョブでは、 vCPU と RAM を設定でき、戦略的にビルドを高速化し、クレジットを使用することができますが、Travis CI ではこれらの値は固定されています。
- タイミングに基づいた並列化: 多数のジョブの同時実行に加え、CircleCI では、タイミングに基づいて複数の環境で テストを分割する機能が組み込まれています。 この機能により、大きなテストスイートが完了するまでの時間を大幅に削減されます。 Travis CI では手動で行う必要があります。
- Orb: CircleCI では、独自のインテグレーションよりも、再利用可能な、テンプレート化された設定ファイルである Orb を提供しています。 サービスやツールの連携に加え、Orb を使用してチームや組織の設定ファイルを標準化し、テンプレート化することもできます。 レジストリを参照してください。
設定ファイル
Travis CI でも CircleCI でも 設定ファイル を使ってワークフローやジョブが定義されます。 異なる点は、CircleCI の設定ファイルはリポジトリのルートにある .circleci/config.yml
に保存されます。
下記では、それぞれの設定ファイルの宣言形式を比較していただけます。
Travis CI | CircleCI | 説明 |
---|---|---|
language: | docker、machine、macos | CircleCI では言語に基づく依存関係やコマンドを想定していません。代わりに、Executor を選択し、下記のように run: ステップを使ってインストール、ビルド、テストなどの必要なコマンドを実行します。 |
dist: | machine | CircleCI の Linux VM Executor は Ubuntu VM です。 設定ファイルで バージョンを指定できます。 |
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: | run: | run: ステップを使ってデプロイに必要なコマンドを実行します。 デプロイの概要を参照して下さい。 |
env: | environment: | environment: 要素を使用して、環境変数を指定します。 |
matrix: | matrix: | CircleCI ではワークフローを使用して複数のジョブをオーケストレーションできます。 |
stage: | requires: | requires: 要素を使用して、ジョブの依存関係を定義し、ワークフローでの並列ビルドを制御します。 |
環境変数
ドキュメント冒頭のリンク先にあるサンプル リポジトリは、記事の作成、読み取り、更新、削除を行う基本的なアプリケーションです。 アプリケーションは MERN
スタックを使用してビルドし、クライアント上でテストを実行し、コードのプッシュ時に毎回 REST API を実行します。
CircleCI で同じ結果を得るために必要な構成をサンプル リポジトリから以下に抜粋します。
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.1
workflows:
version: 2
build:
jobs:
- build
jobs:
build:
working_directory: ~/mern-starter
docker:
- image: cimg/node:17.2.0 # Primary execution image
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
- image: mongo:3.4.4 # Service/dependency image
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run:
name: update-npm
command: 'sudo npm install -g npm@5'
- restore_cache:
key: dependency-cache-{{ checksum "package-lock.json" }}
- run:
name: install-npm-wee
command: npm install
- save_cache:
key: dependency-cache-{{ checksum "package-lock.json" }}
paths:
- ./node_modules
- run:
name: test
command: npm test
上記の構成では、特に言語を必要としていません。 また、ユーザーは任意の数の step
を指定して実行でき、ステップの順序にも制約はありません。 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 CI では、AWS S3 を使用して手動で、または GitHub リリースのアタッチメントとしてビルド アーティファクトをアップロードできます。
CircleCI の .circleci/config.yml
では、ビルド構成のステップ、ジョブ、またはコンテナ内に環境変数を直接含めることができます。 これらはパブリック変数であり、暗号化されていません。 Travis CI では、 暗号化された環境変数を構成に直接含めることができます (travis
gem をインストールしている場合に限ります)。
Web アプリケーションでの環境変数の設定
Travis CI の リポジトリ設定を使用している場合は、CircleCI のプロジェクト設定のページで簡単に環境変数を設定できます。 詳細については、 プロジェクトでの環境変数の設定を参照してください。
CircleCI では、 コンテキストを使用することで、すべてのプロジェクト間で安全に環境変数を共有できます。
また、CircleCI には 定義済み環境変数が複数用意されています。
アーティファクトのアップロード
Travis CI では、AWS S3 を使用して手動で、または GitHub リリースのアタッチメントとしてビルド アーティファクトをアップロードできます。
CircleCI では、アーティファクトのアップロードは設定ファイル内の 1 ステップとして実行します。
- run:
name: test
command: npm test
- run:
name: code-coverage
command: './node_modules/.bin/nyc report --reporter=text-lcov'
- store_artifacts: # < stores test-results.xml, available in the web app or through the 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
で ワークフロー を使用することで、ジョブのグループ化と実行順序、並列実行の利用、ビルドのファンインまたはファンアウト、順次実行ビルドを定義できます。 ワークフローを使用すると、ビルド構成に対して複雑できめ細かな制御を行えるようになります。