Ansible Moleculeでテストを実行する時にテスト対象になるDockerイメージの作成方法について解説します。
今回はGitHub Actionsを用いてGitHubコンテナレジストリへDockerイメージを登録するまでになります。
なぜテスト環境用のDockerイメージを作成、登録するのか?
- CIの実行時間を短縮するため
- コードの記述量を減らしメンテナンスしやすくする
これらの理由が考えられます。
CIの実行時間を短くする
Moleculeの機能から言えばMolecule実行時にDockerfileからテスト環境用のコンテナを作成する事は可能です。しかし毎回イメージをビルド、コンテナを起動しているとCIの実行時間が長くなってしまいます。
コードの記述量を減らしメンテナンスしやすくする
テスト環境用のDockerfileを一箇所で管理する事によりメンテナンスコストが減らせます。例えばAnsible Role / Playbookでリポジトリがそれぞれ分かれていてなおかつそれぞれのリポジトリでDcokerfileが管理されている場合Dockerfileに変更が生じると全てのリポジトリに対して修正を行う必要が出てきます。これは相当悪手なので絶対に避けます。
ゴールデンイメージの仕様
ゴールデンイメージの設計図となるDockerfileには以下を含めます
- イメージのアップデート処理
- Ansibleを実行するユーザーの作成
- Ansible実行ユーザーへroot権限の付与
sshdはインストールしない?
Ansibleは標準でDockerコンテナへの実行をサポートしています。そのためsshdはインストールしません。
イメージのビルドの頻度は?
毎日が理想だと思います。減るものでもないのでcron等で自動化しておくと良いでしょう。
Dockerfileのサンプル例
FROM centos:8
# Install requirements
RUN dnf clean all \
&& dnf update -y \
&& dnf install -y sudo
# Create `ansible` user with sudo permissions
ENV ANSIBLE_USER=ansible SUDO_GROUP=wheel
RUN set -xe \
&& groupadd -r ${ANSIBLE_USER} \
&& useradd -m -g ${ANSIBLE_USER} ${ANSIBLE_USER} \
&& usermod -aG ${SUDO_GROUP} ${ANSIBLE_USER} \
&& sed -i "/^%${SUDO_GROUP}/s/ALL\$/NOPASSWD:ALL/g" /etc/sudoers
GitHub Actoinsのサンプルファイル
---
name: build
on: [deployment, push]
jobs:
github-container-registory:
runs-on: ubuntu-latest
strategy:
matrix:
base-image: [centos7, centos7jp, centos8]
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Login to GitHub container resigtory
uses: docker/login-action@v1
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.CR_PAT}}
- name: Build and push
uses: docker/build-push-action@v2
with:
file: ${{ matrix.base-image }}/Dockerfile
push: true
tags: ghcr.io/org/repo/${{ matrix.base-image }}:latest