目次
- GitHub Actionsとは?基本概念を理解する
- 主要な構成要素
- ワークフローファイルの配置場所
- 最初のワークフローを作成する
- Hello Worldワークフロー
- Node.jsプロジェクトのCIワークフロー
- 実践的なCI/CDパイプラインの構築
- テスト → ビルド → デプロイのパイプライン
- Dockerイメージのビルドとプッシュ
- Secretsと環境変数の管理
- Secretsの設定と使用
- Environment(環境)の活用
- キャッシュ戦略による高速化
- 依存関係のキャッシュ
- ビルドキャッシュ
- 再利用可能なワークフロー
- 再利用可能なワークフローの定義
- 再利用可能なワークフローの呼び出し
- コスト管理とベストプラクティス
- 無料枠と料金体系
- コスト削減のテクニック
- セキュリティのベストプラクティス
- まとめ:GitHub Actionsを始めるためのステップ
コードをプッシュするたびにテストを手動で実行し、本番環境に手作業でデプロイする――こうしたワークフローは、チームの生産性を大きく損ないます。GitHub Actionsを使えば、CI(継続的インテグレーション)とCD(継続的デリバリー)のパイプラインをGitHub上で完結して自動構築できます。
この記事では、GitHub Actionsの基本概念から実践的なCI/CDパイプラインの構築方法まで、コード例とともに解説します。
GitHub Actionsとは?基本概念を理解する
GitHub Actionsは、GitHubに統合されたCI/CDおよびワークフロー自動化プラットフォームです。リポジトリ内にYAMLファイルを配置するだけで、コードのプッシュ、プルリクエスト、スケジュールなど、さまざまなイベントをトリガーに処理を自動実行できます。
主要な構成要素
GitHub Actionsの構成要素を理解しましょう。
- Workflow(ワークフロー):自動化プロセス全体の定義。YAMLファイルで記述
- Event(イベント):ワークフローを起動するトリガー(push、pull_request等)
- Job(ジョブ):ワークフロー内の実行単位。複数のジョブは並列実行可能
- Step(ステップ):ジョブ内の個々の処理。コマンドの実行やActionの利用
- Action(アクション):再利用可能な処理パーツ。Marketplaceで公開されているものも利用可能
- Runner(ランナー):ワークフローを実行するサーバー環境
ワークフローファイルの配置場所
ワークフローファイルは、リポジトリの.github/workflows/ディレクトリに配置します。
my-project/
├── .github/
│ └── workflows/
│ ├── ci.yml # テスト・リント
│ ├── cd.yml # デプロイ
│ └── codeql.yml # セキュリティスキャン
├── src/
├── package.json
└── README.md
最初のワークフローを作成する
まずは最もシンプルなワークフローから始めましょう。コードがプッシュされたらテストを実行する基本的なCIワークフローです。
Hello Worldワークフロー
# .github/workflows/hello.yml
name: Hello World
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
greeting:
runs-on: ubuntu-latest
steps:
- name: Say Hello
run: echo "Hello, GitHub Actions!"
- name: Show environment info
run: |
echo "Event: ${{ github.event_name }}"
echo "Branch: ${{ github.ref }}"
echo "Repository: ${{ github.repository }}"
echo "Runner OS: ${{ runner.os }}"
Node.jsプロジェクトのCIワークフロー
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run type check
run: npm run type-check
- name: Run tests
run: npm run test -- --coverage
- name: Upload coverage
if: matrix.node-version == 20
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
このワークフローのポイントを解説します。
strategy.matrix:Node.jsの複数バージョンで並列テストを実行actions/setup-node@v4のcacheオプション:npm依存関係をキャッシュして高速化if: matrix.node-version == 20:特定の条件でのみステップを実行actions/upload-artifact@v4:テスト結果をアーティファクトとして保存
実践的なCI/CDパイプラインの構築
実際のプロジェクトでは、テスト・ビルド・デプロイを段階的に実行するパイプラインが必要です。
テスト → ビルド → デプロイのパイプライン
# .github/workflows/pipeline.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
# ジョブ1: テスト
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm run test
# ジョブ2: ビルド(テスト成功後に実行)
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run build
- uses: actions/upload-artifact@v4
with:
name: build-output
path: dist/
# ジョブ3: デプロイ(mainブランチのpushのみ)
deploy:
needs: build
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/download-artifact@v4
with:
name: build-output
path: dist/
- name: Deploy to production
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
run: |
echo "Deploying to production..."
# デプロイスクリプトをここに記述
needsキーワードでジョブ間の依存関係を定義し、if条件で特定の条件でのみジョブを実行できます。
Dockerイメージのビルドとプッシュ
# .github/workflows/docker.yml
name: Docker Build & Push
on:
push:
branches: [main]
tags: ['v*']
jobs:
docker:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha,prefix=
type=ref,event=branch
type=semver,pattern={{version}}
- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
Secretsと環境変数の管理
APIキーやデプロイトークンなどの機密情報は、GitHub Secretsで安全に管理します。
Secretsの設定と使用
# GitHubリポジトリの Settings > Secrets and variables > Actions で設定
# ワークフローでの参照
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
run: |
# 環境変数としてSecretsを利用
npm run deploy
Environment(環境)の活用
# 環境ごとにSecretsを分ける
jobs:
deploy-staging:
runs-on: ubuntu-latest
environment: staging # staging環境のSecretsを使用
steps:
- name: Deploy to staging
env:
API_URL: ${{ vars.API_URL }} # 環境変数(非機密)
API_KEY: ${{ secrets.API_KEY }} # 機密情報
run: npm run deploy
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment: production # production環境のSecretsを使用
steps:
- name: Deploy to production
env:
API_URL: ${{ vars.API_URL }}
API_KEY: ${{ secrets.API_KEY }}
run: npm run deploy
Environment機能を使うと、本番環境へのデプロイに承認フローを設定することも可能です。
キャッシュ戦略による高速化
CI/CDパイプラインの実行時間を短縮するには、キャッシュの活用が不可欠です。
依存関係のキャッシュ
# setup-nodeの組み込みキャッシュ(推奨)
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
# 手動でキャッシュを設定する場合
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
ビルドキャッシュ
# Next.jsのビルドキャッシュ
- name: Cache Next.js build
uses: actions/cache@v4
with:
path: |
.next/cache
key: ${{ runner.os }}-nextjs-${{ hashFiles('package-lock.json') }}-${{ hashFiles('**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-nextjs-${{ hashFiles('package-lock.json') }}-
${{ runner.os }}-nextjs-
再利用可能なワークフロー
複数のリポジトリや複数のワークフローで同じ処理を繰り返す場合、再利用可能なワークフロー(Reusable Workflows)を活用しましょう。
再利用可能なワークフローの定義
# .github/workflows/reusable-test.yml
name: Reusable Test Workflow
on:
workflow_call:
inputs:
node-version:
required: false
type: string
default: '20'
working-directory:
required: false
type: string
default: '.'
secrets:
CODECOV_TOKEN:
required: false
jobs:
test:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ${{ inputs.working-directory }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
cache: 'npm'
cache-dependency-path: ${{ inputs.working-directory }}/package-lock.json
- run: npm ci
- run: npm run test -- --coverage
再利用可能なワークフローの呼び出し
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test-frontend:
uses: ./.github/workflows/reusable-test.yml
with:
node-version: '20'
working-directory: './frontend'
test-backend:
uses: ./.github/workflows/reusable-test.yml
with:
node-version: '20'
working-directory: './backend'
コスト管理とベストプラクティス
GitHub Actionsは無料枠がありますが、使い方によっては想定以上のコストが発生することがあります。
無料枠と料金体系
- パブリックリポジトリ:無制限に無料
- プライベートリポジトリ(Freeプラン):月2,000分(Linux)
- プライベートリポジトリ(Teamプラン):月3,000分(Linux)
- macOSランナー:Linuxの10倍の消費レート
- Windowsランナー:Linuxの2倍の消費レート
コスト削減のテクニック
# 1. 不要なトリガーを減らす
on:
push:
branches: [main]
paths-ignore:
- '**.md' # ドキュメントの変更ではCIを実行しない
- '.gitignore'
- 'LICENSE'
pull_request:
paths:
- 'src/**' # ソースコードの変更時のみ実行
- 'package*.json'
# 2. ジョブの並列実行を活用
# 3. concurrencyで重複実行をキャンセル
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # 同じブランチの古い実行をキャンセル
# 4. タイムアウトを設定
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 15 # 最大15分で打ち切り
セキュリティのベストプラクティス
# 1. Actionsのバージョンをピン留め(SHA指定推奨)
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
# 2. 最小限のパーミッション
permissions:
contents: read
pull-requests: write
# 3. GITHUB_TOKENの権限を制限
# リポジトリ Settings > Actions > General >
# "Workflow permissions" を "Read repository contents" に設定
まとめ:GitHub Actionsを始めるためのステップ
GitHub Actionsは、GitHubを使っている開発チームにとって最も手軽に始められるCI/CDプラットフォームです。段階的に導入することで、無理なく自動化の恩恵を受けられます。
- ステップ1:プッシュ時にリントとテストを自動実行するCIワークフローを作成
- ステップ2:キャッシュを設定してビルド時間を短縮
- ステップ3:ステージング環境への自動デプロイ(CD)を追加
- ステップ4:本番環境へのデプロイに承認フローを設定
- ステップ5:セキュリティスキャンや依存関係の自動更新を追加
最初から完璧なパイプラインを目指す必要はありません。まずはシンプルなCIワークフローから始め、プロジェクトの成長に合わせて段階的に機能を追加していきましょう。自動化に投資した時間は、長期的に何倍もの生産性向上として返ってきます。
Harmonic Society
この記事の内容、自社の業務でも活かせそうですか?
ローカルLLM・AI・クラウドなどの技術導入を、要件整理からPoC・社内展開まで代表エンジニアが伴走します。オンライン対応・全国OK。まずは30分の無料相談から。売り込みはしません。
関連記事
Related / 9 articles
Notes & Insights
- プログラミング
DDoS攻撃の仕組みと対策入門|レイヤー別の防御とCDN・クラウドの活用
DDoS攻撃をボリューム型・プロトコル型・アプリ層に分けて仕組みを解説し、自前サーバーで防げない理由、CloudflareやAWS Shieldの標準防御、オリジンIPの隠し方、レートリミットとBot対策、攻撃を受けたときの初動、費用が跳ね上がるDenial of Walletへの備えまでわかります。
- プログラミング
WAFとは?仕組み・導入パターン・誤検知対策|Webアプリを攻撃から守る実践ガイド
WAFがファイアウォールやIDSと何が違うのか、シグネチャとマネージドルールの仕組み、Cloudflare WAF・AWS WAF・ModSecurityの比較、フォーム送信がブロックされる誤検知の調査と例外設定、ログ監視、WAFが代替できないことまで実践的に解説します。
- プログラミング
セキュリティヘッダー入門|CSP・HSTS・X-Frame-Optionsの設定と効果を実践解説
CSP・HSTS・X-Frame-Options・X-Content-Type-Optionsなど主要セキュリティヘッダーが防ぐ攻撃と、CSPのReport-Onlyからの段階導入、nonce/hash、HSTS preloadの不可逆リスク、Nginx・Next.js・Astroでの設定例、確認方法を解説します。
- プログラミング
クラウドの通信費(Egress)入門|データ転送量課金の仕組みと転送コストを抑える設計
クラウドの「受信無料・送信有料」の原則、AZ間・リージョン間・インターネット向けの単価差、NATゲートウェイ処理料の罠、CDNで転送量を減らす方法、バックアップやログ転送の見落とし、請求書で転送料を特定する手順を解説。想定外の請求を防げます。
- プログラミング
秘密情報をGitに入れない仕組み|.gitignore・git-secrets・履歴から漏れた鍵の削除
APIキーや.envをGitにコミットしてしまう典型経路と、.gitignore・.env.exampleの運用、pre-commitでのgitleaks検知、GitHub secret scanningの活用、漏れた鍵の無効化と履歴書き換え(git filter-repo)の手順を解説。仕組みで再発を防げます。
- プログラミング
開発・ステージング・本番環境の分離設計|環境差分をなくす構成とアクセス制御
開発・ステージング・本番それぞれの目的と、構成をコードで揃える方法、環境別の設定注入、本番データを使わないテストデータ戦略、ステージングの保護(Basic認証・IP制限・noindex)、コストを抑える運用までを解説。環境差分による本番障害を防げます。
- プログラミング
ngrok・Cloudflare Tunnelでローカルを公開|Webhook開発とデモ環境の作り方
NAT内のローカル環境にStripeやLINEのWebhookを届けるトンネリングの仕組みを解説。ngrok・Cloudflare Tunnel・localtunnelの比較、固定ドメインと認証、リクエスト検査、公開時のセキュリティ、自宅サーバー公開への応用までわかります。
- プログラミング
ローカル開発環境のHTTPS化|mkcert・hostsファイル・自己署名証明書の正しい使い方
ローカル開発をHTTPS前提にすべき理由(Secure Cookie・Service Worker・OAuth)と、mkcertでローカルCAを作りhostsで独自ドメインを割り当ててVite・Next.js・Dockerで使う手順を解説。証明書警告を無視する癖の危険も理解できます。
- プログラミング
localhost・0.0.0.0・127.0.0.1の違い|ポートとUnixソケットを理解して「つながらない」を解決
localhost・127.0.0.1・0.0.0.0の意味の違い、Dockerで外から接続できない原因、host.docker.internal、ポート競合の調べ方、Unixソケットの利点と権限、1024未満ポートの制約を解説。「つながらない」を仕組みから解決できます。
Harmonic Society
「読んで終わり」にせず、自社の業務で試してみませんか?
AI・ローカルLLM・クラウドの導入を、要件整理からPoC・社内展開まで代表エンジニアが伴走します。オンライン対応・全国OK・売り込みなし。
無料・30分・オンラインOK|1営業日以内に返信します