lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

pipでお手軽yamllint環境を手に入れる(venvで環境を汚さずに)

概要

20191010追記

pipは古いとアドバイスを受けてpoetryでやる方法に書き直しました。 こっちのpoetryの方を参考にしてくださいまし。

kitigai.hatenablog.com

追記ここまで

yamlファイルに対してのlinterが欲しいなと言う感じで環境を構築します。
pipを使って再配布可能な形でvenvで環境を汚さず構築します。

また、私はエンジニアの鏡なので怠け者です。
lintの実行を必ずサボってしまうので、pre-commitのgit hookでコミット時に自動的にlintが走るようにします。

目次

参考サイト様

前提

$ 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)

成果物

github.com

元々、制作していたlaravelプロジェクトのDocker開発環境を対象にyamllintを導入します。

yamllintの導入手順

リポジトリのクローン

すでに該当のプロジェクトが存在する場合は適宜読み替えてください。

$ git clone git@github.com: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 git@github.com: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しかないじゃん...と言う感じ