azuresql-db-ci について
CI のサービスコンテナーで Azure SQL Database エンジンを使い、統合テストを実行するためのスキルです。プライベートイメージの認証、起動確認、データベース作成、GitHub Actions などでの接続設定を扱います。
主な機能
- 01CI サービスコンテナーで Azure SQL Database エンジンを実行
- 02プライベートレジストリの認証設定
- 03sqlcmd のヘルスチェックで起動を確認
- 04テスト前に appdb を作成
- 05GitHub Actions、Azure Pipelines、GitLab CI に対応する設定
活用シーン
- 01GitHub Actions でデータベース統合テストを実行
- 02Azure Pipelines でコンテナーを利用
- 03GitLab CI にプライベートイメージを設定
- 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を追加してください。
最新情報の確認
このスキルで使用するツールについて、バージョンが固定された信頼できるリファレンスです(必要なものを参照してください)。
- GitHub Actions service containers:ワークフローにおけるサービスコンテナー、ヘルスチェックのオプション、認証情報の仕組みを説明しています。
- GitHub workflow JSON schema:ワークフロー YAML の信頼できるスキーマです。
Microsoft Learn MCP サーバーが設定されている場合は、mcp__microsoft-learn__microsoft_docs_search または mcp__microsoft-learn__microsoft_docs_fetch を使用して、これらの最新バージョンを必要に応じて取得してください。これは任意です。利用できない場合は、上記のリファレンスを信頼できる情報源として使用してください。