30歳からのプログラミング

30歳無職から独学でプログラミングを開始した人間の記録。

『WEB+DB PRESS Vol.107』の「実践CircleCI」を読んだ

職場にあったので何となく目を通してみたら、思ったより初歩から説明してあったのでちゃんと読むことにした。

gihyo.jp

CircleCI、というかCIについてはほとんど何も知らないレベルだったが、ちゃんと入っていけた。
最後のほうは流し読みだから大した知識は身についていないが、取っ掛かりを持てたという意味で、意義はあった。

以前の記事に書いたように自分のサイトを構築し直してCircleCIでビルドやデプロイを行えるようにしたのだが、そのキッカケもこの特集を読んだことだった。
すごく難しい印象があったけど、「複雑なことをやろうとしなければ結構いけるかもしれない」と思えた。実際、いけた。

numb86-tech.hatenablog.com

すごく便利だし、強いプログラマたちに少し近づけた気がして楽しかった。

敷居が高そうな技術でも、興味があったりいずれ習得する必要があると思っているのなら、積極的に触ってみるのが大事だなと学んだ。
初歩的な知識でも、それがあるのとないのとでは大きく違うし、関連する記事を見つけたときも「取り敢えず読んでみよう」と積極的になれる。

以下、メモ。

第1章 はじめてのCircleCI

  • XP(エクストリーム・プログラミング)のプラクティスの一つとして、CI(継続的インテグレーション)がある
    • CIとは、コードを常にテスト、ビルドすることで、プロダクトの品質を保つことを目的としている
    • CD(継続的デリバリ)というものもある
      • デプロイを自動化することで、デプロイに伴う作業負担の減少や、スピーディーなリリースを実現する
  • コードを常にテスト、ビルドする、という部分を自動化するためのツールとしてCIツールがある
  • CircleCIはCIツールのひとつで、SaaS(Software as a Service)として提供されている
    • SaaSなので、自分でサーバーを用意する必要がない
  • CircleCIは、Docker環境の中でCIを実行する
  • CircleCIはワークフローという仕組みにより、並列処理などの複雑な実行が可能になっている
  • CircleCIの利用目的は、ビルド、テスト、デプロイの3つに大別できる
    • ビルドできる状態の維持、テストにパスした状態の維持、CD、を実現する

第2章 環境構築

  • CircleCIはcircleciコマンドでローカルでジョブを実行できる
  • circleciはDocker上で実行するので、まずDockerをインストールしておく必要がある
  • 次にCircleCIのCLIツールをダウンロードする
  • $ circleci update checkでアップデートがないかチェックできる
  • 設定ファイルは.circleci/config.yml
  • $ circleci config validateで、設定ファイルの構文チェックが出来る
  • $ circleci local executeでローカルでジョブを実行できる
    • 以下の.circleci/config.ymlが、シンプルな例
version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8.11.3
    steps:
      - run: echo "hello world"
  • デフォルトではbuildジョブを実行するが--jobオプションでジョブを指定できる
  • -eオプションで環境変数を設定できる
  • $ circleci local executeを以下のようにして試してみる
    • $ circleci local execute --job build2だとnopeが出力される
    • $ circleci local execute --job build2 -e HOGE=fooだとfooが出力される
version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8.11.3
    steps:
      - run: echo "hello world"
  build2:
    docker:
      - image: circleci/node:8.11.3
    steps:
      - run: echo ${HOGE-nope}

第3章 基本設定

  • 設定は全て.circleci/config.ymlに書かれる
  • 主要なキー
    • version
      • CircleCIのバージョンを指定する
    • jobs
      • ジョブを1つ以上定義する。1つしか定義しない場合は必ずbuildという名前にしないといけない。
    • docker
      • ジョブを実行する環境を記述。docker以外にもmachineなども使える。
    • steps
      • 実行したいコマンドを1つ以上定義する
      • ユーザーが自由に記述できるrunと、checkoutのようにCircleCIによって用意されているステップがある
        • runnamecommandの組み合わせという形でも記述できる
version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8.11.3
    steps:
      - run:
        name: Run install
        command: yarn install
      - run: yarn build
  • CircleCIが予め用意しているステップ(の一部)

第4章 ビルド

  • ビルドするためにいつも行っていたコマンドを設定ファイルに記述することで、CircleCIでビルドを行えるようになる
  • CircleCIには、予め用意されている「ビルトイン環境変数」というものがある
    • CircleCIの実行時に最初に表示される
    • アプリケーションにビルド情報を埋め込むのに使ったりする
    • ここで一覧を見れる
  • CircleCIでは各種言語やミドルウェアのプリビルドイメージをDockerHubに用意しているので、それを利用できる
    • 言語イメージはrubynode、サービスイメージはmysqlなどがある
  • アプリケーションのビルドだけでなく、Dockerイメージのビルドも可能

第5章 テスト

  • ビルドと同じようにテストもCircleCIで自動化出来る
  • store_test_resultsというステップを使うことでレポートファイルを保存できる
  • CircleCIの並列実行には、パラレルジョブとマルチコンテナの2種類がある
    • パラレルジョブは、同じジョブを2つ以上のコンテナを使って並列に実行する方法
      • 例えばテストファイルを分割して並列実行することなどが出来る
    • マルチコンテナは、複数のコンテナを使ってジョブを並列実行する方法
      • 依存関係のない処理を並列で走らせることで、実行時間の短縮が期待できる

第6章 デプロイ

  • デプロイには、コードを直接デプロイするケースや、DockerイメージのDockerレジストリへのデプロイ、コンテナのコンテナサービスへのデプロイなど、いくつかの種類がある
  • デプロイの有無やデプロイ先をリポジトリのブランチタグの有無によって切り替えることが出来る
  • triggersを使うことで、タスクの定期実行も設定できる
  • Contextsという機能を使うことで、環境変数の値を切り替えることが出来る
    • 複数のAWSアカウントを使っているときなどに便利