CircleCIでのCI用設定について業務を通して組み立てた内容をまとめてみた

業務にてCircleCIでのCIを継続して出来た現時点での設定について振り返ってみました。
2019.07.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CircleCIを実際に業務で利用し始めて、当初はローカルとの設定の違いにやや苦戦しつつも、ようやく色々と手間が省ける状態にまでたどり着けました。

実装とテストそしてレビューを通しながら追加していった現時点での設定内容を備忘録としてまとめてみました。

前提となる環境

以下の環境を前提とします。

  • Python 3.7
  • pipenv

環境設定

ベースは公式設定例を元にしています。

Configuring a Python Application on CircleCI - CircleCI

     docker:
       - image: circleci/python:3.7.3
     steps:
       - checkout
       - run: sudo chown -R circleci:circleci /usr/local/bin
       - run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages
       - restore_cache:  # このステップは依存関係をインストールする前に実行します
           key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
       - run:
           command: |
             pip install pipenv
             pipenv sync --dev
       - save_cache:
           key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
           paths:
             - ".venv"
             - "/usr/local/bin"
             - "/usr/local/lib/python3.7/site-packages"

docker

当初はmachineでの指定にする予定でしたが、バージョンが追いついていないためか、現時点でPython3.7指定にはdockerにする必要がありました。

テストの実行

boto3を利用する前提で、各環境設定を適当に設定しています。moto経由での実行のためエラーにはなりません。

      - run:
          command: |
            export AWS_REGION_NAME='ap-northeast-1'
            export AWS_ACCESS_KEY_ID='test'
            export AWS_SECRET_ACCESS_KEY='test'
            pipenv run pytest tests

Lint

flake8は通過するようにしています。flake8-import-orderも試してみましたが、isortの挙動とうまくあわないこともあり外しました。

なお、警告にそった手作業を回避するためvim-autopep8を併用しつつ、可視化のためにvim-gitgutterを使っています。

      - run:
          name: run linting and metrics
          command: |
            pipenv run flake8 src/ tests/

Pipfile

Lintに関わる箇所については現時点で以下の状態となっています。

[dev-packages]
pytest = "*"
flake8 = "*"
pytest-cov = "*"
moto = "*"
isort = "*"

vim-autopep8

差分がないのにDiff表示されるのが辛いことと、airblade/vim-gitgutterを利用していることもあり、autopep8_disable_show_diffを有効にしています。

[[plugins]]
repo = 'airblade/vim-gitgutter'
hook_add = '''
let g:gitgutter_override_sign_column_highlight = 0
highlight SignColumn ctermbg=green
highlight GitGutterAdd ctermfg=blue ctermbg=brown
highlight GitGutterChange ctermfg=yellow ctermbg=brown
highlight GitGutterDelete ctermfg=red ctermbg=brown
highlight GitGutterChangeDelete ctermfg=blue ctermbg=brown
'''
[[plugins]]
repo = 'tell-k/vim-autopep8'
hook_add = '''
let g:autopep8_on_save = 1
let g:autopep8_disable_show_diff=1
'''

設定全体 (.circleci/config.yml)

version: 2
jobs:
  build:
    docker:
      - image: circleci/python:3.7.3
    steps:
      - checkout
      - run: sudo chown -R circleci:circleci /usr/local/bin
      - run: sudo chown -R circleci:circleci /usr/local/lib/python3.7/site-packages
      - restore_cache:  # このステップは依存関係をインストールする前に実行します
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
      - run:
          command: |
            pip install pipenv
            pipenv sync --dev
      - save_cache:
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
          paths:
            - ".venv"
            - "/usr/local/bin"
            - "/usr/local/lib/python3.7/site-packages"
      - run:
          command: |
            export AWS_REGION_NAME='ap-northeast-1'
            export AWS_ACCESS_KEY_ID='test'
            export AWS_SECRET_ACCESS_KEY='test'
            pipenv run pytest tests
      - run:
          name: run linting and metrics
          command: |
            pipenv run flake8 src/ tests/

まとめ

当初は色々と手作業に迫られていましたが、設定を追加更新する毎に、

  • リポジトリにPushするだけで一通りチェック
  • 結果は基本Slackへの通知を見ていれば問題なし

と、CIの段階ながらもとても快適になりました。

CircleCIの設定で戸惑っている方の参考になれば幸いです。