



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp








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



それならGitHub Actionsを使った自動デプロイが最適じゃ!コードをプッシュするだけで自動的にサーバーにデプロイされるんじゃよ。今日は設定方法から実装まで詳しく解説するぞい!
結論から言うと、GitHub Actionsを使えばコードをGitHubにプッシュするだけでテスト・ビルド・デプロイが全自動で実行されます。手動FTPの工数をゼロにし、アップロード漏れや誤操作も防げます。本記事では基本セットアップから、FTP・S3・Netlify・Vercelへの実践的なデプロイ設定まで、動くコード付きで解説します。
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 |



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



たくさんあるぞ!時間の節約はもちろん、ミスの削減、チーム開発の効率化など、メリットだらけなんじゃ
# 新しいプロジェクトの場合
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# .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 buildYAMLの主要キーワードの役割:name(GitHub上での表示名)・on(トリガー)・jobs(ジョブ定義)・runs-on(実行環境)・steps(処理ステップ)・uses(既存アクション呼び出し)・run(シェルコマンド実行)
パスワードなどの機密情報は絶対にコードに直接書かず、GitHubのSecretsを使用します。
FTP_SERVER:FTPサーバーのアドレス(例:ftp.example.com)FTP_USERNAME:FTPユーザー名FTP_PASSWORD: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-slate | trueにするとサーバー側を完全削除してからアップロード(通常はfalse) |
dry-run | trueにすると実際のアップロードは行わずテストのみ実行 |
# .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_ID・AWS_SECRET_ACCESS_KEY・CLOUDFRONT_DISTRIBUTION_ID(CloudFront使用時)
# .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)
# .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_TOKEN・VERCEL_ORG_ID(オプション)・VERCEL_PROJECT_ID(オプション)



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



よし!それならテスト、リント、セキュリティチェックも含めた完全な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プランごとに無料枠があり、Free(月2,000分)・Pro(月3,000分)・Team(月3,000分)・Enterprise(月50,000分)です。ubuntu-latest環境は1分あたり1分として計算されます。一般的なWeb制作プロジェクトであれば、無料枠で十分対応できます。
即座にFTPパスワードを変更してください。GitHubのSecretsに新しい認証情報を登録し直し、ワークフローファイルから認証情報を削除してコミットしてください。もし既にGit履歴にパスワードが含まれている場合は、git filter-repoで履歴から削除する必要があります。GitHub側の自動スキャンで検出された場合はアラートが届きます。
はい、可能です。GitHubの「Actions」タブから以前の成功したワークフローを選択し、「Re-run jobs」で再実行することで前のコードを再デプロイできます。また、Gitリポジトリで前のコミットに戻してからプッシュすることでも同様の効果が得られます。FTPデプロイの場合はサーバー上のファイルも更新されます。
はい、できます。ワークフローファイルのon.push.branchesに両方のブランチを指定し、デプロイジョブにif: github.ref == 'refs/heads/main'やif: github.ref == 'refs/heads/develop'の条件を追加するだけです。それぞれに異なるSecrets(ステージング用FTPサーバー・本番用FTPサーバー)を設定することで、ブランチごとに異なる環境へデプロイできます。
使えます。WordPressテーマやプラグインの開発にGitHubを使っている場合、FTPデプロイアクションでテーマファイルをサーバーのwp-content/themes/に自動転送できます。ビルドステップが不要な場合は、チェックアウト→FTPデプロイの2ステップのシンプルなワークフローで動作します。ただしwp-config.phpなどの機密ファイルは必ずexcludeリストに入れてください。



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



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



わかりました!早速プロジェクトに導入してみます!
GitHub Actionsを使った自動デプロイは、最初の設定に少し時間がかかりますが、一度構築すれば長期的に大きな価値をもたらします。まずはシンプルなFTPデプロイから試してみてください。
.github/workflows/に配置するYAMLファイル。ワークフロー・イベント・ジョブ・ステップ・アクション・ランナーの6要素で構成される${{ secrets.NAME }}で参照するSamKirkland/FTP-Deploy-Actionで実現。dry-run: trueでテスト実行できる

副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
公式サイト より
今すぐ
無料カウンセリング
を予約!