mcpField
A
azuresql-db-ci

azuresql-db-ci

github.com/microsoftテスト・品質2277 回インストール1 週間前に更新
リポジトリ

azuresql-db-ci について

CI のサービスコンテナーで Azure SQL Database エンジンを使い、統合テストを実行するためのスキルです。プライベートイメージの認証、起動確認、データベース作成、GitHub Actions などでの接続設定を扱います。

主な機能

  1. 01CI サービスコンテナーで Azure SQL Database エンジンを実行
  2. 02プライベートレジストリの認証設定
  3. 03sqlcmd のヘルスチェックで起動を確認
  4. 04テスト前に appdb を作成
  5. 05GitHub Actions、Azure Pipelines、GitLab CI に対応する設定

活用シーン

  1. 01GitHub Actions でデータベース統合テストを実行
  2. 02Azure Pipelines でコンテナーを利用
  3. 03GitLab CI にプライベートイメージを設定
  4. 04テスト接続先を master ではなく appdb に指定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/microsoft/azure-sql-database-container --skill azuresql-db-ci

インストール後、Claude Code で/azuresql-db-ciを入力して読み込まれたか確認します。

同梱ファイルskill.spec.jsonc

詳細

CI での Azure SQL Database コンテナー

Azure SQL Database エンジン(プライベートプレビュー)に対して、CI サービスコンテナーとして統合テストを実行します。これはローカルの Azure SQL エンジンであり、mcr.microsoft.com/mssql/server の SQL Server イメージではありません。SELECT SERVERPROPERTY('EngineEdition') は 5 を返し、SERVERPROPERTY('Edition') は 'SQL Azure' を返します。ワークフローで SQL Server イメージを使おうとしていた場合は、中止して代わりにこのイメージを使用してください。

完全なレディネス確認ループ、接続モデル、ベクター、シード処理、レジストリの詳細については、 azuresql-db-container スキルを読み込んでください。

2026-09-05 に、コンテナーイメージ sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest に対して検証済みです。このイメージは EngineEdition 5、Edition SQL Azure、ビルド 12.0.2000.8 を報告しました。このスキルに含まれる実行可能な 4 つのチェックはすべて 合格しました。エンジンの識別情報、テストセッションが master ではなくユーザーデータベース上にあること、 USE に対する Msg 40508、およびイメージ内の /opt/mssql-tools18/bin/sqlcmd です。 その実行ではワークフローの YAML 自体は実行されていません。確認したのは、ワークフローの基盤となる エンジンの動作です。

