TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

CI/CDの応用

CI/CDの応用:高度な自動化で開発フローを最適化する方法

1. はじめに

CI/CD(Continuous Integration / Continuous Deployment)は、ソフトウェア開発の自動化を支援する重要なプラクティスです。これにより、コードの統合、テスト、デプロイを効率的に行い、開発スピードを向上させることができます

本記事では、CI/CDの基本を踏まえた上で、応用的なテクニックや高度な自動化の実装方法 を解説します。


2. CI/CDの基本構成

CI/CDは主に以下の2つの要素で構成されます。

2.1. CI(継続的インテグレーション

  • コードの変更を自動的にテスト&統合するプロセス
  • 例: GitHub Actions, GitLab CI/CD, CircleCI など

2.2. CD(継続的デリバリー / デプロイメント)

  • CIの結果を基に、ステージング環境または本番環境へデプロイ
  • デリバリー(Continuous Delivery):手動で本番デプロイ
  • デプロイメント(Continuous Deployment):自動で本番デプロイ

3. 高度なCI/CD応用テクニック

3.1. マルチステージCI/CDパイプライン

シンプルなCI/CDでは、ビルド → テスト → デプロイ の単一フローですが、大規模なシステムでは 開発・ステージング・本番 などの複数ステージを利用します。

例:GitHub ActionsでのマルチステージCI/CD

name: Multi-Stage CI/CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: コード取得
        uses: actions/checkout@v3

      - name: アプリのビルド
        run: |
          npm install
          npm run build

  test:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: コード取得
        uses: actions/checkout@v3

      - name: テスト実行
        run: npm test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: 本番環境へデプロイ
        run: |
          scp -r ./build user@server:/var/www/app

ポイント

  • buildtestdeploy の順にステージを実行
  • needs: を使うことで、前のステージが成功した場合のみ実行
  • if: github.ref == 'refs/heads/main'mainブランチのときだけデプロイ

3.2. Dockerを活用したCI/CD

コンテナ技術をCI/CDに組み込むことで、環境差異を排除し、一貫したビルドとデプロイが可能 になります。

例:Dockerを利用したGitLab CI/CD

stages:
  - build
  - test
  - deploy

build:
  stage: build
  script:
    - docker build -t myapp:${CI_COMMIT_SHA} .
    - docker push myregistry.com/myapp:${CI_COMMIT_SHA}

test:
  stage: test
  script:
    - docker run --rm myregistry.com/myapp:${CI_COMMIT_SHA} npm test

deploy:
  stage: deploy
  script:
    - docker pull myregistry.com/myapp:${CI_COMMIT_SHA}
    - docker run -d -p 80:3000 myregistry.com/myapp:${CI_COMMIT_SHA}

ポイント
- docker build でコンテナ化し、タグ(CI_COMMIT_SHA)でバージョン管理 - docker push でリモートリポジトリへプッシュ - docker run で本番環境へデプロイ


3.3. ブルーグリーンデプロイ

ブルーグリーンデプロイとは、2つの本番環境(BlueとGreen)を用意し、新しいバージョンを安全に切り替える手法 です。

メリット
- ダウンタイムなし でデプロイ可能 - 問題発生時に即座にロールバック

例:Kubernetesでのブルーグリーンデプロイ

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-green
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myregistry.com/myapp:latest
          ports:
            - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000

手順

  1. myapp-green(新バージョン)をデプロイ
  2. myapp-serviceトラフィックmyapp-green に切り替え
  3. 旧バージョン(myapp-blue)を削除

3.4. カナリアデプロイ

カナリアデプロイは、新バージョンを段階的に展開し、問題がなければ100%のトラフィックを移行する 方法です。

例:Kubernetesカナリアデプロイ

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
    - myapp.com
  http:
    - route:
        - destination:
            host: myapp
            subset: stable
          weight: 90
        - destination:
            host: myapp
            subset: canary
          weight: 10

ポイント

  • 90%のユーザーは安定版(stable)へ
  • 10%のユーザーは新バージョン(canary)へ
  • 問題がなければ、新バージョンの割合を増やす

4. まとめ

応用テクニック 概要 利点
マルチステージCI/CD 開発・ステージング・本番を分離 一貫性のあるデプロイ
Dockerを活用 環境差異を排除 安定したビルド・デプロイ
ブルーグリーンデプロイ 2つの環境を切り替え ダウンタイムなし・即時ロールバック
カナリアデプロイ 徐々に新バージョンへ移行 リスクを抑えたデプロイ

結論
CI/CDの基本を理解した上で、プロジェクトの規模や要件に応じた高度な自動化戦略を導入する ことで、より安全で効率的な開発フローを実現できます。

次のステップとして、チームの開発環境に適したCI/CDの応用を試してみましょう!