CD - ステージング環境へのデプロイ

LinuxBeginner
オンラインで実践に進む

はじめに

継続的デプロイ(CD)とは、検証済みのソフトウェアを実行可能な環境へ届ける段階です。

ソフトウェア工場の例をもう一度考えてみましょう。

  1. CI:ロボットが不具合をチェックします。
  2. Artifact:ロボットが製品を箱に詰めます。
  3. CD:配送トラックが箱を店舗(サーバー)へ運び、お客様が使えるようにします。

実際のデプロイでは、SSH、API、またはプラットフォーム固有のリリース機能を使って、稼働中のシステムを更新することがよくあります。この実験では、そのプロセスをシミュレーションします。ただし、ここで重要なのは、テスト済みのコードを実行環境へ届ける流れです。

CI と CD の中心的な違いはここにあります。CI は、ソフトウェアの変更がリリースを検討できるほど健全であることを確認します。一方、CD は、検証済みの変更を環境へ制御された形で移動させます。

この実験では、次のことを行います。

  • Manual Triggers(クリックしてデプロイ)の概念を学びます。
  • 実際のプロセスをシミュレーションするデプロイワークフローを作成します。
  • 「配送トラック」(CD)を「品質管理」(CI)につなげます。

前提条件

引き続き github-actions-basics リポジトリを使用します。

手動デプロイを作成する

コードを push するたびに、必ずデプロイしたいとは限りません。承認を待ったり、準備が整ったときだけデプロイしたりする場合があります。

そのため、手動トリガーと段階的な環境がよく使われます。デリバリーパイプラインでは、成功したビルドをすぐに本番環境へデプロイするのではなく、速度と運用上の慎重さのバランスを取ることがよくあります。

GitHub Actions では、ボタンをクリックしたときだけ実行されるワークフローを作成できます。これは workflow_dispatch トリガーを使用して設定します。

プロジェクトのワークフローディレクトリへ移動します。

cd ~/project
git clone https://github.com/your-username/github-actions-basics.git
cd github-actions-basics

注:your-username を実際の GitHub ユーザー名に置き換えてください。

deploy.yml という新しいファイルを作成します。

touch .github/workflows/deploy.yml

nano でファイルを開きます。

nano .github/workflows/deploy.yml

次の内容を追加します。

name: Deploy to Production

on: workflow_dispatch

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploying
        run: echo "Starting deployment..."

on: workflow_dispatch に注目してください。これが手動実行用のボタンになります。

nano でファイルを保存して終了し、その後このファイルを GitHub へ push します。

git add .
git commit -m "Add manual deployment workflow"
git push

次に、GitHub の Actions タブを開きます。

  1. 左側のサイドバーで Deploy to Production をクリックします。
  2. 「This workflow has a dispatch event trigger.」と表示された青いバナーを確認します。
  3. Run workflow ボタンをクリックし、ドロップダウンに表示される緑色の Run workflow ボタンをクリックします。

Run workflow

これで、デプロイパイプラインを手動で実行できました。

デプロイ手順をシミュレーションする

実際のデプロイスクリプトは複雑になることがありますが、通常は次のような単純な流れに従います。

  1. サーバーに接続する。
  2. ソフトウェアの新しいバージョンを取得する。
  3. アプリケーションを再起動する。

実装の詳細が異なっていても、多くのデプロイパイプラインは、認証し、目的のアーティファクトを取得し、実行中の環境でそのアーティファクトを使用するという基本的な構成になります。

この流れをシミュレーションするため、deploy.yml を更新します。echo コマンドを使って、実際に行われる処理を表示します。

もう一度ファイルを開きます。

nano .github/workflows/deploy.yml

jobs セクションを、次の詳細なシミュレーション内容に置き換えます。

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Mock SSH Connection
        run: echo "Connecting to production server at 192.168.1.1..."

      - name: Pull New Image
        run: |
          echo "Logging into Registry..."
          echo "Pulling image ghcr.io/myname/app:latest..."

      - name: Restart Application
        run: |
          echo "Stopping old container..."
          echo "Starting new container..."
          echo "Deployment Successful!"

保存して終了し、変更を push します。

git add .
git commit -m "Update deployment steps"
git push

GitHub Actions に戻り、Deploy to Production ワークフローをもう一度手動で実行します。ログを確認してください。実際のデプロイと同じように見えるはずです。

Run workflow

この「Mock」手法は、実際にとても役立ちます。実務では、複雑なコードを書く前に、プロセスについて合意するため、まずこのような「Skeleton」ワークフローを作成することがよくあります。

安全性チェックを追加する

現在、「Deploy」ワークフローは「Test」(CI)ワークフローから完全に独立しています。しかし実際には、壊れたコードをデプロイしてはいけません。品質チェックに合格した場合だけ、配送トラックを出発させます。

needs キーワードを使うとワークフローを連携できます。ただし、needs は 1 つのファイル内で使用する場合に最も適しています。別々のファイルを使う場合は、通常、CI を Push で実行し、CD を Release または手動で実行するという運用で管理します。

ここでは、手動デプロイにも安全性チェックを追加する方法を学びます。確実に問題がないと判断した場合だけデプロイすることにします。

deploy.yml を開きます。

nano .github/workflows/deploy.yml

steps に確認処理を追加するため、内容を変更します。

steps:
  - name: Safety Check
    run: echo " verifying that CI passed..."

  - name: Mock SSH Connection
    run: echo "Connecting to production server at 192.168.1.1..."
  ## ... rest of the file

(注:実際の Enterprise 環境では、GitHub Environments という機能を使って、このジョブを実行する前に「CI に合格していること」を必須にできます。ただし、その設定にはこのファイル以外の構成が必要です。)

今はファイルを保存して終了し、変更を push します。

git add .
git commit -m "Add safety check"
git push

最後に、ワークフローをもう一度手動で実行します。

まとめ

おめでとうございます。GitHub Actions CICD モジュールを完了しました。

この最後の実験では、次のことを学びました。

  • Manual Triggers:workflow_dispatch を使って、制御されたデプロイを行う方法。
  • Simulation:Mock ステップを使って、デプロイプロセスを試作する方法。
  • 全体像:CI、Artifacts、Security、CD がどのように連携するか。

GitHub Actions の知識がない状態から始めましたが、今では自動テスト、パッケージ化、デプロイスクリプトを備えた、完全に機能するリポジトリができました。これで、自分のプロジェクトの自動化を始める準備が整いました。