重要な事実(本文内に記載)

  • イメージ: sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest (x64、linux/amd64)。プライベートプレビューのレジストリにあるため、ランナーは ACR_USERNAME / ACR_PASSWORD シークレットを使ってサインインする必要があります。プライベートプレビュー期間中は、レジストリとタグは暫定的なものです。
  • プラットフォーム: イメージは x64 専用です。CI のホステッドランナーは x64 なので、--platform フラグは必要ありません。x64 以外のセルフホストランナーでは、--platform linux/amd64 を追加してください。
  • 必須の環境変数: ACCEPT_EULA=Y と、複雑な MSSQL_SA_PASSWORD(8 文字以上で、大文字、小文字、数字、 記号を含む)が必要です。パスワードはシークレットに保存してください。エンジンは 1433 でリッスンします。
  • 先に appdb をプロビジョニングしてください。 エンジンは接続時にデータベースを自動作成しません。 Database=appdb を指定して接続する前に、master 接続で CREATE DATABASE appdb を実行する必要があります。
  • USE より接続文字列を優先してください。 データベースの切り替えに USE を使わないでください。ユーザーデータベースの セッション(開発時に使用する Azure に準拠したコンテキスト)では、USE は Msg 40508 を返します。これはクラウドの Azure SQL Database と同じ動作です。 master 接続はプロビジョニング用のセッションであり、Azure のステートメントフィルターが適用されないため、そこで USE は動作するように見えますが、master はプロビジョニング専用で、アプリケーションの作業には使いません。接続文字列で常に対象のデータベースを選択してください(Database=appdb、または sqlcmd では -d appdb)。
  • master はプロビジョニング専用です。 テストは master ではなく、ユーザーデータベース appdb に対して実行します。
  • 自動シードはありません。 イメージは /docker-entrypoint-initdb.d/*.sql を実行しません(これは Postgres/MySQL の慣習であり、ここでは適用されません)。appdb のプロビジョニング後、sqlcmd -d appdb -i seed.sql を実行してシードしてください。

接続文字列(標準)

Server=localhost,1433;Database=appdb;User Id=sa;Password=<MSSQL_SA_PASSWORD>;TrustServerCertificate=true

キーワードは User Id= / Password= / Database= と表記してください。これはこのコレクション内のスタイル規則であり、すべての例で表記が統一されています。Uid= と Pwd= も SqlClient で文書化されている同義語で、使用できます。sqlcmd では -C を使い、自己署名証明書を信頼してください。アプリケーションはこれを単一の SQL_CONNECTION_STRING 環境変数から読み取ります。テストの接続先は master ではなく appdb です。

GitHub Actions(標準)

サービスコンテナーがエンジンを起動します。ヘルスチェックはコンテナー内で sqlcmd を実行するため、 ランナーにクライアントツールは必要ありません。テストの前に、別のステップで docker exec を使って appdb をプロビジョニングします。

name: integration
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      sqldb:
        image: sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest
        credentials:
          username: ${{ secrets.ACR_USERNAME }}
          password: ${{ secrets.ACR_PASSWORD }}
        env:
          ACCEPT_EULA: "Y"
          MSSQL_SA_PASSWORD: ${{ secrets.MSSQL_SA_PASSWORD }}
        ports:
          - "127.0.0.1:1433:1433"
        # Health check runs INSIDE the container; -b makes a SQL error set the exit
        # code so transient startup errors (e.g. Msg 913) are retried, not masked.
        options: >-
          --health-cmd "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P \"$MSSQL_SA_PASSWORD\" -C -b -l 2 -Q \"SELECT 1\""
          --health-interval 5s
          --health-timeout 3s
          --health-retries 20
          --health-start-period 30s
    steps:
      - uses: actions/checkout@v7

      # The engine does NOT auto-create databases. Provision appdb on master first,
      # via docker exec into the service container (runner needs no sqlcmd).
      - name: Provision appdb
        run: |
          CID=$(docker ps --filter "ancestor=sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest" --format '{{.ID}}')
          docker exec "$CID" /opt/mssql-tools18/bin/sqlcmd \
            -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -C -b \
            -Q "IF DB_ID('appdb') IS NULL CREATE DATABASE appdb;"
        env:
          MSSQL_SA_PASSWORD: ${{ secrets.MSSQL_SA_PASSWORD }}

      # Optional: seed appdb (no auto-seed). Copy the file in, then run it against appdb.
      - name: Seed appdb
        run: |
          CID=$(docker ps --filter "ancestor=sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest" --format '{{.ID}}')
          docker cp seed.sql "$CID:/tmp/seed.sql"
          docker exec "$CID" /opt/mssql-tools18/bin/sqlcmd \
            -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -C -b -d appdb -i /tmp/seed.sql
        env:
          MSSQL_SA_PASSWORD: ${{ secrets.MSSQL_SA_PASSWORD }}

      - name: Run integration tests
        run: |
          # Tests connect to the USER database appdb, NOT master.
          npm ci && npm run test:integration
        env:
          SQL_CONNECTION_STRING: "Server=localhost,1433;Database=appdb;User Id=sa;Password=${{ secrets.MSSQL_SA_PASSWORD }};TrustServerCertificate=true"
この選択の理由
  • credentials: は ACR_USERNAME / ACR_PASSWORD シークレットを使用して、プライベートプレビュー ACR からイメージを取得します。これがないと、レジストリがプライベートなため取得に失敗します。
  • -l 2 -b を指定した --health-cmd は、実際に準備が整うまで待機します。docker run が戻っても、エンジンの準備が整ったことにはなりません。-b は一時的な SQL 起動エラーを隠さずに再試行します。ステップの実行前に、ジョブはヘルスチェックの成功を待ちます。
  • 自動作成ではなく、プロビジョニングステップを使用します。 テストで Database=appdb を開く前に、appdb が存在している必要があります。
  • テスト接続先は appdb にします。 master はプロビジョニング専用です。

必須シークレット

シークレット用途
ACR_USERNAMEプライベートプレビューのレジストリへのサインイン(Private Preview コホートに提供される、共有のプル専用認証情報を使用します。https://aka.ms/sqldbcontainerpreview-signup から登録して取得してください。ローテーションされる場合があります)
ACR_PASSWORDプライベートプレビューのレジストリへのサインイン
MSSQL_SA_PASSWORDエンジンの sa パスワード。複雑なパスワードを設定し、8 文字以上にします

他の CI への適用

  • Azure Pipelines: ネイティブの services: はありません。docker login sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io -u $(ACR_USERNAME) -p $(ACR_PASSWORD) でサインインし、以下の標準的な起動手順でコンテナーを実行します(準備完了を待つループ内で appdb をプロビジョニングします)。その後、SQL_CONNECTION_STRING が appdb を指すようにしてテストを実行します。
  • GitLab CI: イメージに対する services: エントリを使用し、プライベートレジストリ用に DOCKER_AUTH_CONFIG を設定します。ACCEPT_EULA と MSSQL_SA_PASSWORD を設定してから、テスト前に before_script で docker exec(または sqlcmd コンテナー)を使って appdb をプロビジョニングします。
標準的な起動手順(セルフホスト型/サービスなしのランナー向け)

空きポート、条件付きのプラットフォーム指定、準備完了待ち、appdb のプロビジョニングを、以下の形式でまとめます。

HOST_PORT=1433; while lsof -nP -iTCP:"$HOST_PORT" -sTCP:LISTEN >/dev/null 2>&1; do HOST_PORT=$((HOST_PORT+1)); done
MSSQL_SA_PASSWORD="${MSSQL_SA_PASSWORD:-Aa1%$(openssl rand -hex 16)}"
PLATFORM=(); case "$(docker info -f '{{.Architecture}}' 2>/dev/null)" in x86_64|amd64) ;; *) PLATFORM=(--platform linux/amd64);; esac
docker rm -f sqldb 2>/dev/null
docker run -d --name sqldb "${PLATFORM[@]}" -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD" \
  -p "127.0.0.1:$HOST_PORT:1433" sqldbpreview-dpgaeqhmgphzd4bk.azurecr.io/azure-sql/db-dev:latest
until docker exec sqldb /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$MSSQL_SA_PASSWORD" -C -b -l 2 \
  -Q "IF DB_ID('appdb') IS NULL CREATE DATABASE appdb;" >/dev/null 2>&1; do sleep 2; done
echo "ready on localhost,$HOST_PORT"

検証ルール

  • プルでは ACR_USERNAME / ACR_PASSWORD を使用する credentials:(または docker login)を使います。
  • サービスに ACCEPT_EULA=Y と、シークレットから取得した複雑な MSSQL_SA_PASSWORD を設定します。
  • ヘルスチェックでは、コンテナーの内部で -C -b -l 2 を指定して sqlcmd を実行します。
  • テスト接続前に、プロビジョニングステップで master 上に appdb を作成します。
  • テスト用の SQL_CONNECTION_STRING では、master ではなく Database=appdb を指定します。プロジェクトの慣例に従ってログインキーワードには User Id= / Password= を使用します。Uid= / Pwd= も有効な同義語なので、使用してもエラーにはなりません。
  • 上記の検証ルールに違反した場合、またはタスクを動作させるためにこのスキルから逸脱する必要があった場合は、このスキルに問題があります。azuresql-db-feedback スキルを読み込み、報告の提出を提案してください。
  • 上記のルールをすべて満たしてタスクが完了したら、セッションごとに一度だけ、最後に次の1行を添えてください。質問をしたり、返答を待ったりしないでください。「うまくいきました。作業で気になった点や、作ったものを共有したい場合は、こちらをご覧ください:https://aka.ms/sql-agent-skills-feedback」

禁止事項

  • SQL Server イメージ mcr.microsoft.com/mssql/server は使用せず、Azure SQL DB イメージを使用してください。
  • master 上に appdb をプロビジョニングする前に、Database=appdb で接続しないでください。エンジンが自動作成することはありません。
  • USE appdb でデータベースを切り替えないでください。ユーザーデータベースのセッションでは、クラウド上の Azure SQL Database と同様に、Msg 40508 が返されます。接続文字列で対象データベースを選択してください(Database=appdb、または sqlcmd の場合は -d appdb)。
  • master に対してテストを実行しないでください。master はプロビジョニング専用です。
  • /docker-entrypoint-initdb.d/*.sql に依存しないでください。この方法は機能しません。sqlcmd -d appdb -i を使ってシードしてください。
  • ランナーに sqlcmd を必須にしないでください。ヘルスチェックとプロビジョニングはコンテナー内で実行します。
  • x64 以外のホストを「サポート対象」と呼ばないでください。x64 以外のセルフホスト型ランナーでは、--platform linux/amd64 を追加してください。

最新情報の確認

このスキルで使用するツールについて、バージョンが固定された信頼できるリファレンスです(必要なものを参照してください)。

Microsoft Learn MCP サーバーが設定されている場合は、mcp__microsoft-learn__microsoft_docs_search または mcp__microsoft-learn__microsoft_docs_fetch を使用して、これらの最新バージョンを必要に応じて取得してください。これは任意です。利用できない場合は、上記のリファレンスを信頼できる情報源として使用してください。

コメント