koh’s blog

Sys Admin who loves automation

GitHub ActionsでmacOS用のPlaybookをテストする

以前書いた記事の続きです。
前回AnsibleのPlaybookのlintをGitHub Actionsで実施するところまで設定したので実際にPlaybookを実行してテストをさせるようにしました。

koh-sh.hatenablog.com

使用しているリポジトリはこちらです。

github.com

Playbook実行

GitHub Actionsの定義ファイルの/.github/workflows/ansiblelint.ymlansibletest.ymlにリネームした上で下記を3行追記しました。

- name: Ansible lint
+ name: Ansible test

 on: [push]

 @@ -26,3 +26,6 @@ jobs:
       run: |
         ansible-playbook site.yml --syntax-check
         ansible-lint site.yml
+    - name: run playbook
+       run: |
+         ansible-playbook site.yml

実行させるための設定は以上です。
次にコミットされると自動でansibleインストール, lint, Playbook実行まで行われます。

ちなみに使用しているPlaybookですが実際に1から実行したことがなく、現在使用している端末の設定を少しずつ書き起こしたものだったので最後まで実行しきるまでかなりエラーが出ました。

こちらのP/Rがその四苦八苦した結果です。

github.com

パッケージのインストールに時間がかかるのでコメントして省略しようとしたら後続タスクでエラーが出たり、destのパスが見つからなくてlsして探したりと我ながらひどかったです。
Github Actionsのデバッグのコツとかあるんですかね。

テスト実行

Playbook実行後のテストも追加しました。
テスト実装の仕方は色々ありますが、特に深く考えずtestinfraでつらつら書きました。
testinfraについては過去にブログで記事を書いたのでよろしければご覧くださいませ。

koh-sh.hatenablog.com

各roleごとにtestsディレクトリを作成し、その下にtestファイルを置きました。

例としてzsh設定role用のテストはこのような感じになります。

/roles/zsh/tests/test_zsh.py (クリックで展開)

import os


def test_shells_file(host):
    shells = host.file("/etc/shells")
    assert shells.contains("/usr/local/bin/zsh")


def test_ccat_completion(host):
    compfile = "/usr/local/share/zsh/site-functions/_ccat"
    assert host.file(compfile).is_file

roleごとのtestを作成したらGitHub Actionsの定義も合わせて修正していきます。
修正内容としてはこちらになります。

  • インストールの際にtestinfra, pycodestyleをインストール
  • テストコードに対してpycodestyle実行(lint)
  • testinfra実行

※ pycodestyleはpythonコードがpep8に準拠しているかのチェックツールです。

github.com

そして完成したansibletest.ymlがこちらになります。

/.github/workflows/ansibletest.yml (クリックで展開)

name: Ansible test

on: [push]

jobs:
  build:

    runs-on: macOS-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [2.7, 3.7]
        ansible-version: [2.7.13, 2.8.5]

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v1
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Ansible ${{ matrix.ansible-version }}
      run: |
        python -m pip install --upgrade pip
        pip install pycodestyle testinfra ansible-lint ansible==${{ matrix.ansible-version }}
    - name: Lint playbook
      run: |
        ansible-playbook site.yml --syntax-check
        ansible-lint site.yml
    - name: run playbook
      run: |
        ansible-playbook site.yml
    - name: run tests
      run: |
        pycodestyle -v roles
        py.test -v roles 

pycodestyleもtestinfra(py.test)もディレクトリを引数にするとそのディレクトリ配下から対象のファイルを探してテスト実行してくれるのでrolesディレクトリをまるっと指定しています。

これでコミットごとにAnsibleインストールから実行後のテストまで自動で実施されるようになりました。
直近のコミットでのテストはこんな感じになります。

version up ansible · koh-sh/macbook-playbook@6953381 · GitHub

まとめ

実際にmacセットアップ用のPlaybookに対してここまでがっつりCIでテストする必要はないような気がしますがGitHub Actions楽しいので良しとします。