shibomb

GitHub ActionsでWebアプリのデプロイを自動化!失敗しないCI/CDワークフローを組む

Webアプリケーションを開発し、いざリリース!という場面で、「手順が多くて大変」「手作業だからミスが怖い…」と感じたことはありませんか?ローカルで完璧に動作するコードを書いても、サーバーに反映するデプロイ作業がボトルネックになるケースは少なくありません。「git pushしたら、あとは自動でデプロイまで完了してくれたら…」そんな願いを叶えてくれるのが、CI/CD という仕組みです。この記事では、GitHubに標準で組み込まれている GitHub Actions を使って、Webアプリの デプロイ自動化 を実現する第一歩を、具体的な設定例とともに解説します。

CI/CDとは?なぜGitHub Actionsを選ぶべきなのか

まず、CI/CDという言葉の意味から確認しましょう。これは、ソフトウェア開発のプロセスを自動化し、より速く、より安全にユーザーへ価値を届けるためのプラクティスです。

  • CI (Continuous Integration / 継続的インテグレーション): 開発者が書いたコードを、main ブランチのような中心的なリポジトリに頻繁にマージする開発手法です。コードがマージされるたびに、ビルドやテストが自動的に実行されます。これにより、コードの競合やバグを早期に発見できます。
  • CD (Continuous Delivery / Continuous Deployment / 継続的デリバリー・継続的デプロイ): CIのプロセスを通過したコードを、本番環境へリリースできる状態に自動で準備(デリバリー)、あるいは実際にリリース(デプロイ)するプロセスです。手動でのデプロイ作業をなくし、ヒューマンエラーを防ぎながら、迅速なリリースを実現します。

このCI/CDを実現するツールはJenkinsやCircleCIなど様々ですが、これから始める方には GitHub Actions を強くおすすめします。その理由は、GitHubに完全に統合されている点にあります。追加のサービスに登録することなく、いつも使っているGitHubリポジトリ上で設定を完結できる手軽さは、他のツールにはない大きな魅力です。また、豊富なテンプレートやコミュニティが作成した「アクション」を組み合わせることで、複雑な自動化も比較的簡単に構築できます。

GitHub Actionsの基本構成:ワークフロー・ジョブ・ステップを理解する

GitHub Actionsを使いこなすには、3つの基本要素の関係を理解することが重要です。これらは階層構造になっており、設定ファイルである YAML ファイルに記述していきます。

  1. ワークフロー (Workflow) 特定のイベント(例: main ブランチへのプッシュ、Pull Requestの作成)をきっかけに実行される、一連の自動化プロセスの全体像です。1つのリポジトリに複数のワークフローを定義できます。ワークフローは .github/workflows/ ディレクトリに置かれた YAML ファイルによって定義されます。

  2. ジョブ (Job) ワークフローを構成する1つの実行単位です。各ジョブは、仮想マシンやコンテナといった独立した環境(ランナーと呼ばれます)で実行されます。デフォルトでは複数のジョブは並列に実行されますが、「テストジョブが成功したら、デプロイジョブを実行する」といったように、実行順序を制御することも可能です。

  3. ステップ (Step) ジョブの中で実行される個々のタスクです。シェルコマンドを実行したり、特定のアクション(再利用可能なコードの部品)を呼び出したりします。ステップは上から下に順番に実行され、1つでも失敗するとジョブ全体が失敗します。

これらの関係をYAMLファイルで表現すると、以下のようになります。この構造さえ覚えてしまえば、基本的なワークフローはすぐに読めるようになります。

# ワークフローの名前
name: CI/CD Workflow

# 1. ワークフローのトリガー (いつ実行するか)
on:
  push:
    branches: [ main ]

# 2. ジョブの定義
jobs:
  # ジョブの名前 (任意)
  build:
    # ジョブの実行環境
    runs-on: ubuntu-latest
    
    # 3. ステップの定義
    steps:
      # ステップ1: コードをチェックアウトするアクション
      - name: Checkout repository
        uses: actions/checkout@v4

      # ステップ2: コマンドを実行する
      - name: Run a one-line script
        run: echo Hello, world!

実践!シンプルなWebアプリのデプロイ自動化ワークフローを構築しよう

それでは、実際に静的なWebサイト(HTML, CSS, JavaScriptのみで構成されるサイト)を、GitHub Pagesへ自動デプロイするワークフローを作成してみましょう。main ブランチにプッシュされるたびに、サイトが自動で公開されるように設定します。

まず、リポジトリのルートに .github/workflows/ というディレクトリを作成し、その中に deploy.yml のような名前でYAMLファイルを作成します。そして、以下の内容を記述してください。

name: Deploy to GitHub Pages

# mainブランチにpushされたときにワークフローを実行
on:
  push:
    branches:
      - main
  # 手動でも実行できるようにする
  workflow_dispatch:

