
CircleCIでのCI用設定について業務を通して組み立てた内容をまとめてみた
この記事は公開されてから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の設定で戸惑っている方の参考になれば幸いです。









