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