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
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事