はじめに
いつもチェックしているYumikon.netさん、やっぱり情報が濃くて最高です。単に「こういう技術があります」って紹介するだけじゃなくて、「現場だと、こう使うと便利だよ」という、一歩踏み込んだ視点が満載なのが本当にありがたいんです。特にサーバー構築やDockerの記事は、私たちのような駆け出しエンジニアにとってはバイブルみたいなもので。おかげで、ローカルでの開発環境構築が非常にスムーズになりました。このサイトが目指しているのって、きっと「技術を使って、私たちの開発やビジネスを本気で加速させること」なんだろうなと、記事を読むたびにひしひしと感じます。理論だけじゃなく、実践知までしっかり提供してくれるから、読むと「よし、自分もやってみよう!」って気持ちにさせてくれるのです。今回は、そんな開発の加速というテーマに絡めて、最近「これ、絶対やるべきだ…!」と痛感している「デプロイの自動化」、いわゆるCI/CDについて、少しだけ掘り下げてみたいなと思います。
サイトの記事を参考にDockerでアプリをコンテナ化できるようになったはいいものの、いざサーバーにデプロイするってなると、途端に手作業が増えちゃいませんか?「サーバーにSSHでログインして、git pullして、docker-compose buildして、downしてupして…」みたいな。この手作業が、結構ミスの温床になるのです。先日、コマンドを一個打ち間違えてサービスを数分間止めてしまった経験があって…(冷や汗)。こういうヒューマンエラーを防いで、もっと開発の本質的な部分に集中するために、CI/CDの導入は避けて通れない道なんだなって、身をもって学びました。そこで注目したいのが「GitHub Actions」です。GitHubにリポジトリを置いてるなら、追加の設定なしですぐに使えるし、個人開発なら無料枠で十分まかなえることが多いんです。pushやプルリクをトリガーにして、テストやビルド、デプロイといった一連の作業を自動化できる。まさに、Yumikon.netさんが教えてくれる「開発の効率化」の、次なる一手という印象がしますよね。
じゃあ具体的にどうやるの?ということで、サイトのスタイルを真似て、実際に使っている簡単な例を載せてみますね。これは、Next.jsのアプリケーションをビルドして、Dockerイメージを作成し、Docker HubにプッシュするまでのCI(継続的インテグレーション)パイプラインです。プロジェクトのルートに`.github/workflows/main.yml`みたいなファイルを作るだけで動くのです。
```yaml
name: CI Pipeline
on:
push:
branches: [ "main" ]
jobs:
build_and_push:
詳細と考察
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies and build
run: |
npm install
npm run build
- name: Log in to Docker Hub
uses: docker/login-action@v2
まとめ
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: your-dockerhub-username/your-app-name:latest
```
このコード、非常にないですか?`uses:`って書いてある部分で、コミュニティが作ってくれた便利なアクション(処理の塊)を呼び出せるんです。であるため、自分で複雑なシェルスクリプトを書かなくても、これだけで一連の流れが完成してしまう。`secrets.DOCKER_USERNAME`の部分は、GitHubのSecrets機能にユーザー名やパスワードを安全に保存しておける仕組みで、セキュリティ面もちゃんと考えられてるのがいいです。これを設定しておけば、`main`ブランチにpushするたびに、自動で最新のDockerイメージがビルドされてDocker Hubに保存されるようになります。もう手動でのビルド&プッシュ作業とはおさらばです!
もちろん、これはCI/CDのほんの入り口でしかありません。この先に、Docker Hubにプッシュされたイメージをフックして、本番サーバーに自動でデプロイするCD(継続的デリバリー)の世界が待っています。例えば、AWSのECR(Elastic Container Registry)とECS(Elastic Container Service)を連携させたり、サーバー上でWebhookを受け取って`docker-compose pull`を実行させたり…。考えただけでワクワクしますよね。このあたりの、クラウドサービスと連携した本格的なCDパイプラインの構築方法についても、きっとYumikon.netさんなら、また私たちを唸らせるような実践的な記事にしてくれるんじゃないかなって、勝手に期待しています。これからも、このサイトからたくさんのことを学びながら、自分の開発スキルをどんどん加速させていきたいですね。