WithCodeMedia-1-pc
previous arrowprevious arrow
next arrownext arrow

WithCodeMedia-1-sp
previous arrowprevious arrow
next arrownext arrow

【完全版】GitHub ActionsでWeb制作の自動デプロイを実現!CI/CD構築から実装まで実例を踏まえて詳しく解説

この記事でわかること

  • GitHub ActionsのCI/CD基本概念とワークフロー構成要素の違い
  • FTP・AWS S3・Netlify・Vercelへの自動デプロイワークフローの書き方
  • APIキー・パスワードをSecretsで安全に管理する手順
  • テスト・リント・セキュリティチェックを含む本格的なCI/CDパイプラインの実装例
  • ワークフローが実行されない・FTP失敗・ビルドエラーなどトラブルシューティング
生徒

Web制作で毎回FTPでファイルをアップロードするのが面倒なんです…何か良い方法はありませんか?

ペン博士

それならGitHub Actionsを使った自動デプロイが最適じゃ!コードをプッシュするだけで自動的にサーバーにデプロイされるんじゃよ。今日は設定方法から実装まで詳しく解説するぞい!

結論から言うと、GitHub Actionsを使えばコードをGitHubにプッシュするだけでテスト・ビルド・デプロイが全自動で実行されます。手動FTPの工数をゼロにし、アップロード漏れや誤操作も防げます。本記事では基本セットアップから、FTP・S3・Netlify・Vercelへの実践的なデプロイ設定まで、動くコード付きで解説します。


目次

GitHub Actionsとは?CI/CDの基本概念

GitHub Actionsは、GitHubが提供するCI/CD(継続的インテグレーション/継続的デリバリー)プラットフォームです。リポジトリ内で発生するイベント(プッシュ・プルリクエスト・イシュー作成など)をトリガーとして、自動的にワークフローを実行できます。

主要な構成要素

要素役割
ワークフロー(Workflow)自動化プロセス全体。YAMLファイルで定義deploy.yml
イベント(Event)ワークフローを開始するトリガーpush、pull_request
ジョブ(Job)ワークフロー内で実行される一連のステップの集まりbuild、deploy
ステップ(Step)ジョブ内の個別タスクnpm install、npm build
アクション(Action)再利用可能なコマンド集合(マーケットプレイスで公開)actions/checkout@v4
ランナー(Runner)ワークフローを実行するサーバーubuntu-latest

CI/CDの定義

  • CI(Continuous Integration / 継続的インテグレーション):開発者がコードをリポジトリに頻繁にマージし、自動的にビルドとテストを実行することで問題を早期に発見する手法
  • CD(Continuous Delivery / 継続的デリバリー):コードの変更を自動的にビルド・テストし、本番環境へのデプロイを自動化する手法

GitHub Actionsのメリット

  • GitHubとの統合:追加ツール不要で、GitHubリポジトリから直接使用可能
  • 豊富なアクション:マーケットプレイスに数千のアクションが公開されている
  • 無料枠が充実:パブリックリポジトリは無料、プライベートでも月2,000分まで無料
  • 設定が簡単:YAMLファイルで直感的に設定できる
  • 柔軟性:複数のOSやプログラミング言語をサポート

自動デプロイがもたらす6つのメリット

生徒

自動デプロイにするとどんな良いことがあるんですか?

ペン博士

たくさんあるぞ!時間の節約はもちろん、ミスの削減、チーム開発の効率化など、メリットだらけなんじゃ

  1. 人的ミスの削減:ファイルのアップロード漏れ・誤ったファイル送信・デプロイ手順の実行ミスがゼロになる
  2. デプロイ時間の大幅短縮:手動で10分かかる作業が数秒〜数分に。複数環境への並行デプロイも可能
  3. 開発速度の向上:コードを書いたらすぐに本番反映可能。小さな変更を頻繁にリリースできる
  4. 品質の安定化:デプロイ前に必ず自動テストが実行される。静的解析やセキュリティチェックを組み込める
  5. チーム開発の効率化:デプロイ方法がYAMLでドキュメント化される。誰がいつ何をデプロイしたか履歴が残る
  6. ロールバックの簡単化:問題が発生しても前バージョンに即座に戻せる

GitHub Actionsの基本セットアップ

ステップ1:リポジトリとワークフローディレクトリの準備

# 新しいプロジェクトの場合
mkdir my-website
cd my-website
git init
git remote add origin https://github.com/your-username/my-website.git

# 既存プロジェクトの場合は、リポジトリをクローン
git clone https://github.com/your-username/my-website.git
cd my-website

# ワークフローディレクトリを作成
mkdir -p .github/workflows

