2024.04.08
Github ActionsとAnsibleを組み合わせでCI/CD体験してみる
こんにちは。次世代システム研究室のK.X.D.です。
はじめに
プロジェクト内では主にシステムのアプリ開発に関わってます、周りのCI/CDのツールをよく目にしても、知識不足でよくわからない部分が多いですので、
タスクをもっと円滑に進められるように、プロジェクトにあるAnsible、Github Actionsのツールを体験しみて、共有したいと思います。
やりたいこと:
検証環境ではリソース削減ために、複数のDockerイメージを1VMに乗せることが多いですので、
Github Actions, Ansibleを組み合わせてこのような仕組みで、自動ディプロイ環境を作成してみようと思います。

実装:
早速実装に入りたいと思います。
### 開発環境:DockerのCakephp環境として、進みたいと思います。

DockerFile :
FROM php:7.3-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
&& apt-get install -y unzip libicu-dev \
&& docker-php-ext-install intl \
&& docker-php-ext-install pdo_mysql \
&& a2enmod rewrite \
&& apt-get clean \
&& rm -fr /var/lib/apt/lists/*
WORKDIR /var/www/html/src/cakephp
COPY ../src /var/www/html
RUN chmod 777 logs/ && \
chmod -R 777 tmp/
WORKDIR /var/www/html
php.ini:
[Date] date.timezone = Asia/Tokyo engine = On short_open_tag = Off max_execution_time = 86400 memory_limit = -1 post_max_size = 128M upload_max_filesize = 128M error_reporting = E_ALL display_errors = 0 display_startup_errors = 0 log_errors = 0 default_charset = "UTF-8" expose_php = OFF session.cookie_httponly = On
srcフォルダ内のCakephpのソースコードです。

下記のコマンドを実行して、フレームワークのソースコードをダウンロードしました。
composer create-project --prefer-dist cakephp/app:~4.0 my_app_name
### ディプロイScript:.githubフォルダーにGithub ActionsのWorlflowsファイルとAnsibleのファイルを作成する

workflows/deploy.yml
name: deploy
on:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up containers
run: ./docker/build
- name: migrate local test database
run: docker exec ci-myapp /bin/sh -c "src/cakephp/bin/cake migrations migrate -c test"
- name: Run tests depending only on local network
run: docker exec ci-myapp /bin/sh -c "src/cakephp/vendor/bin/phpunit --configuration=src/cakephp/phpunit.xml src/cakephp/tests/TestCase"
build_and_push:
runs-on: ubuntu-latest
steps:
- name: Check out Repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to the GitHub Container Registry
uses: docker/login-action@v3
with:
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Docker Image
uses: docker/build-push-action@v5
with:
file: ./docker/php/Dockerfile
push: true
deploy:
runs-on: ubuntu-latest
needs: build_and_push
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Ansible and Docker modules
run: |
pip install ansible
ansible-galaxy collection install community.docker
- name: Create inventory from secret
run: echo "${{ secrets.HOST }}" > inventory
- name: Setup SSH Key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/key.pem
chmod 600 ~/.ssh/key.pem
ssh-keyscan -H ${{ secrets.HOST }} >> ~/.ssh/known_hosts
echo "Host *\n IdentityFile ~/.ssh/key.pem" > ~/.ssh/config
- name: Run Ansible Playbook
run: ansible-playbook -vvv -i inventory ./ansible/playbook.yml --private-key ~/.ssh/key.pem -u ubuntu
Github Actionsを開設します。
– Github Actionsのトリガは、MainブランチにPushされること
– jobs.test:Github Actionsサーバで、UnitTest用のContainerをビルド、データベースMigarationして、UnitTestを実行する
– jobs.deploy:Github Actionsサーバで、Ansibleのインストール、実行環境を実施する
実行環境はできみましたら、Ansibleのディプロイスクリプトを実行する
ansible/playbook.yml
- hosts: server
become: true
gather_facts: false
remote_user: user
roles:
- rotate-containers
ansible/roles/rotate-containers/task/main.yml
- name: docker login
shell: |
METADATA=http://metadata.google.internal/computeMetadata/v1
SVC_ACCT=$METADATA/instance/service-accounts/default
ACCESS_TOKEN=$(curl -H 'Metadata-Flavor: Google' $SVC_ACCT/token | cut -d'"' -f 4)
docker login -u oauth2accesstoken -p $ACCESS_TOKEN https://asia-northeast1-docker.pkg.dev
- name: docker pull
shell: |
docker pull {{Docker Image Repogistories URL}}
- name: docker run
shell: |
docker kill ci-myapp || true && docker rm ci-myapp || true && \
docker run -d --name ci-myapp \
-p 80:80 \
asia-northeast1-docker.pkg.dev/ci-myapp/docker/cakephp
- name: docker image prune
shell: docker image prune -f
- name: provision
shell: |
docker exec -t ci-myapp sh -c '
src/cakephp/bin/cake migrations migrate
src/cakephp/bin/cake cache clear_all
'
上記のAnsible内容を開設します。
– Docker Repositoriesにログインする
– Github ActionsでビルドしたDocker ImageをPullする
– Docker Imageからコンテナを立ち上げる
– 立ち上げたコンテナにログインして、DBマイグレーションを実行する
まとめ
今回のブログでは、Github ActionsとAnsibleの組み合わせで、綺麗なCI/CDのScriptを作成しました。
Ansibleは自動Deploy Script作成以外にも、VMサーバのConfigure管理するには強いツールです、
実際のシステム用途に合わせて、こういうようなScriptを拡張してAnsibleを使いこなせば、CI/CDで色々自動化できるかと考えてます。
ご参考になれましたら、幸いです。
最後に
グループ研究開発本部 次世代システム研究室では、最新のテクノロジーを調査・検証しながらインターネット上の高度なアプリケーション開発を行うエンジニア・アーキテクトを募集しています。募集職種一覧からご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD

