CircleCIについて

成果物を本番環境にデプロイするにあたってCircleCIを利用するとのことで，学習した内容を共有してみたい．

# 1. CIとは
Continuous Integrationの略で、継続的インテグレーション．
複数人のコードを統合したときのエラー発見を早期に行える．
ビルドやテストを自動化し簡単に行うことができ，ビルドが常に通る状態を維持しやすくなる．
ミルプラトーではAPIで叩くことで，本番環境で運用したりしている．

# 2. CircleCI入門
CircleCIの公式日本語リファレンスが充実している．自分のGithubアカウントで色々試してみると，感覚が掴めてくるだろう. GithubやDockerと同様，慣れれば簡単なので，がんばろう．

- [入門ガイド \- CircleCI](https://circleci.com/docs/ja/2.0/getting-started/)
- [設定ファイルの概要 \- CircleCI](https://circleci.com/docs/ja/2.0/config-intro/) 

## 2.1 基本的な使い方の手順
1. ディレクトリに.circleciフォルダを作成し，その中でconfig.ymlを作成する．このconfig.ymlで色々設定することで，circleCIに指示を出す感じになる．
2. Gitでpushまで行うと，CircleCIが自動で変更を検知し，勝手にビルドしてくれる．CircleCIにログインしてビルドがちゃんと通っているか確認する．通ってなければ書き直す．

## 2.2 config.yml
　Dockerfileやdocker-compose.ymlと同じ感じ．独特のお作法が色々あるので，公式ドキュメントを参照しながら動かしていこう．以下はconfig.ymlの記述例となる．

```config.yml
# 最新バージョンは2.1．最新バージョン2.1でないとcommandやexecutorsが使えないので，2.1を使おう．
version: 2.1

# stepsを実行するための環境を定義．dockerやlinuxなど．
executors: 
  my-executor:
    # デフォルトでは~/project. ~は「チルダ」と読み，Linuxにおけるユーザのホームを表す．
    working_directory: ~/app
    docker:
    # dockerイメージを指定．circleciの公式イメージを利用するのが良い．circleciを動作させるのに必要なパッケージが含まれているから．
      - image: circleci/python:3.8-buster
    resource_class: xlarge

# 実行処理を行う．
jobs: 
  build:
    executor: my-executor
    steps: # buildジョブを構成するステップ．
      # ソースコードを作業ディレクトリにチェックアウトする．この場合では~/app.
      - checkout

      # Install ffmpeg
      - restore_cache:
          key: dependency-cache-ffmpeg-v0.0.1
      - run: 
          name: Install ffmpeg　
          command: |  # 複数コマンドを実行する際にcommandを用いる
            sudo apt -y update
            sudo apt install -y ffmpeg
      - save_cache:
          key: dependency-cache-ffmpeg-v0.0.1
          # cacheにその他のキャッシュ全般．venvにpythonの依存関係のキャッシュ．
          paths:
            - ~/cache

      # pythonの依存関係をインストールする
      # 依存関係をインストールする前に，利用できるキャッシュがあるか検索する．
      - restore_cache:
          key:  dependency-cache-{{ checksum "requirements.txt" }}-20201127
      - run:
          name: Install python dependencies
        # Python の依存関係をインストールする仮想環境を作成してアクティブ化する．
          command: |
            # 仮想環境の作成　python -m venv <name>
            python3 -m venv venv
            # 仮想環境をアクティベートする
            . venv/bin/activate
            pip3 install --upgrade pip
            pip3 install -r requirements.txt
      # キャッシュを保存する．次回restoreするため．
      - save_cache:
          key: dependency-cache-{{ checksum "requirements.txt" }}-20201127
          # 指定したパスにキャッシュを作成する．生成されたキーに一致するキャッシュが既に存在する場合、CircleCI は新しいキャッシュを保存しない．
          paths: 
            - "venv"

      # Predict
      - run: 
          name: run.py
          command: | 
            . venv/bin/activate
            python3 run.py
# 2.1ではworkflowsへのversion指定は必要がない
# workflowsを用いない場合は，job内のbuildが自動的に選択されて実行される．

workflows:
  build:
    jobs:
      # jobで定義したbuildを実行する
      - build

# Dockerfileは環境構築のマニュアルとして作成する．CircleCIやAWS，ローカル環境など，様々な環境に対応する元のスクリプトとなる．
# DLCはコストの関係で用いない．CircleCIに任せる．Dockerfileを利用するよりもキャッシュを利用しやすい．

```


# 参考文献
公式レファレンスが充実しているので，それを読めばほとんどの知識は得られる．ブログの数は多くなく，公式の方が内容も良い．

- [設定ファイルの概要 \- CircleCI](https://circleci.com/docs/ja/2.0/config-intro/) 
- [入門ガイド \- CircleCI](https://circleci.com/docs/ja/2.0/getting-started/)
- [Executor タイプを選択する \- CircleCI](https://circleci.com/docs/ja/2.0/executor-types/)
- [CircleCI のビルド済み Docker イメージ \- CircleCI](https://circleci.com/docs/ja/2.0/circleci-images/#python)
- [カスタム ビルドの Docker イメージの使用 \- CircleCI](https://circleci.com/docs/ja/2.0/custom-images/)
- [Using CircleCI workflows to replicate Docker Hub automated builds \| CircleCI](https://circleci.com/blog/using-circleci-workflows-to-replicate-docker-hub-automated-builds/)
- [環境変数の使用 \- CircleCI](https://circleci.com/docs/ja/2.0/env-vars/#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A7%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A)
- [Docker レイヤー キャッシュの有効化 \- CircleCI](https://circleci.com/docs/ja/2.0/docker-layer-caching/)
- [How to Build a Docker Image \- Image Caching \| CircleCI \| Building Docker Images \- Docker Layer Caching](https://circleci.com/blog/how-to-build-a-docker-image-on-circleci-2-0/)
- [API を使用したジョブのトリガー \- CircleCI](https://circleci.com/docs/ja/2.0/api-job-trigger/)
- [CircleCI での Python アプリケーションの構成 \- CircleCI](https://circleci.com/docs/ja/2.0/language-python/)
- [2\.0 プロジェクトのチュートリアル \- CircleCI](https://circleci.com/docs/ja/2.0/project-walkthrough/)