# ジョブを定義
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 1. リポジトリのコードをチェックアウト
      - name: Checkout
        uses: actions/checkout@v4

      # 2. Node.js環境をセットアップ (もしReactやVueなどでビルドが必要な場合)
      # - name: Setup Node.js
      #   uses: actions/setup-node@v4
      #   with:
      #     node-version: '22'
      # - name: Install dependencies
      #   run: npm ci
      # - name: Build
      #   run: npm run build

      # 3. GitHub Pagesへデプロイ
      - name: Deploy to GitHub Pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          # GitHub Actionsが自動で生成するトークン
          github_token: ${{ secrets.GITHUB_TOKEN }}
          # デプロイするファイルが含まれるディレクトリ
          # ビルド成果物が `dist` ディレクトリに生成される場合は `./dist` と指定
          publish_dir: ./ 

このファイルをリポジトリに追加して main ブランチにプッシュすると、自動的に「Actions」タブでワークフローが実行され、GitHub Pagesにサイトがデプロイされます。デプロイ先は、リポジトリの「Settings」→「Pages」で確認・設定できます。ビルドプロセスがないシンプルなHTMLサイトなら、publish_dir を ./ (ルートディレクトリ) にするだけでOKです。

よくあるデプロイ失敗パターンと解決策

ワークフローを自作していると、最初はうまくいかず、赤い「X」マークにがっかりすることもあるでしょう。ここでは、初心者が陥りがちな失敗パターンとその解決策を紹介します。

認証情報やシークレットキーの間違い

外部のサーバー(例: AWS, Vercel)へデプロイする場合、APIキーやSSHキーといった認証情報が必要になります。これらはリポジトリの「Settings」→「Secrets and variables」→「Actions」で設定しますが、よくあるのがシークレット名のタイプミスです。ワークフローファイル内で ${{ secrets.MY_API_KEY }} のように参照する名前と、設定画面で登録した名前が完全に一致しているか、大文字・小文字も含めて確認しましょう。

ビルド成果物のパス指定ミス

ReactやVue.jsなどのフレームワークを使ったプロジェクトでは、npm run build のようなコマンドでデプロイ用の静的ファイル一式を生成します。この成果物が出力されるディレクトリ(dist, build, out など)のパスを、デプロイ用アクションのパラメータ(例: publish_dir)で正しく指定する必要があります。ローカルでビルドを実行し、どのディレクトリにファイルが生成されるかを確認してから設定するのが確実です。

依存パッケージのインストール漏れ

ビルドやテストには、package.json に記載されたライブラリが必要です。ワークフローの実行環境は毎回クリーンな状態で起動するため、ビルドコマンドを実行する前に、必ず npm install や npm ci のようなコマンドで依存パッケージをインストールするステップを追加してください。このステップを忘れると、「command not found」といったエラーが発生します。

ワークフローが失敗したときは、焦らずにGitHubの「Actions」タブから該当の実行ログを確認しましょう。エラーメッセージを丁寧に読めば、ほとんどの場合、原因のヒントがそこに書かれています。

さらに進んだCI/CD:テスト自動化とキャッシュ戦略

デプロイの自動化に慣れてきたら、CI/CDプロセスをさらに強化していきましょう。品質を担保し、実行時間を短縮するための2つの重要なテクニックを紹介します。

テスト自動化

デプロイする前に、必ずテストを実行するステップを組み込むことで、バグのあるコードが本番環境にリリースされるのを防げます。test ジョブと deploy ジョブを分け、needs を使って test ジョボが成功した場合にのみ deploy が実行されるように設定するのが一般的です。

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci
      - run: npm test # ここでテストを実行

  deploy:
    runs-on: ubuntu-latest
    # testジョブの成功を待ってから実行
    needs: test 
    steps:
      # ... デプロイ処理

キャッシュ戦略

npm install などでダウンロードする依存パッケージは、毎回ダウンロードすると時間がかかります。actions/cache アクションを使うと、これらのパッケージをキャッシュし、次回のワークフロー実行時に再利用できます。これにより、特に大規模なプロジェクトで実行時間を大幅に短縮できます。package-lock.json ファイルのハッシュ値をキーにすることで、依存関係が変更されたときだけキャッシュを更新する、といった賢い制御が可能です。

- name: Cache node modules
  uses: actions/cache@v4
  with:
    path: ~/.npm # キャッシュするディレクトリ
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

チーム開発でGitHub Actionsを最大限に活用するヒント

個人開発だけでなく、チームで開発を進める上でGitHub Actionsはさらに強力な武器になります。

Pull Requestが作成・更新されたのをトリガー (on: [pull_request]) にして、テストやコードフォーマッター(Lint)を自動実行するワークフローは、チーム開発の「鉄板」設定です。レビュー担当者は、まずCIが成功している(緑のチェックマークが付いている)ことを確認してからコードレビューを始めることで、基本的な品質が担保されている状態でレビューに集中できます。

さらに、GitHubの ブランチ保護ルール と組み合わせることを強く推奨します。main ブランチに対して、「CIのテストジョブが成功しないとマージできない」というルールを設定すれば、テストが失敗するようなコードが誤ってマージされる事態をシステム的に防げます。これにより、コードレビューの負担を軽減しつつ、リポジトリの健全性を高く保つことができます。

CI/CDの導入は、一度設定してしまえば開発体験を劇的に向上させてくれる強力な投資です。この記事を参考に、まずは簡単なデプロイ自動化から、あなたのプロジェクトにGitHub Actionsを取り入れてみてください。

関連記事