コードの変更を本番環境に反映するたびに手作業でテストやデプロイを行い、ヒューマンエラーに悩まされていませんか?CI/CDの導入で、こうした開発プロセスの課題を自動化で解決できます。
本記事では、GitHub ActionsでCI/CDを構築する方法を、実際のコード例を交えながら基礎から実践まで具体的に解説します。
GitHub Actions CI/CDとは?開発効率を高める自動化の仕組み
「コードを本番環境に反映するたびに手作業でテストやデプロイを行っている」「人為的ミスでサービスが停止した経験がある」――こうした課題を抱える開発チームは少なくありません。
CI/CD(継続的インテグレーション/継続的デリバリー)は、開発プロセスを自動化し、品質向上と効率化を実現する仕組みです。GitHub Actionsは、GitHubに標準搭載されたCI/CDツールとして、初期投資を抑えながら導入できる点で注目されています。
本記事では、GitHub Actions CI/CD 設定方法について、基礎から実践まで具体的に解説します。実際のコード例を交えながら、段階的に導入できるアプローチをご紹介します。なお、GitHubの基本操作についてはGitHubコマンド一覧もあわせてご覧ください。
CI/CDがもたらす3つの価値
CI(継続的インテグレーション)は、コード変更のたびに自動的にビルドやテストを実行し、問題を早期発見する仕組みです。CD(継続的デリバリー)は、テスト合格後のコードを自動的に本番環境へデプロイできる状態にします。
CI/CD導入による主なメリット:
- 品質向上:自動テストで人為的ミスを早期発見
- 開発速度向上:手作業が減り、開発に集中できる
- 属人化解消:デプロイ手順が自動化・標準化される
GitHub Actionsの特徴と選ばれる理由
GitHub Actionsは、他のCI/CDツールと比較して以下の優位性があります。
導入の容易さ
- GitHubアカウントがあればすぐ利用開始
- 別途サーバー構築が不要
- YAML形式で直感的に記述可能
コスト効率
- パブリックリポジトリは完全無料
- プライベートリポジトリも月2,000分の無料枠
- サーバー管理コストがかからない
拡張性
- GitHub Marketplaceに豊富な既製アクション
- あらゆる言語・フレームワークに対応
- Linux、Windows、macOS環境で実行可能
従来のJenkinsなどと比較すると、専任の運用担当者が不要で、GitHub上ですべて完結する点が大きな特徴です。
GitHub Actionsの基本構成要素
GitHub Actions CI/CD 設定方法を理解するには、主要な構成要素を把握することが重要です。
ワークフロー・ジョブ・ステップの関係
ワークフローは自動化プロセス全体を定義したYAMLファイルで、.github/workflows/ディレクトリに配置します。1つのリポジトリに複数のワークフローを配置可能です。
ジョブはワークフロー内の独立した実行単位で、並行または順次実行できます。ステップはジョブを構成する個々のタスクで、順番に実行されます。
name: CI Workflow
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: npm install
- run: npm test
この階層構造により、処理の流れが視覚的に理解しやすく、エラー発生時も原因を特定しやすくなります。
トリガーイベントの種類
ワークフローを実行するきっかけとなる主なイベント:
- push:コードがプッシュされたとき
- pull_request:プルリクエストが作成・更新されたとき
- schedule:定期実行(cron形式)
- workflow_dispatch:手動実行
ブランチやパスでフィルタリングも可能です:
on:
push:
branches: [main, develop]
paths: ['src/**']
schedule:
- cron: '0 0 * * 0'
ランナー環境の選択
ランナーはワークフローを実行するサーバー環境です。
GitHub-hosted runner(推奨)
- GitHubが管理する仮想マシン
- Ubuntu、Windows、macOSが選択可能
- セットアップ不要で即座に利用開始
Self-hosted runner
- 自社サーバーで実行
- 特殊な環境や高スペックが必要な場合に選択
まずはGitHub-hosted runnerから始めることで、運用負荷を最小限に抑えられます。
GitHub Actions CI/CD 設定方法|実践ステップ
ここからは、実際の設定手順を具体的に解説します。
ワークフローファイルの作成
ワークフローファイルは必ず.github/workflows/ディレクトリに配置します。
your-repository/
└── .github/
└── workflows/
└── ci.yml
作成方法
- GitHubのリポジトリで「Actions」タブをクリック
- 「set up a workflow yourself」を選択
- ブラウザ上のエディタでYAMLファイルを編集
- コミットして保存
またはローカルで作成してpushも可能です:
mkdir -p .github/workflows
touch .github/workflows/ci.yml
git add .github/workflows/ci.yml
git commit -m "Add CI workflow"
git push
最小構成のワークフロー例
まずはシンプルなワークフローから始めましょう。
name: Hello World
on:
push:
branches: [main]
jobs:
greeting:
runs-on: ubuntu-latest
steps:
- name: 実行確認
run: echo "Hello, GitHub Actions!"
- name: 環境情報
run: |
echo "OS: $RUNNER_OS"
node --version
このファイルを保存してmainブランチにpushすると、ワークフローが自動実行されます。
実行状況の確認方法
確認手順
- リポジトリの「Actions」タブをクリック
- 実行履歴から対象のワークフローを選択
- 各ステップのログを確認
ステータス表示
- 緑のチェックマーク:成功
- 赤のバツマーク:失敗
- 黄色の丸:実行中
失敗時は該当ステップのログで詳細なエラーメッセージを確認できます。
よくあるエラーと対処法
YAMLの構文エラー
Error: Invalid workflow file
対処法:インデント(スペース2つ)を正しく設定。タブ文字は使用しない。
コマンド実行エラー
Error: Process completed with exit code 1
対処法:該当ステップのログを確認し、ローカル環境で同じコマンドを実行してテスト。
権限エラー
permissions:
contents: read
pull-requests: write
必要な権限をワークフローに明示的に追加します。
実践例①:Node.jsアプリのテスト自動化
実際のプロジェクトで活用できる具体的なワークフローを紹介します。
基本的なテスト自動化
name: Node.js CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
ポイント
npm ciはnpm installより高速で安定cache: 'npm'で依存パッケージをキャッシュし実行時間を短縮
複数バージョンでのテスト
複数のNode.jsバージョンで動作確認する場合:
name: Node.js Matrix
on: [push, pull_request]
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [16, 18, 20]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
6つの組み合わせで並行実行され、幅広い環境での動作を保証できます。
実践例②:Dockerイメージのビルドとデプロイ
コンテナ化されたアプリケーションのCI/CD設定例です。
Docker Hubへのプッシュ
name: Docker Build and Push
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: your-username/myapp:latest
cache-from: type=gha
cache-to: type=gha,mode=max
AWS ECRへのデプロイ
name: Deploy to AWS ECR
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ap-northeast-1
- name: Login to ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build and push
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/myapp:$IMAGE_TAG .
docker push $ECR_REGISTRY/myapp:$IMAGE_TAG
GitHub Secretsでの認証情報管理
機密情報は必ずGitHub Secretsで管理します。
設定手順
- リポジトリの「Settings」→「Secrets and variables」→「Actions」
- 「New repository secret」をクリック
- 名前と値を入力して保存
ワークフロー内では${{ secrets.SECRET_NAME }}で参照します。
実践例③:本番環境への自動デプロイ
安全な自動デプロイの設計方法を解説します。
環境別の設定
開発環境と本番環境で異なる設定を使用する例:
name: Deploy
on:
push:
branches: [develop, main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set environment
run: |
if [ "${{ github.ref }}" = "refs/heads/main" ]; then
echo "ENV=production" >> $GITHUB_ENV
echo "URL=${{ secrets.PROD_URL }}" >> $GITHUB_ENV
else
echo "ENV=development" >> $GITHUB_ENV
echo "URL=${{ secrets.DEV_URL }}" >> $GITHUB_ENV
fi
- name: Deploy to ${{ env.ENV }}
run: ./deploy.sh ${{ env.URL }}
承認フローの組み込み
本番デプロイ前に手動承認を必要とする設定:
name: Production Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: production
url: https://example.com
steps:
- uses: actions/checkout@v3
- name: Deploy
run: ./deploy.sh
リポジトリの「Settings」→「Environments」で承認者を設定します。
ロールバックの仕組み
デプロイ失敗時の自動ロールバック:
- name: Deploy
id: deploy
run: ./deploy.sh
- name: Health check
run: curl -f https://example.com/health
- name: Rollback on failure
if: failure()
run: ./rollback.sh
運用時のポイントと最適化
効率的な運用のための実践的なアドバイスです。
無料枠と料金体系
無料枠
- パブリックリポジトリ:無制限
- プライベートリポジトリ:月2,000分
実行時間の目安
- 単純なテスト:2〜5分
- ビルド含む:5〜10分
- フルCI/CD:10〜20分
複数ジョブの並行実行で時間を短縮できますが、無料枠の消費も増えます。
ワークフロー実行時間の最適化
キャッシュの活用
- uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
不要な実行の回避
on:
push:
paths-ignore:
- '**.md'
- 'docs/**'
ドキュメント変更時はワークフローをスキップします。
セキュリティのベストプラクティス
- 最小権限の原則:必要最小限の権限のみ付与
- Secretsの適切な管理:機密情報は必ずSecrets化
- 依存関係の定期更新:セキュリティパッチを適用
- サードパーティアクションの検証:信頼できるアクションのみ使用
GitHub Marketplaceの活用
既製アクションを活用して効率的に開発できます。
よく使われるアクション
基本的なアクション
actions/checkout:リポジトリのコードを取得actions/setup-node:Node.js環境のセットアップactions/cache:依存関係のキャッシュ
デプロイ関連
aws-actions/configure-aws-credentials:AWS認証docker/build-push-action:Dockerビルド・プッシュ
通知・レポート
codecov/codecov-action:カバレッジレポート8398a7/action-slack:Slack通知
アクションの探し方
- GitHub Marketplaceで検索
- スター数とメンテナンス状況を確認
- ドキュメントの充実度をチェック
- 公式アクションを優先的に選択
まとめ:段階的な導入で確実に
GitHub Actions CI/CD 設定方法について、基礎から実践まで解説しました。
導入のステップ
- 最小構成から開始:まずは自動テストだけを導入
- 段階的に拡張:慣れてからビルド、デプロイへ展開
- チームで運用:ルールを決めて継続的に改善
成功のポイント
- 必要最小限の機能から始める
- GitHub Marketplaceの既製アクションを活用
- 無料枠内で十分な自動化が可能
- セキュリティを意識した設定
GitHub Actionsは、GitHubを使っているなら追加コストなしで始められる「ちょうどいい」CI/CDツールです。小さく始めて、自社に合った形に育てていくアプローチをお勧めします。
導入や運用でお困りの際は、専門家のサポートを活用することも選択肢の一つです。