この記事は GitHub Actions Advent Calendar 2019 の17日目の記事です
dotfilesのAnsibleスクリプトの実行をGitHubActionsでチェックできるようにした話です
経緯
前提
- 開発はWin機でCentOSのVMを立ち上げている
- Ubuntu(WSL)でも開発する(予定)
- プライベートではmacを使っている
- 開発環境を立ち上げるためにdotfilesのansibleスクリプトを実行している
課題感
- スクリプトの量が多く実行する機会もそんなに多くないため実際に使う時点で壊れているパターンが多かった
- その都度調べて手動で対応
- そのぶん時間がかかる
- その都度調べて手動で対応
- 使いたいときにサクッと立ち上げたい
- 失敗するにも事前に気付いて手を打ちたい
という課題感があるなか、GitHubActionsではMac, Windows, Ubuntu環境でjobを実行できるので開発環境の構築も途中でこけないかチェックできるのでは?と思いやってみた
下記のリポジトリで行った
- ディレクトリ構成
ansible
ディレクトリにAnsibleで使うファイルなどが置いてあるのでcd
してAnsibleを実行する流れになる
[dotfiles]$ tree . |-- README.md |-- ansible | |-- README.md | |-- ansible.cfg | |-- development.yml | |-- mac.yml | |-- ubuntu.yml ..... ..... .....
Ansibleの実行はローカル実行させるようにしている
Ansibleの細かい中身の話については今回言及しない
内容
mac(mac.yml)
mac用のプレイブックをチェックする
build-mac: runs-on: macos-latest name: 'ansible playbook mac' steps: - uses: actions/checkout@master - name: install ansible run: | brew install ansible - name: run ansible env: CI: true run: | ansible --version cd ansible ansible-playbook -i localhost, -c local mac.yml
プライベートのmacで使うためにbrewで入れるものだけしか書いてないが一応残しておいてある
そんなに実行機会もない気がするので手動で入れてしまって後から記述したものとかもあるがこの際チェック対象に入れる
CentOS7(development.yml)
CentOS7用のプレイブックをチェックする
メインはCentOSだが実行環境がないためdockerを使って実行するようにした
その際に下記に関しては対応が必要そうだったので今回は環境変数(CI)を見てスキップさせるかチェックするようにした(Ansible側での修正を行った)
- systemdでのサービス起動
- SELinuxの設定
- sysctl.confの設定変更
build-centos: runs-on: ubuntu-latest container: centos:7 name: 'ansible playbook centos' steps: - uses: actions/checkout@master - name: install ansible run: | yum install -y python2-setuptools gcc python2-devel easy_install pip pip install ansible - name: 'ansible playbook centos' env: CI: true run: | cd ansible ansible-playbook -i localhost, -c local development.yml
Ubuntu(ubuntu.yml)
WSL環境用に作ったplaybookをチェックする
sourceからインストールする系のものに関してはCentOSで書いたroleを流用できたので最低限必要そうな設定を入れた
WSL2が来たらメインの開発環境をこっちに移行したいと思っているので準備も兼ねて整備中
pexpectがansibleの実行で必要なため入れている
- job
build-ubuntu: runs-on: ubuntu-latest name: 'ansible playbook ubuntu' steps: - uses: actions/checkout@master - name: install ansible run: | sudo apt update sudo apt install software-properties-common sudo apt-add-repository --yes --update ppa:ansible/ansible sudo apt install ansible curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py sudo python get-pip.py pip install pexpect --user - name: run ansible env: CI: true run: | cd ansible ansible-playbook -i localhost, -c local ubuntu.yml --extra-vars user=runner
トリガ
Ansible関連のファイルに変更があった場合とスケジュール実行を行うようにした
スケジュール実行は、よくある「いつの間にかバージョンが上がっていてコケるようになっていた」というケースに気付くため
on: push: paths: - 'ansible/**' - '.github/workflows/ci-ansible.yml' schedule: - cron: '0 0 * * SAT'
毎週1回実行させるようにしている
実行されるとこんな感じ
lint
蛇足だがlintも入れた
lint: runs-on: ubuntu-latest name: 'lint' steps: - uses: actions/checkout@master - name: install ansible-lint yamllint run: | sudo apt update curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py sudo python get-pip.py pip install ansible-lint --user pip install yamllint --user - name: run yamllint env: CI: true run: | cd ansible ~/.local/bin/yamllint . - name: run ansible-lint env: CI: true run: | cd ansible ~/.local/bin/ansible-lint development.yml mac.yml ubuntu.yml
まとめ
まずは「実行時エラーで落ちないか」のみをチェックできるようにした
理想はテストツールを使って本当にインストールされたかどうかまでチェックしたいのでそれは今後やるかも
moleculeというAnsible公式で出ているツールがあるようなので触ってみたいところ
筆者の環境はAnsibleだがインストール用のシェルスクリプトでも同じようにできると思う
今回GitHubActionsで開発環境構築用のAnsibleを自動で実行させるようにしたことで
- 時間はかかるが自動で複数環境に対してAnsibleを実行できるのは便利
- 毎週実行することで意図せず挙動が変わって落ちてしまうなどの状況に気付ける
ということがわかった
ただ、書いてから気付いたがWindows機自体のセットアップ用にスクリプトは用意していなかったのでGitHubActionsでやる旨味はそこまで多くないなと思った