技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

Image【CircleCI】

Imageとは、ファイルやディレクトリなどプログラムを実行する上での環境を保存したものですが、CircleCIではjobごとに、Imageを使って環境を構築するexecutorを、Docker、Machine、macOSの中から選択する必要があります。

最初に、CircleCIが管理している、あらかじめ組み込まれたDocker Image(以降、Docker Imageと表現します)の解説を行います。所謂カスタムイメージについては、公式Using Custom-Built Docker Images - CircleCIを参照ください。

続けてMachine、macOSのimageに関する解説を行います。


Docker Imageの指定に関する注意

Docker Imageはバグの修正や機能向上のため、予告なしにアップデートされます。Docker Imageの指定にタグ(識別するためのDockerの機能)を使って厳密に指定をしないと、常に最新のDocker Imageが使用されてしまい、意図しない結果を招くことがありますので、注意が必要です。

例えば「circleci/ruby:2.4-node」と、タグ(「:」以降)によってバージョンを指定します。「circleci/ruby:2.3.7-jessie」のように、OSの指定を加えると更に厳密にできます。「:latest」のような可変タグを使用すると、必ずしも意図した結果とはならないため推奨されていません。

Docker ImageのIDを用いるのもよいでしょう。各Docker Imageには、SHA256アルゴリズムによってIDが割り振られています。IDは次の手順で指定することができます。

  1. CircleCIのProjectページで、imageを使用したbuildの結果を確認します

  2. Test Summaryタブにて、Spin up environmentステップをクリックします

  3. logの中でimageのIDを確認します

  4. 確認したIDを.ymlファイルの対象のimage名の後に下記のような形で記述します

circleci/ruby@sha256:df1808e61a9c32d0ec110960fed213ab2339451ca88941e9be01a03adc98396e


言語に関するDocker Image

GoやRubyなどのプログラミング言語に関するDocker Imageは、docker keyの下で指定されるimageのリストの中で最初に記述される必要があります。primary containerとして扱うためです(最初に記述されたimageをベースとして、全てのstepが実行されます)。

Pre-Built CircleCI Docker Images - CircleCIに記述がない言語については、Dockerfile Wizardを使ってカスタムイメージを作成します。

CircleCIは、browsersなどの機能を追加するための接尾辞オプションを用意しています(Pre-Built CircleCI Docker Images - CircleCI)。


サービスに関するDocker Image

buildpack-deps(各言語を動かすために必要な依存関係を整理したimage)とデータベースに関するImageが用意されています。


サービスに関して用意されている接尾辞オプションは「-ram」です。これを使うとRAMを使用してbuildスピードを向上させることができます。


インストール済みのツールとパッケージ

apt-getによりインストールされているもの(Androidに関するDocker Imageは除く)

  • bzip2
  • ca-certificates
  • curl
  • git
  • gnupg
  • gzip
  • locales
  • mercurial
  • net-tools
  • netcat
  • openssh-client
  • parallel
  • sudo
  • tar
  • unzip
  • wget
  • xvfb
  • zip


curlによりインストールされているもの

  • Docker client
  • Docker Compose
  • dockerize
  • jq


最新版のDocker Imageタグ

各言語およびサービスのDocker Imageに関する最新版のタグは、Pre-Built CircleCI Docker Images - CircleCIで紹介されています。


Machine image

MachineとはLinux仮想マシンを指します。

MachineはDockerと比較して、複数データベースの実行や全てのrootのアクセスが可能になるなど、自由の利く点も多くありますが、作成や起動に時間がかかる等デメリットもあります(Choosing an Executor Type - CircleCI)。OSのリソース全てにアクセスできるので、「ping」や「sysctl」コマンドを使用したいときは、Machineを利用するとよいでしょう。
ただし料金改定によって、Machineの利用には課金されることが予定されているので、その点には留意が必要です。

machineというkeyに対してtrueを指定すると、デフォルトimageとして「circleci/classic:latest」が適用されます。imageキーで指定することも可能です。imageを指定するための3パターンが用意されています。

  • circleci/classic:latest
    デフォルト設定です。imageが変更される少なくとも1週間前に通知されます
  • circleci/classic:edge
    予告なしに、最新のimageを適用します
  • circleci/classic:{YYYY-MM}
    リリース年月を指定して、特定のimageを適用します。予期せぬ変更は発生しません


version: 2
jobs:
  build:
    machine:
      image: circleci/classic:2017-01



jobやWorkflow内でDocker Imageをビルドしている場合には、Docker Layer Cachingを使うことができます(Enabling Docker Layer Caching - CircleCI)。

version: 2
jobs:
  build:
    machine:
      docker_layer_caching: true


macOS image

macOS環境での仮想マシンを利用することができます。どのバージョンのXcodeを使用するかも指定します。詳細はTesting iOS Applications on macOS - CircleCIを参照ください。
macOS imageを利用することによってApple製品のOSに関するビルド、テスト、デプロイが可能になります。

jobs:
  build:
    macos:
      xcode: "9.0"
      
    steps:
      # Commands will execute in macOS container
      # with Xcode 9.0 installed
      - run: xcodebuild -version



Pre-Built CircleCI Docker Images - CircleCI