From d190734e84b47568baf418941149a27cc2b6110e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Sch=C3=B6ldstr=C3=B6m?= Date: Wed, 3 Feb 2016 14:48:05 -0500 Subject: [PATCH 1/4] Add initial docker setup --- .travis.yml | 73 +++++++++++++++++++++-------------- tasks/setup-Debian.yml | 2 +- tests/Dockerfile.centos-6 | 15 +++++++ tests/Dockerfile.centos-7 | 27 +++++++++++++ tests/Dockerfile.ubuntu-12.04 | 11 ++++++ tests/Dockerfile.ubuntu-14.04 | 11 ++++++ tests/test.yml | 5 +-- 7 files changed, 112 insertions(+), 32 deletions(-) create mode 100644 tests/Dockerfile.centos-6 create mode 100644 tests/Dockerfile.centos-7 create mode 100644 tests/Dockerfile.ubuntu-12.04 create mode 100644 tests/Dockerfile.ubuntu-14.04 diff --git a/.travis.yml b/.travis.yml index f794fb4..ba4db13 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,55 +1,72 @@ --- -language: python -python: "2.7" +sudo: required env: - - SITE=test.yml + matrix: + - distribution: centos + version: 6 + init: /sbin/init + run_opts: "" + - distribution: centos + version: 7 + init: /usr/lib/systemd/systemd + run_opts: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" + - distribution: ubuntu + version: 14.04 + init: /sbin/init + run_opts: "" + - distribution: ubuntu + version: 12.04 + init: /sbin/init + run_opts: "" + global: + - testfile: test.yml -before_install: - - sudo apt-get update -qq - - # Remove MySQL. Completely and totally. - - sudo apt-get remove --purge 'mysql*' - - sudo apt-get autoremove - - sudo apt-get autoclean - - sudo rm -rf /var/lib/mysql - - sudo truncate -s 0 /var/log/mysql/error.log - -install: - # Install Ansible. - - pip install ansible +services: + - docker - # Add ansible.cfg to pick up roles path. - - "{ echo '[defaults]'; echo 'roles_path = ../'; } >> ansible.cfg" +before_install: + # Pull container + - 'sudo docker pull ${distribution}:${version}' + # Customize container + - 'sudo docker build --rm=true --file=tests/Dockerfile.${distribution}-${version} --tag=${distribution}-${version}:ansible tests' script: - # Check the role/playbook's syntax. - - "ansible-playbook -i tests/inventory tests/$SITE --syntax-check" + - container_id=$(mktemp) + # Run container in detached state + - 'sudo docker run --detach --volume="${PWD}":/etc/ansible/roles/role_under_test:ro ${run_opts} ${distribution}-${version}:ansible "${init}" > "${container_id}"' + + # Ansible syntax check. + - 'sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/${testsite} --syntax-check' - # Run the role/playbook with ansible-playbook. - - "ansible-playbook -i tests/inventory tests/$SITE --connection=local --sudo" + # Test role. + - 'sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/${testsite}' - # Run the role/playbook again, checking to make sure it's idempotent. + # Test role idempotence. - > - ansible-playbook -i tests/inventory tests/$SITE --connection=local --sudo + sudo docker exec "$(cat ${container_id})" ansible-playbook /etc/ansible/roles/role_under_test/tests/${testsite} | grep -q 'changed=0.*failed=0' && (echo 'Idempotence test: pass' && exit 0) || (echo 'Idempotence test: fail' && exit 1) # Some MySQL debugging (show all the logs). - - "sudo ls -lah /var/log" - - "sudo cat /var/log/mysql/error.log" + - sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ls -lah /var/log + - sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm cat /var/log/mysql/error.log || true + - sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm cat /var/log/mysql.err || true # Check to make sure we can connect to MySQL via Unix socket. - > - mysql -u root -proot -e 'show databases;' + sudo docker exec "$(cat ${container_id})" mysql -u root -proot -e 'show databases;' | grep -q 'performance_schema' && (echo 'MySQL running normally' && exit 0) || (echo 'MySQL not running' && exit 1) # Check to make sure we can connect to MySQL via TCP. - > - mysql -u root -proot -h 127.0.0.1 -e 'show databases;' + sudo docker exec "$(cat ${container_id})" mysql -u root -proot -h 127.0.0.1 -e 'show databases;' | grep -q 'performance_schema' && (echo 'MySQL running normally' && exit 0) || (echo 'MySQL not running' && exit 1) + + # Clean up + - 'sudo docker stop "$(cat ${container_id})"' diff --git a/tasks/setup-Debian.yml b/tasks/setup-Debian.yml index 1158456..4ead891 100644 --- a/tasks/setup-Debian.yml +++ b/tasks/setup-Debian.yml @@ -18,7 +18,7 @@ # Because Ubuntu starts MySQL as part of the install process, we need to stop # mysql and remove the logfiles in case the user set a custom log file size. - name: Ensure MySQL is stopped after initial install. - service: name=mysql state=stopped + service: "name={{ mysql_daemon }} state=stopped" when: mysql_installed.stat.exists == false - name: Delete innodb log files created by apt package after initial install. diff --git a/tests/Dockerfile.centos-6 b/tests/Dockerfile.centos-6 new file mode 100644 index 0000000..4a4e7b8 --- /dev/null +++ b/tests/Dockerfile.centos-6 @@ -0,0 +1,15 @@ +FROM centos:6 + +# Install Ansible +RUN yum -y update; yum clean all; +RUN yum -y install epel-release +RUN yum -y install git ansible sudo +RUN yum clean all + +# Disable requiretty +RUN sed -i -e 's/^\(Defaults\s*requiretty\)/#--- \1/' /etc/sudoers + +# Install Ansible inventory file +RUN echo -e '[local]\nlocalhost ansible_connection=local' > /etc/ansible/hosts + +CMD ["/usr/sbin/init"] diff --git a/tests/Dockerfile.centos-7 b/tests/Dockerfile.centos-7 new file mode 100644 index 0000000..8aa0654 --- /dev/null +++ b/tests/Dockerfile.centos-7 @@ -0,0 +1,27 @@ +FROM centos:7 + +# Install systemd -- See https://hub.docker.com/_/centos/ +RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs +RUN yum -y update; yum clean all; \ +(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ +rm -f /lib/systemd/system/multi-user.target.wants/*; \ +rm -f /etc/systemd/system/*.wants/*; \ +rm -f /lib/systemd/system/local-fs.target.wants/*; \ +rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ +rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ +rm -f /lib/systemd/system/basic.target.wants/*; \ +rm -f /lib/systemd/system/anaconda.target.wants/*; + +# Install Ansible +RUN yum -y install epel-release +RUN yum -y install git ansible sudo +RUN yum clean all + +# Disable requiretty +RUN sed -i -e 's/^\(Defaults\s*requiretty\)/#--- \1/' /etc/sudoers + +# Install Ansible inventory file +RUN echo -e '[local]\nlocalhost ansible_connection=local' > /etc/ansible/hosts + +VOLUME ["/sys/fs/cgroup"] +CMD ["/usr/sbin/init"] diff --git a/tests/Dockerfile.ubuntu-12.04 b/tests/Dockerfile.ubuntu-12.04 new file mode 100644 index 0000000..d0c130c --- /dev/null +++ b/tests/Dockerfile.ubuntu-12.04 @@ -0,0 +1,11 @@ +FROM ubuntu:12.04 +RUN apt-get update + +# Install Ansible +RUN apt-get install -y software-properties-common python-software-properties git +RUN apt-add-repository -y ppa:ansible/ansible +RUN apt-get update +RUN apt-get install -y ansible + +# Install Ansible inventory file +RUN echo "[local]\nlocalhost ansible_connection=local" > /etc/ansible/hosts diff --git a/tests/Dockerfile.ubuntu-14.04 b/tests/Dockerfile.ubuntu-14.04 new file mode 100644 index 0000000..ca33287 --- /dev/null +++ b/tests/Dockerfile.ubuntu-14.04 @@ -0,0 +1,11 @@ +FROM ubuntu:14.04 +RUN apt-get update + +# Install Ansible +RUN apt-get install -y software-properties-common git +RUN apt-add-repository -y ppa:ansible/ansible +RUN apt-get update +RUN apt-get install -y ansible + +# Install Ansible inventory file +RUN echo "[local]\nlocalhost ansible_connection=local" > /etc/ansible/hosts diff --git a/tests/test.yml b/tests/test.yml index bfe6c6c..0ed0b43 100644 --- a/tests/test.yml +++ b/tests/test.yml @@ -1,5 +1,4 @@ --- -- hosts: localhost - remote_user: root +- hosts: all roles: - - ansible-role-mysql + - role_under_test From 88409e2079a2343b4d7bc71639803e82be8c5567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Sch=C3=B6ldstr=C3=B6m?= Date: Wed, 3 Feb 2016 17:41:01 -0500 Subject: [PATCH 2/4] add separate test playbook for centos7 --- .travis.yml | 45 +++++++++++++++++++++-------------------- tests/centos-7-test.yml | 15 ++++++++++++++ 2 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 tests/centos-7-test.yml diff --git a/.travis.yml b/.travis.yml index ba4db13..09fee78 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,25 +2,26 @@ sudo: required env: - matrix: - - distribution: centos - version: 6 - init: /sbin/init - run_opts: "" - - distribution: centos - version: 7 - init: /usr/lib/systemd/systemd - run_opts: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" - - distribution: ubuntu - version: 14.04 - init: /sbin/init - run_opts: "" - - distribution: ubuntu - version: 12.04 - init: /sbin/init - run_opts: "" - global: - - testfile: test.yml + - distribution: centos + version: 6 + init: /sbin/init + run_opts: "" + playbook: test.yml + - distribution: centos + version: 7 + init: /usr/lib/systemd/systemd + run_opts: "--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" + playbook: centos-7-test.yml + - distribution: ubuntu + version: 14.04 + init: /sbin/init + run_opts: "" + playbook: test.yml + - distribution: ubuntu + version: 12.04 + init: /sbin/init + run_opts: "" + playbook: test.yml services: - docker @@ -37,14 +38,14 @@ script: - 'sudo docker run --detach --volume="${PWD}":/etc/ansible/roles/role_under_test:ro ${run_opts} ${distribution}-${version}:ansible "${init}" > "${container_id}"' # Ansible syntax check. - - 'sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/${testsite} --syntax-check' + - 'sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/${playbook} --syntax-check' # Test role. - - 'sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/${testsite}' + - 'sudo docker exec --tty "$(cat ${container_id})" env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/${playbook}' # Test role idempotence. - > - sudo docker exec "$(cat ${container_id})" ansible-playbook /etc/ansible/roles/role_under_test/tests/${testsite} + sudo docker exec "$(cat ${container_id})" ansible-playbook /etc/ansible/roles/role_under_test/tests/${playbook} | grep -q 'changed=0.*failed=0' && (echo 'Idempotence test: pass' && exit 0) || (echo 'Idempotence test: fail' && exit 1) diff --git a/tests/centos-7-test.yml b/tests/centos-7-test.yml new file mode 100644 index 0000000..57a6171 --- /dev/null +++ b/tests/centos-7-test.yml @@ -0,0 +1,15 @@ +--- +- hosts: all + vars: + mysql_packages: + - mariadb + - mariadb-server + - mariadb-libs + - MySQL-python + - perl-DBD-MySQL + mysql_daemon: mariadb + mysql_log_error: /var/log/mariadb/mariadb.log + mysql_syslog_tag: mariadb + mysql_pid_file: /var/run/mariadb/mariadb.pid + roles: + - role_under_test From 7038d6ed6103e957a4c6e7c23d2a1043114702e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Sch=C3=B6ldstr=C3=B6m?= Date: Thu, 4 Feb 2016 13:18:50 -0500 Subject: [PATCH 3/4] fix connection tests failing on centos6 as performance_schema db does not exist --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 09fee78..2d7eed5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,14 +58,14 @@ script: # Check to make sure we can connect to MySQL via Unix socket. - > sudo docker exec "$(cat ${container_id})" mysql -u root -proot -e 'show databases;' - | grep -q 'performance_schema' + | grep -q 'information_schema' && (echo 'MySQL running normally' && exit 0) || (echo 'MySQL not running' && exit 1) # Check to make sure we can connect to MySQL via TCP. - > sudo docker exec "$(cat ${container_id})" mysql -u root -proot -h 127.0.0.1 -e 'show databases;' - | grep -q 'performance_schema' + | grep -q 'information_schema' && (echo 'MySQL running normally' && exit 0) || (echo 'MySQL not running' && exit 1) From 6e9b80c1939fd778d020372bc95cfc8897c6dc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oskar=20Sch=C3=B6ldstr=C3=B6m?= Date: Thu, 4 Feb 2016 12:57:55 -0500 Subject: [PATCH 4/4] Add a custom initctl script to fix Ubuntu 14.04. Disable 12.04 --- .travis.yml | 12 ++++++------ tests/Dockerfile.ubuntu-12.04 | 3 +++ tests/Dockerfile.ubuntu-14.04 | 3 +++ tests/initctl_faker | 23 +++++++++++++++++++++++ 4 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 tests/initctl_faker diff --git a/.travis.yml b/.travis.yml index 2d7eed5..e8e064c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,11 +17,11 @@ env: init: /sbin/init run_opts: "" playbook: test.yml - - distribution: ubuntu - version: 12.04 - init: /sbin/init - run_opts: "" - playbook: test.yml + # - distribution: ubuntu + # version: 12.04 + # init: /sbin/init + # run_opts: "" + # playbook: test.yml services: - docker @@ -70,4 +70,4 @@ script: || (echo 'MySQL not running' && exit 1) # Clean up - - 'sudo docker stop "$(cat ${container_id})"' + - sudo docker stop "$(cat ${container_id})" diff --git a/tests/Dockerfile.ubuntu-12.04 b/tests/Dockerfile.ubuntu-12.04 index d0c130c..8aebd65 100644 --- a/tests/Dockerfile.ubuntu-12.04 +++ b/tests/Dockerfile.ubuntu-12.04 @@ -7,5 +7,8 @@ RUN apt-add-repository -y ppa:ansible/ansible RUN apt-get update RUN apt-get install -y ansible +COPY initctl_faker . +RUN chmod +x initctl_faker && rm -fr /sbin/initctl && ln -s /initctl_faker /sbin/initctl + # Install Ansible inventory file RUN echo "[local]\nlocalhost ansible_connection=local" > /etc/ansible/hosts diff --git a/tests/Dockerfile.ubuntu-14.04 b/tests/Dockerfile.ubuntu-14.04 index ca33287..f81cabe 100644 --- a/tests/Dockerfile.ubuntu-14.04 +++ b/tests/Dockerfile.ubuntu-14.04 @@ -7,5 +7,8 @@ RUN apt-add-repository -y ppa:ansible/ansible RUN apt-get update RUN apt-get install -y ansible +COPY initctl_faker . +RUN chmod +x initctl_faker && rm -fr /sbin/initctl && ln -s /initctl_faker /sbin/initctl + # Install Ansible inventory file RUN echo "[local]\nlocalhost ansible_connection=local" > /etc/ansible/hosts diff --git a/tests/initctl_faker b/tests/initctl_faker new file mode 100644 index 0000000..a2267f3 --- /dev/null +++ b/tests/initctl_faker @@ -0,0 +1,23 @@ +#!/bin/sh +ALIAS_CMD="$(echo ""$0"" | sed -e 's?/sbin/??')" + +case "$ALIAS_CMD" in + start|stop|restart|reload|status) + exec service $1 $ALIAS_CMD + ;; +esac + +case "$1" in + list ) + exec service --status-all + ;; + reload-configuration ) + exec service $2 restart + ;; + start|stop|restart|reload|status) + exec service $2 $1 + ;; + \?) + exit 0 + ;; +esac