ステップ2:基本的なワークフローファイルの作成

# .github/workflows/test.yml
name: Test Workflow

# このワークフローを実行するトリガー
on:
  push:
    branches:
      - main  # mainブランチへのプッシュ時に実行
  pull_request:
    branches:
      - main  # mainブランチへのPR時に実行

# ジョブの定義
jobs:
  test:
    # 実行環境
    runs-on: ubuntu-latest

    # ステップの定義
    steps:
      # 1. リポジトリのコードをチェックアウト
      - name: Checkout code
        uses: actions/checkout@v4

      # 2. Node.jsのセットアップ
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      # 3. 依存関係のインストール
      - name: Install dependencies
        run: npm ci

      # 4. テストの実行
      - name: Run tests
        run: npm test

      # 5. ビルドの実行
      - name: Build
        run: npm run build

YAMLの主要キーワードの役割:name(GitHub上での表示名)・on(トリガー)・jobs(ジョブ定義)・runs-on(実行環境)・steps(処理ステップ)・uses(既存アクション呼び出し)・run(シェルコマンド実行)


実践:FTPサーバーへの自動デプロイ

ステップ1:シークレット情報の設定

パスワードなどの機密情報は絶対にコードに直接書かず、GitHubのSecretsを使用します。

  1. GitHubリポジトリページで「Settings」タブをクリック
  2. 左サイドバーの「Secrets and variables」→「Actions」をクリック
  3. 「New repository secret」ボタンをクリック
  4. 以下のシークレットを登録:
    • FTP_SERVER:FTPサーバーのアドレス(例:ftp.example.com)
    • FTP_USERNAME:FTPユーザー名
    • FTP_PASSWORD:FTPパスワード

ステップ2:FTPデプロイワークフローの作成

# .github/workflows/deploy-ftp.yml
name: Deploy to FTP Server

on:
  push:
    branches:
      - main  # mainブランチへのプッシュ時に実行

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. リポジトリをチェックアウト
      - name: Checkout code
        uses: actions/checkout@v4

      # 2. Node.jsのセットアップ(ビルドが必要な場合)
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      # 3. 依存関係のインストール
      - name: Install dependencies
        run: npm ci

      # 4. プロジェクトのビルド
      - name: Build project
        run: npm run build

      # 5. FTPデプロイ
      - name: Deploy via FTP
        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
        with:
          # FTP接続情報(Secretsから取得)
          server: ${{ secrets.FTP_SERVER }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}

          # デプロイ設定
          local-dir: ./dist/        # ローカルのデプロイ対象ディレクトリ
          server-dir: /public_html/ # サーバー側のディレクトリ

          # 除外ファイル・ディレクトリ
          exclude: |
            **/.git*
            **/.git*/**
            **/node_modules/**
            **/.env
            **/.DS_Store

          # その他の設定
          dangerous-clean-slate: false  # サーバー側を完全削除しない
          dry-run: false                # 実際にデプロイを実行
設定項目説明
local-dirアップロードするローカルディレクトリ(末尾の/が重要)
server-dirサーバー側のアップロード先ディレクトリ
excludeアップロードから除外するファイルパターン
dangerous-clean-slatetrueにするとサーバー側を完全削除してからアップロード(通常はfalse)
dry-runtrueにすると実際のアップロードは行わずテストのみ実行

多様なデプロイ先への対応

1. AWS S3への自動デプロイ

# .github/workflows/deploy-s3.yml
name: Deploy to AWS S3

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      # AWS認証情報の設定
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      # S3へのデプロイ
      - name: Deploy to S3
        run: |
          aws s3 sync ./dist s3://your-bucket-name --delete

      # CloudFrontのキャッシュ削除(オプション)
      - name: Invalidate CloudFront
        run: |
          aws cloudfront create-invalidation \
            --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
            --paths "/*"

必要なSecrets:AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYCLOUDFRONT_DISTRIBUTION_ID(CloudFront使用時)

2. Netlifyへの自動デプロイ

# .github/workflows/deploy-netlify.yml
name: Deploy to Netlify

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      # Netlifyへのデプロイ
      - name: Deploy to Netlify
        uses: nwtgck/actions-netlify@v3.0
        with:
          publish-dir: './dist'
          production-branch: main
          github-token: ${{ secrets.GITHUB_TOKEN }}
          deploy-message: "Deploy from GitHub Actions"
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}

必要なSecrets:NETLIFY_AUTH_TOKEN(Netlifyの個人アクセストークン)・NETLIFY_SITE_ID(NetlifyサイトのID)

3. Vercelへの自動デプロイ

