8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitHub Actions で dotfiles を自動テスト

Last updated at Posted at 2020-03-06

はじめに

私は普段 Mac で作業していますが、たまに Linux に dotfiles を持ち込みたくなることがあります。
ですが、いつもエラーが出るので困ってしまいます。
( 新しい Mac を再セットアップするときも同様 )

そこで、dotfiles の品質を維持するために、GitHub Actions を使った CI に取り組んでみました。

  • テスト項目
    • 実行時エラーチェック ( Mac, Linux )
      • セットアップ用のスクリプト (シンボリックリンク作ったり) の実行
      • .bash_profile.bashrc の読み込み
      • brew bundle の実行 ( Mac のみ )
    • 静的解析
      • Shell Script (セットアップ用スクリプト, .bash_profile, .bashrc)
      • Vim Script ( init.vim )
      • TOML ( dein.vim )

( 自分のリポジトリに PR する習慣がないので、いつも master に直接 push しています ) git の内容が変更されると自動的にテストが走り
Badge 意味
image.png :octocat: <「Linuxだとまたエラーが出るぞ。残念w」
image.png :octocat: <「きれいに書けてて偉いぞ!」

と教えてもらえます。

dotfiles の構成

rtakasuke/.dotfiles at 記事投稿時点

$ tree -a -I ".git|.gitignore|archive|gitconfig|iTerm2|tigrc|README.md"
.
├── .github
│   └── workflows
│       ├── lint.yml     # 静的解析用ワークフロー
│       ├── linux.yml    # 実行時エラーチェック用ワークフロー (Linux)
│       └── macos.yml    # 実行時エラーチェック用ワークフロー (Mac)
├── Brewfile
├── bash_profile
├── bashrc
├── bin
│   └── init.sh          # セットアップスクリプト ( $HOME にシンボリックリンクを作成 )
└── nvim                 # Neovim + dein.vim の設定ファイル
    ├── dein.toml
    ├── dein_statusline.toml
    └── init.vim

GitHub Actions ワークフロー

.github/workflows に yaml ファイルを置いて設定を記述します。
詳しい構文は以下をご参照ください。

実行時エラーチェック ( Mac, Linux )

image.png

Run brew bundle ( Mac )

- name: Run brew bundle
  run: brew bundle

Brewfile に記述したアプリが Mac にインストールできることをテストします。

Run init.sh

- name: Run init.sh
  run: ${GITHUB_WORKSPACE}/bin/init.sh

セットアップ用スクリプト ( シンボリックリンクを作成したりする ) が正しく動作することをテストします。
エラー発生時に終了コードが0にならないように、スクリプト側で set -e コマンドを実行しています

Load .bash_profile & .bashrc

- name: Load .bash_profile
  run: |
    bash ~/.bash_profile 2> error.log; cat error.log
    if [ -s error.log ]; then false; fi

- name: Load .bashrc
  run: |
    bash ~/.bashrc 2> error.log; cat error.log
    if [ -s error.log ]; then false; f

.bash_profile や .bashrc を読み込んだときに、標準エラー出力がないことをテストします。
セットアップコマンドのときのように set -e コマンドを使うとシェルが落ちてしまうので、苦肉の策です。

静的解析

image.png

Check bin/init.sh

- name: Check bin/init.sh
  run: shellcheck ${GITHUB_WORKSPACE}/bin/init.sh

shellcheck を利用して、セットアップ用スクリプトの書き方に問題がないことをテストします。

Check .bash_profile & .bashrc

- name: Check .bash_profile
  run: shellcheck ${GITHUB_WORKSPACE}/bash_profile --exclude=SC2148,SC1090

- name: Check .bashrc
  run: shellcheck ${GITHUB_WORKSPACE}/bashrc --exclude=SC2148,SC1090

同上。
ただし、いくつかの警告を無視するように設定しました。

  • SC2148 : shebang が書いてないときの警告だが、.bash_profile に書くものではないので無視
  • SC1090 : 外部ソースを読み込めないことによる警告だが無視。

Check nvim/init.vim

- name: Check nvim/init.vim
  run: vint ${GITHUB_WORKSPACE}/nvim/*.vim -cstV --enable-neovim

vint を利用して、Neovim の設定ファイルの書き方に問題がないことテストします。

Check nvim/*.toml

- name: Check nvim/*.toml
  run: |
      curl -sL https://raw.githubusercontent.com/vmchale/tomlcheck/master/sh/check | sh || true
      find ${GITHUB_WORKSPACE}/nvim/*.toml -type f | xargs -I {} ${GITHUB_WORKSPACE}/tomlcheck --file {}

tomlcheck を利用して、Neovim のプラグインを記述している TOML ファイルの書き方に問題がないことテストします。
ワイルドカードが使えなかったので、苦肉の策です。

最後に

まだ改善の余地は多いと思うので、ご意見いただけると嬉しいです。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?