概要
20191010追記
pipは古いとアドバイスを受けてpoetryでやる方法に書き直しました。 こっちのpoetryの方を参考にしてくださいまし。
Poetryでお手軽yamllint環境を手に入れる(環境を汚さずに) | blog.lycheejam.net
追記ここまで
yamlファイルに対してのlinterが欲しいなと言う感じで環境を構築します。
pipを使って再配布可能な形でvenvで環境を汚さず構築します。
また、私はエンジニアの鏡なので怠け者です。
lintの実行を必ずサボってしまうので、pre-commit
のgit hookでコミット時に自動的にlintが走るようにします。
目次
参考サイト様
前提
- MacBook Pro 2017 Mojave
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.14.6
BuildVersion: 18G95
$ python -V
Python 3.7.4
$ pip --version
pip 19.1.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
成果物
https://github.com/Lycheejam/laradock 🔗
元々、制作していたlaravelプロジェクトのDocker開発環境を対象にyamllintを導入します。
yamllintの導入手順
リポジトリのクローン
すでに該当のプロジェクトが存在する場合は適宜読み替えてください。
$ git clone [email protected]:Lycheejam/laradock.git
仮想環境の構築
ローカル環境を汚さないためにvenvで仮想環境を構築します。
# 先程、クローンしたディレクトリに移動
$ cd laradock
# 仮想環境を作成
$ python -m venv .venv
# 仮想環境に入る
$ source .venv/bin/activate
ターミナルのPrefixが(.venv)
に変わればOKです。
必要なパッケージのインストール
以下の手順は先程作成したvenvの仮想環境内で実行していきます。
# pre-commitのインストール
$ pip install pre-commit
Collecting pre-commit
Downloading https://files.pythonhosted.org/packages/5b/e2/70050edecec542122bd32789b2c4563d578e0152c0f338f7870b7627afeb/pre_commit-1.18.3-py2.py3-none-any.whl (154kB)
100% |████████████████████████████████| 266kB 20.4MB/s
# ...省略
Installing collected packages: identify, pyyaml, virtualenv, toml, aspy.yaml, six, more-itertools, zipp, importlib-metadata, nodeenv, cfgv, pre-commit
Running setup.py install for pyyaml ... done
Running setup.py install for nodeenv ... done
Successfully installed aspy.yaml-1.3.0 cfgv-2.0.1 identify-1.4.7 importlib-metadata-0.23 more-itertools-7.2.0 nodeenv-1.3.3 pre-commit-1.18.3 pyyaml-5.1.2 six-1.12.0 toml-0.10.0 virtualenv-16.7.5 zipp-0.6.0
# yamllintのインストール
$ pip install yamllint
Collecting yamllint
Downloading https://files.pythonhosted.org/packages/39/b5/390c956b1aad9a0de18cffa94dba8610b9eca4bd142aa56746e31a388f14/yamllint-1.17.0-py2.py3-none-any.whl (57kB)
100% |████████████████████████████████| 61kB 5.6MB/s
Requirement already satisfied: pyyaml in ./.venv/lib/python3.7/site-packages (from yamllint) (5.1.2)
Collecting pathspec>=0.5.3 (from yamllint)
Downloading https://files.pythonhosted.org/packages/7a/68/5902e8cd7f7b17c5879982a3a3ee2ad0c3b92b80c79989a2d3e1ca8d29e1/pathspec-0.6.0.tar.gz
Installing collected packages: pathspec, yamllint
Running setup.py install for pathspec ... done
Successfully installed pathspec-0.6.0 yamllint-1.17.0
インストールされたパッケージを確認します。
$ pip list
Package Version
------------------ -------
aspy.yaml 1.3.0
cfgv 2.0.1
identify 1.4.7
importlib-metadata 0.23
more-itertools 7.2.0
nodeenv 1.3.3
pathspec 0.6.0
pip 19.0.3
pre-commit 1.18.3
PyYAML 5.1.2
setuptools 40.8.0
six 1.12.0
toml 0.10.0
virtualenv 16.7.5
yamllint 1.17.0
zipp 0.6.0
諸々、インストールされてますね。
pre-commit configの作成
pre-commit用のconfigファイルをプロジェクト直下に作成し、
pre-commit hookに反応してyamllintが走るように設定します。
$ vi .pre-commit-config.yaml
---
repos:
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.15.0
hooks:
- id: yamllint
yamllint configの作成
yamllint用のconfigファイルをプロジェクト直下に作成し、
yamllintが実行される際に適用されるルールを設定します。
$ vi .yamllint
---
extends: default
rules:
line-length:
max: 140
level: warning
pre-commitのインストール
pre-commitをインストールしてgit commitした際に実行されるようにします。
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
以上で環境構築は完了です。
yamllintの実行確認
実際にコミットして実行されることを確認します。
初回のコミットは色々コレ以外にもログが出たかも…?
ちょっとログ見つけられなかったですが…
$ git add .yamllint
$ git commit -m ':+1: add yaml lint config'
yamllint.................................................................Passed
[master b4edd55] :+1: add yaml lint config
1 file changed, 6 insertions(+)
create mode 100644 .yamllint
ちなみにコミット時にlintを走らせる方法だと、すでにコミット済みのファイルは対象にならないっぽいので手動でlintを実行してやります。
# プロジェクトルートで
$ yamllint .
./.pre-commit-config.yaml
1:1 warning missing document start "---" (document-start)
./docker-compose.yml
1:1 warning missing document start "---" (document-start)
11:11 error trailing spaces (trailing-spaces)
35:56 error no new line character at the end of file (new-line-at-end-of-file)
こんな感じに色々見つけてくれました。
詰まったポイント:lintが走らない
実行確認のためにダミーのyamlファイルを作成してコミットしてみたんですが
lintが走ってくれないと言う自体が発生しました。
とりあえず、一度venv環境を抜けてターミナルも再起動したら治りました。
$ deactivate
$ exit
# 新しく開いたターミナルで
$ cd laradock/
$ source .venv/bin/activate
再配布可能な環境の作成
誰でも同様の環境を構築可能にするために、requirements.txt
を作成します。
requirements.txtの作成
ただ、pip freeze
コマンドで作るだけですが…
# venv環境に入った状態 + プロジェクトルートで
$ pip freeze > requirements.txt
# ファイルの存在確認
$ ls -la | grep requirements
-rw-r--r-- 1 z staff 229 10 6 05:56 requirements.txt
# ファイルの内容確認
$ cat requirements.txt
aspy.yaml==1.3.0
cfgv==2.0.1
identify==1.4.7
importlib-metadata==0.23
more-itertools==7.2.0
nodeenv==1.3.3
pathspec==0.6.0
pre-commit==1.18.3
PyYAML==5.1.2
six==1.12.0
toml==0.10.0
virtualenv==16.7.5
yamllint==1.17.0
zipp==0.6.0
これをgithubに上げておけばどこでも実行可能になる。
再構築手順
諸々、GitHubに上がっている状況を想定した環境の再構築(構築)手順です。
$ git clone [email protected]:Lycheejam/laradock.git
$ cd laradock
$ python -m venv .venv
$ source .venv/bin/activate
# venvの仮想環境に入った状態で
pip install -r requirements.txt
pre-commit install
これだけでyamllintがgit commitする際に実行される環境を手に入れることができます。
最後に補足的な注意事項
手順の中で作成した.venv
ディレクトリは、
gitにコミットしないよう.gitignore
にちゃんと書きましょうね。
雑感
本当はDockerfileのlinter導入までやりたかった…
これだとyamlファイルってdocker-compose.yaml
しかないじゃん…と言う感じ