# .github/workflows/deploy-vercel.yml
name: Deploy to Vercel

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Vercel CLI
        run: npm install --global vercel@latest

      # Vercelへのデプロイ
      - name: Pull Vercel Environment Information
        run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }}

      - name: Build Project Artifacts
        run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }}

      - name: Deploy to Vercel
        run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }}

必要なSecrets:VERCEL_TOKENVERCEL_ORG_ID(オプション)・VERCEL_PROJECT_ID(オプション)


高度なCI/CDパイプラインの構築

生徒

もっと本格的なパイプラインを作りたいです!

ペン博士

よし!それならテスト、リント、セキュリティチェックも含めた完全なCI/CDパイプラインを作ってみるかのう

品質チェック→テスト→セキュリティ→ビルド→デプロイの5段階で構成される本格的なパイプラインです。テストとセキュリティチェックは並列実行することで時間を短縮します。

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches:
      - main
      - develop
  pull_request:
    branches:
      - main
      - develop

# 環境変数の定義
env:
  NODE_VERSION: '20'

jobs:
  # ジョブ1:コード品質チェック
  quality-check:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      # ESLintによる静的解析
      - name: Run ESLint
        run: npm run lint

      # Prettierによるフォーマットチェック
      - name: Check code formatting
        run: npm run format:check

      # TypeScriptの型チェック
      - name: Type check
        run: npm run type-check

  # ジョブ2:テスト実行
  test:
    runs-on: ubuntu-latest
    needs: quality-check

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      # ユニットテスト
      - name: Run unit tests
        run: npm run test:unit

      # E2Eテスト
      - name: Run E2E tests
        run: npm run test:e2e

      # カバレッジレポートの生成
      - name: Generate coverage report
        run: npm run test:coverage

      # カバレッジをCodecovにアップロード
      - name: Upload coverage to Codecov
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: ./coverage/coverage-final.json

  # ジョブ3:セキュリティチェック
  security:
    runs-on: ubuntu-latest
    needs: quality-check

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}

      - name: Install dependencies
        run: npm ci

      # 依存関係の脆弱性チェック
      - name: Run npm audit
        run: npm audit --audit-level=moderate

      # Snykによるセキュリティスキャン
      - name: Run Snyk security scan
        uses: snyk/actions/node@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

  # ジョブ4:ビルド
  build:
    runs-on: ubuntu-latest
    needs: [test, security]

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_VERSION }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build project
        run: npm run build

      # ビルド成果物をアーティファクトとして保存
      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-artifacts
          path: dist/
          retention-days: 7

  # ジョブ5:デプロイ(mainブランチのみ)
  deploy:
    runs-on: ubuntu-latest
    needs: build
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      # ビルド成果物をダウンロード
      - name: Download build artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-artifacts
          path: dist/

      # FTPデプロイ
      - name: Deploy to production
        uses: SamKirkland/FTP-Deploy-Action@v4.3.5
        with:
          server: ${{ secrets.FTP_SERVER }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          local-dir: ./dist/
          server-dir: /public_html/

      # Slackに通知(オプション)
      - name: Notify deployment success
        uses: 8398a7/action-slack@v3
        with:
          status: ${{ job.status }}
          text: 'Deployment to production completed successfully!'
          webhook_url: ${{ secrets.SLACK_WEBHOOK }}
        if: always()

このパイプラインの特徴:段階的な実行(品質チェック→テスト→セキュリティ→ビルド→デプロイ)、並列実行(テストとセキュリティチェックを同時実行)、条件分岐(デプロイはmainブランチへのプッシュ時のみ)、アーティファクト管理(ビルド成果物を保存・再利用)、Slack通知(デプロイ完了の自動通知)


トラブルシューティング

問題主な原因解決法
ワークフローが実行されないYAMLファイルの配置場所が間違っている・構文エラー・トリガーブランチ名が不一致.github/workflows/に配置されているか確認。YAML Linterで構文チェック。GitHubの「Actions」タブでエラーメッセージを確認
FTPデプロイが失敗するFTP認証情報が間違っている・サーバー側のディレクトリパスが間違っている・ファイアウォールでブロックされているSecretsの値を再確認。dry-run: trueでテスト実行。サーバー管理者にGitHub ActionsのIPアドレスを許可してもらう
ビルドが失敗する環境変数が設定されていない・Node.jsのバージョンが合わない・依存関係のインストールエラー必要な環境変数をSecretsまたはenvに追加。node-versionをpackage.jsonのenginesと合わせる。npm ciの代わりにnpm installを試す

よくある質問

GitHub Actionsは有料ですか?

パブリックリポジトリは完全無料で利用できます。プライベートリポジトリはGitHubプランごとに無料枠があり、Free(月2,000分)・Pro(月3,000分)・Team(月3,000分)・Enterprise(月50,000分)です。ubuntu-latest環境は1分あたり1分として計算されます。一般的なWeb制作プロジェクトであれば、無料枠で十分対応できます。

FTP接続情報をコードに書いてしまいました。どうすればいいですか?

即座にFTPパスワードを変更してください。GitHubのSecretsに新しい認証情報を登録し直し、ワークフローファイルから認証情報を削除してコミットしてください。もし既にGit履歴にパスワードが含まれている場合は、git filter-repoで履歴から削除する必要があります。GitHub側の自動スキャンで検出された場合はアラートが届きます。

デプロイに失敗した場合、前のバージョンに戻せますか?

はい、可能です。GitHubの「Actions」タブから以前の成功したワークフローを選択し、「Re-run jobs」で再実行することで前のコードを再デプロイできます。また、Gitリポジトリで前のコミットに戻してからプッシュすることでも同様の効果が得られます。FTPデプロイの場合はサーバー上のファイルも更新されます。

developブランチはステージング環境、mainブランチは本番環境に分けられますか?

はい、できます。ワークフローファイルのon.push.branchesに両方のブランチを指定し、デプロイジョブにif: github.ref == 'refs/heads/main'if: github.ref == 'refs/heads/develop'の条件を追加するだけです。それぞれに異なるSecrets(ステージング用FTPサーバー・本番用FTPサーバー)を設定することで、ブランチごとに異なる環境へデプロイできます。

WordPressサイトでもGitHub Actionsは使えますか?

使えます。WordPressテーマやプラグインの開発にGitHubを使っている場合、FTPデプロイアクションでテーマファイルをサーバーのwp-content/themes/に自動転送できます。ビルドステップが不要な場合は、チェックアウト→FTPデプロイの2ステップのシンプルなワークフローで動作します。ただしwp-config.phpなどの機密ファイルは必ずexcludeリストに入れてください。


生徒

GitHub Actions、思ったより簡単に設定できますね!

ペン博士

その通りじゃ!最初は基本的なデプロイから始めて、徐々にテストやセキュリティチェックを追加していくのがコツじゃぞ。一度設定すれば、開発効率が格段に上がるんじゃ!

生徒

わかりました!早速プロジェクトに導入してみます!


まとめ

GitHub Actionsを使った自動デプロイは、最初の設定に少し時間がかかりますが、一度構築すれば長期的に大きな価値をもたらします。まずはシンプルなFTPデプロイから試してみてください。

  • ワークフローファイルは.github/workflows/に配置するYAMLファイル。ワークフロー・イベント・ジョブ・ステップ・アクション・ランナーの6要素で構成される
  • 機密情報(FTPパスワード・APIキー)は必ずGitHub Secretsに登録し、YAMLでは${{ secrets.NAME }}で参照する
  • FTPデプロイはSamKirkland/FTP-Deploy-Actionで実現。dry-run: trueでテスト実行できる
  • AWS S3・Netlify・Vercelへのデプロイも専用アクションで同様のシンプルな設定で実現可能
  • 本格的なCI/CDは品質チェック→テスト→セキュリティ→ビルド→デプロイの5段階構成。testとsecurityは並列実行で時間短縮
  • トラブル時はGitHubの「Actions」タブのログを確認するのが最短の解決策

WithCodeを体験できる初級コース公開中!

WithCode初級コース

初級コース(¥49,800)が完全無料に!

  • 期間:1週間
  • 学習内容:ロードマップ/基礎知識/環境構築/HTML/CSS/LP・ポートフォリオ作成
    → 正しい学習方法で「確かな成長」を実感できるカリキュラム

副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?

未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!

この記事を書いた人

WithCode(ウィズコード)は「目指すなら稼げる人材」をビジョンに、累計400名以上のフリーランスを輩出してきた超実践型プログラミングスクールです。150社以上の実案件支援を特徴にWeb制作・Webデザインなどの役立つ情報を現場のノウハウに基づいて発信していきます。

– service –WithGroupの運営サービス

  • WithCode
    - ウィズコード -

    スクール

    「未経験」から
    現場で通用する
    スキルを身に付けよう!

    詳細はこちら
  • WithFree
    - ウィズフリ -

    実案件サポート

    制作会社のサポート下で
    実務経験を積んでいこう!

    詳細はこちら
  • WithCareer
    - ウィズキャリ -

    就転職サポート

    大手エージェントのサポート下で
    キャリアアップを目指そう!

    詳細はこちら

公式サイト より
今すぐ
無料カウンセリング
予約!

目次