「コードをpushしたら自動でビルド・テスト・デプロイまで完了する」そんな仕組みをCI/CDパイプラインと呼びます。この記事ではDockerとGitHub Actionsを組み合わせてCI/CDパイプラインを構築する方法を実践的に解説します。
CI/CDとは?
CI(継続的インテグレーション)はコードの変更をリポジトリにpushするたびに自動でビルド・テストを実行する仕組みです。CD(継続的デリバリー/デプロイ)はテストが通ったコードを自動で本番環境にデプロイする仕組みです。
| フェーズ | 内容 |
|---|---|
| CI(継続的インテグレーション) | コードpush → 自動ビルド → 自動テスト |
| CD(継続的デリバリー) | テスト通過 → ステージング環境へ自動デプロイ |
| CD(継続的デプロイ) | テスト通過 → 本番環境へ自動デプロイ |
GitHub Actionsとは?
GitHub ActionsはGitHubに組み込まれたCI/CDツールです。.github/workflows/ディレクトリにYAMLファイルを置くだけで自動化が設定できます。GitHubリポジトリがあれば追加費用なし(パブリックリポジトリは無料)で使えます。
基本的なCI/CDパイプライン
mainブランチへのpush時に「ビルド → テスト → Docker Hubへpush」を自動実行するパイプラインです。
# .github/workflows/ci-cd.yml
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: リポジトリをチェックアウト
uses: actions/checkout@v4
- name: Python環境をセットアップ
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: 依存関係をインストール
run: pip install -r requirements.txt
- name: テストを実行
run: pytest tests/
build-and-push:
runs-on: ubuntu-latest
needs: test # testジョブが成功してから実行
if: github.ref == 'refs/heads/main' # mainブランチのみ
steps:
- name: リポジトリをチェックアウト
uses: actions/checkout@v4
- name: Docker Hubにログイン
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker Build and Push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
yourname/myapp:latest
yourname/myapp:${{ github.sha }}
GitHub SecretsにDocker Hub認証情報を登録する
パスワードやトークンはGitHub Secretsに登録して、YAMLから参照します。絶対にYAMLに直書きしてはいけません。
- GitHubリポジトリのSettings → Secrets and variables → Actionsを開く
- New repository secretをクリック
DOCKERHUB_USERNAME:Docker Hub ID を登録DOCKERHUB_TOKEN:Docker Hub のアクセストークンを登録(パスワードではなくトークン推奨)
Dockerを使ったテスト環境の構築
GitHub ActionsでDockerを使ってテスト用サービス(DBなど)を立ち上げることもできます。
# DBを使ったテストの例
jobs:
test:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8.0
env:
MYSQL_ROOT_PASSWORD: testpassword
MYSQL_DATABASE: testdb
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s
steps:
- uses: actions/checkout@v4
- name: テストを実行
env:
DB_HOST: 127.0.0.1
DB_PORT: 3306
DB_NAME: testdb
DB_PASSWORD: testpassword
run: pytest tests/
GitHub Container Registryへのpush
Docker Hubの代わりにGitHub Container Registry(ghcr.io)を使うと、追加の認証設定が不要でシンプルに構成できます。
- name: GitHub Container Registryにログイン
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }} # 自動提供されるトークン
- name: Build and Push to GHCR
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
マルチプラットフォームビルド
AMD64とARM64(Apple Silicon・RaspberryPi)両方に対応したイメージを一度にビルドできます。
- name: Buildxをセットアップしてマルチプラットフォームビルドを有効化
uses: docker/setup-buildx-action@v3
- name: Build and Push (multi-platform)
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: yourname/myapp:latest
まとめ
- CI/CDはコードpushからビルド・テスト・デプロイを自動化する仕組み
- GitHub Actionsは.github/workflows/にYAMLを置くだけで動く
- 認証情報は必ずGitHub Secretsに登録してYAMLに直書きしない
- テスト用DBなどのサービスはservicesブロックでコンテナとして立ち上げられる
- GitHub Container Registryを使うと
GITHUB_TOKENで認証でき設定がシンプル



コメント