デプロイビルド構成
プロジェクトが構築されテストされたら、最終的なインフラストラクチャにデプロイする必要があることがよくあります。 たとえば、NuGet ギャラリーにパッケージをアップロードしたり、DockerHub リポジトリにコンテナーを配信したり、ドキュメント Web サイトのソースを更新したりします。 さまざまな CI/CD ソリューションでは、パイプラインのこの最後のステップに「デプロイ」ステージ、配信ターゲット、リリース、本番環境などのさまざまな用語を使用します。
TeamCity では、配信タスクは通常のビルドルーチンを実行する同じ "ビルド構成" オブジェクトによって実行されます。 ただし、ビルドと配信は異なるチームメンバーによってトリガーされる異なるタスクであるため、製品をデプロイする構成は、明示的に デプロイ構成 としてマークできます。
鍵となるポイント
デプロイ構成は、通常の構築ルーチンを実行する構成と、アプリを外部インフラストラクチャに配信する構成を区別するように設計されています。
デプロイ構成は、機能の点で通常の構成と変わりません。 同じビルド機能を利用したり、同じビルドランナーを使用したりすることができます。
デプロイ構成が同じチェーン内で通常のビルド/テスト構成の後に続く場合、十分な権限を持つ TeamCity ユーザーは通常の構成から直接デプロイをトリガーできます。
デプロイ構成では、個人用ビルドを実行できません。 また、1 つのデプロイ構成に属する 2 つのビルドを同時に実行することはできません。
きめ細かいユーザー権限を設定するには、デプロイとビルド / テスト構成を異なるサブプロジェクトに分割することをお勧めします。
ビルド構成タイプを切り替えるには、「構成設定 | 一般 」タブに移動します。
サンプル
このチュートリアルでは、 複合ビルド構成 記事で開発されたパイプラインを補足するデプロイ構成を作成します。

ビルドワークフローを作成する
複合ビルド構成 の記事で説明されている手順に従って、複合「すべてビルド」構成で終わる 5 つの相互接続された構成のチェーンを作成します。

デプロイサブプロジェクトを作成する
建物構成を編集して実行できる通常のプロジェクト開発者は、配信タスクを実行できないようにする必要があります。 きめ細かいユーザー権限を設定し、配信関連のパラメーターと資格情報をメインの構築パイプラインから離れた場所に安全に保存するには、別のプロジェクトで配信構成を作成することをお勧めします。
管理 | <あなたのプロジェクト> に移動し、 サブプロジェクトを作成 をクリックします。
手動で タイルを選択して、特定の VCS リポジトリに関係のない空のプロジェクトを作成します。
サブプロジェクト名を 「デプロイ構成」に設定します。
プロジェクトと配信ターゲットのタイプに応じて、デプロイ構成には異なる手順が含まれる場合があります。 例: 構成では、 nuget push コマンドを実行してパッケージを NuGet ギャラリーにアップロードする .NET ランナー、またはファイルを FTP サーバーまたは Windows 共有にアップロードする デプロイヤー の 1 つを使用できます。
このサンプルでは、デプロイ構成は Docker イメージを DockerHub レジストリにアップロードします。 このため、レジストリアドレスとログイン資格情報を指定する Docker 接続を作成する必要があります。 この接続は、このサブプロジェクトのすべての構成で使用できます。 接続を作成するには、サブプロジェクトの 接続 タブに移動します。
以下の Kotlin コードは、最終的なセットアップを示しています。
// Main Project
project {
buildType(Building_1) // The "Build All" configuration
subProject(BuildingConfigsProject) // The subproject with building configs
subProject(DeploymentConfigsProject) // Our new subproject for deployment
}
// ...
object DeploymentConfigsProject : Project({
name = "Deployment Configurations"
description = "This subproject contains configurations that perform delivery tasks"
features {
dockerRegistry {
id = "PROJECT_EXT_5"
name = "Docker Registry"
userName = "your_dockerhub_name"
password = "credentialsJSON:0ff181ee-cc10-48ac-b5f4-ce50ca2013b4"
}
}
})
最初のデプロイ構成を追加する
新しいサブプロジェクトの 一般設定 タブで、 ビルド構成を作成 をクリックします。
手動で オプションを選択し、構成名として 「コンソールのデプロイ (Windows)」と入力します。
ビルド構成タイプを「デプロイ」に設定します。
バージョン管理設定 で、 VCS ルートを接続 をクリックし、すべての " 建てる ..." 構成で使用される同じルートを選択します。
"コンソールをデプロイ (Windows)" は "コンソール & ウェブをビルド (win-x64)" ビルド構成に依存しており、そのアーティファクトにアクセスできる必要があります。
ビルド構成 | 依存関係 に移動し、対応するスナップショットとアーティファクト (bin => コンテキスト) の依存関係を追加します。
生成されたコンテナーをアップロードする必要があるため、 デプロイサブプロジェクトを作成する セクションで作成した Docker 接続を使用する Docker レジストリ接続 ビルド機能を追加します。
構成に 3 つのビルドステップを追加します。
ステップ #1 — 必要な .NET ランタイムコンテナー イメージをプルします (すでにプル済みの場合は更新します) する Docker ランナー。
ステップ #2 — context/コンソール.windows.dockerfile の指示を使用してイメージをビルドする Docker ランナー。
ステップ #3 — 新しく構築されたイメージを公開する別の Docker ランナーステップ。
最終的な構成セットアップは次のようになります。
object DeploymentConfigsProject_DeployConsoleWindows : BuildType({
name = "Deploy Console (Windows)"
enablePersonalBuilds = false
type = BuildTypeSettings.Type.DEPLOYMENT
maxRunningBuilds = 1
vcs {
root(DslContext.settingsRoot)
}
steps {
dockerCommand {
name = "Pull container"
commandType = other {
subCommand = "pull"
commandArgs = "mcr.microsoft.com/dotnet/runtime:7.0"
}
}
dockerCommand {
name = "Build container"
commandType = build {
source = file {
path = "context/console.windows.dockerfile"
}
contextDir = "context"
platform = DockerCommandStep.ImagePlatform.Windows
namesAndTags = "username/clock-console:windows"
commandArgs = "--build-arg baseImage=mcr.microsoft.com/dotnet/runtime:7.0"
}
}
dockerCommand {
name = "Push container"
commandType = push {
namesAndTags = "username/clock-console:windows"
}
}
}
features {
dockerRegistryConnections {
loginToRegistry = on {
dockerRegistryId = "PROJECT_EXT_5"
}
}
}
dependencies {
dependency(Building_BuildConsoleWebWinX64) {
snapshot {
}
artifacts {
artifactRules = "bin => context"
}
}
}
requirements {
contains("teamcity.agent.os.name", "windows-server-2022")
}
})
デリバリー構成を実行する
上記のコードは、デプロイビルド構成の最初の固有機能をハイライトしています: デフォルト設定が通常の構成の設定と異なります。
デプロイビルド構成のその他の独自の機能は次のとおりです。
デプロイビルドを開始するボタンは、 実行 ではなく デプロイ と呼ばれます。

アーティファクトを生成した構成から直接、アーティファクトをデプロイできます。 完了した通常ビルドの詳細を開き、「デプロイ」セクションの デプロイ をクリックします。

デプロイビルドが開始されると、「デプロイ」セクションから進行状況を追跡できます。 ビルドが完了すると、 再デプロイ ボタンが表示されます。 このボタンを使用すると、配信ルーチンを再実行できます。

ビルド構成のアーティファクトがすでにデプロイされている場合、以前のビルドは、デプロイ構成をトリガーすると新しい配信がオーバーライドされることをユーザーに警告します。

TeamCity のプロジェクト、構成、個々のビルドにある 変更 タブと 変更ログ タブでは、リビジョン番号をクリックして、各変更に関する詳細情報を表示できます。 パイプラインに配信構成がある場合、この変更の詳細ページには デプロイ タブが表示され、この変更がいつ初めて配信されたかをすぐに識別できます。

通常のビルド構成では、最新の変更を含むビルドが最初に表示されます。 デプロイ構成では、ビルドが時系列に並べられます。
デリバリー構成をさらに追加する
「コンソールのデプロイ (Windows)」構成設定に移動し、 アクション | 構成をコピー をクリックして配信構成のコピーを 3 つ作成します。
新しいコピーを次のように変更します。
ウェブをデプロイ (Windows) — context/ウェブ.linux.dockerfile からの指示を使用してイメージを構築し、このイメージを別の「docker_username/clock-web」レジストリにプッシュします。
コンソールをデプロイ (Linux) — ビルドコンソール & ウェブ (linux-x64) 構成へのスナップショットとアーティファクトの依存関係があります。 ビルドステップでは、異なる Linux ベースのイメージを使用します。
ウェブをデプロイ (Linux) — 上記の両方。
親 (最上位) プロジェクトに移動し、既存の 「すべて構築」の横に新しいステップレス構成を作成します。 この新しい構成を 「すべてデプロイ」と呼び、そのタイプを「デプロイ」に設定します。
「すべてデプロイ」構成設定で、4 つの個別の「配置 ... 」構成すべてにスナップショット依存関係を追加します。
最終的には、すべての構築タスクとデプロイタスクを便利に実行するメインプロジェクトレベルで 4 つの独立したデプロイ構成と 2 つの構成が得られます。

この設定では、個々の " 建てる ..." 構成ビルドのビルド結果ページの「デプロイ」セクションに複数のオプションが表示されることに注意してください。 ビルドが終了すると、関連するデプロイターゲットをトリガーできます。

すべての " デプロイする ..." 構成の最終構成を以下に示します。
object DeployAll : BuildType({
name = "Deploy All"
enablePersonalBuilds = false
type = BuildTypeSettings.Type.DEPLOYMENT
maxRunningBuilds = 1
dependencies {
snapshot(DeploymentConfigsProject_DeployConsoleLinux) {
}
snapshot(DeploymentConfigsProject_DeployConsoleWindows) {
}
snapshot(DeploymentConfigsProject_DeployWebLinux) {
}
snapshot(DeploymentConfigsProject_DeployWebWindows) {
}
}
})
object DeploymentConfigsProject_DeployConsoleWindows : BuildType({
name = "Deploy Console (Windows)"
enablePersonalBuilds = false
type = BuildTypeSettings.Type.DEPLOYMENT
maxRunningBuilds = 1
vcs {
root(DslContext.settingsRoot)
}
steps {
dockerCommand {
name = "Pull container"
commandType = other {
subCommand = "pull"
commandArgs = "mcr.microsoft.com/dotnet/runtime:7.0"
}
}
dockerCommand {
name = "Build container"
commandType = build {
source = file {
path = "context/console.windows.dockerfile"
}
contextDir = "context"
platform = DockerCommandStep.ImagePlatform.Windows
namesAndTags = "username/clock-console:windows"
commandArgs = "--build-arg baseImage=mcr.microsoft.com/dotnet/runtime:7.0"
}
}
dockerCommand {
name = "Push container"
commandType = push {
namesAndTags = "username/clock-console:windows"
}
}
}
features {
dockerRegistryConnections {
loginToRegistry = on {
dockerRegistryId = "PROJECT_EXT_5"
}
}
}
dependencies {
dependency(Building_BuildConsoleWebWinX64) {
snapshot {
}
artifacts {
artifactRules = "bin => context"
}
}
}
requirements {
contains("teamcity.agent.os.name", "windows-server-2022")
}
})
object DeploymentConfigsProject_DeployConsoleLinux : BuildType({
name = "Deploy Console (Linux)"
enablePersonalBuilds = false
type = BuildTypeSettings.Type.DEPLOYMENT
maxRunningBuilds = 1
vcs {
root(DslContext.settingsRoot)
}
steps {
dockerCommand {
name = "Pull runtime dependencies"
commandType = other {
subCommand = "pull"
commandArgs = "mcr.microsoft.com/dotnet/runtime-deps:7.0-alpine"
}
}
dockerCommand {
name = "Build container"
commandType = build {
source = file {
path = "context/console.linux.dockerfile"
}
contextDir = "context"
platform = DockerCommandStep.ImagePlatform.Linux
namesAndTags = "username/clock-console:ubuntu"
commandArgs = "--build-arg baseImage=mcr.microsoft.com/dotnet/runtime-deps:7.0-alpine"
}
}
dockerCommand {
name = "Push container"
commandType = push {
namesAndTags = "username/clock-console:ubuntu"
}
}
}
features {
dockerRegistryConnections {
loginToRegistry = on {
dockerRegistryId = "PROJECT_EXT_5"
}
}
}
dependencies {
dependency(Building_BuildConsoleWebLinuxX64) {
snapshot {
}
artifacts {
artifactRules = "bin => context"
}
}
}
requirements {
contains("teamcity.agent.os.name", "ubuntu-20.04")
}
})
object DeploymentConfigsProject_DeployWebWindows : BuildType({
name = "Deploy Web (Windows)"
enablePersonalBuilds = false
type = BuildTypeSettings.Type.DEPLOYMENT
maxRunningBuilds = 1
vcs {
root(DslContext.settingsRoot)
}
steps {
dockerCommand {
name = "Pull container"
commandType = other {
subCommand = "pull"
commandArgs = "mcr.microsoft.com/dotnet/runtime:7.0"
}
}
dockerCommand {
name = "Build container"
commandType = build {
source = file {
path = "context/web.windows.dockerfile"
}
contextDir = "context"
platform = DockerCommandStep.ImagePlatform.Windows
namesAndTags = "username/clock-web:windows"
commandArgs = "--build-arg baseImage=mcr.microsoft.com/dotnet/runtime:7.0"
}
}
dockerCommand {
name = "Push container"
commandType = push {
namesAndTags = "username/clock-web:windows"
}
}
}
features {
dockerRegistryConnections {
loginToRegistry = on {
dockerRegistryId = "PROJECT_EXT_5"
}
}
}
dependencies {
dependency(Building_BuildConsoleWebWinX64) {
snapshot {
}
artifacts {
artifactRules = "bin => context"
}
}
}
requirements {
contains("teamcity.agent.os.name", "windows-server-2022")
}
})
object DeploymentConfigsProject_DeployWebLinux : BuildType({
name = "Deploy Web (Linux)"
enablePersonalBuilds = false
type = BuildTypeSettings.Type.DEPLOYMENT
maxRunningBuilds = 1
vcs {
root(DslContext.settingsRoot)
}
steps {
dockerCommand {
name = "Pull runtime dependencies"
commandType = other {
subCommand = "pull"
commandArgs = "mcr.microsoft.com/dotnet/runtime-deps:7.0-alpine"
}
}
dockerCommand {
name = "Build container"
commandType = build {
source = file {
path = "context/web.linux.dockerfile"
}
contextDir = "context"
platform = DockerCommandStep.ImagePlatform.Linux
namesAndTags = "username/clock-web:ubuntu"
commandArgs = "--build-arg baseImage=mcr.microsoft.com/dotnet/runtime-deps:7.0-alpine"
}
}
dockerCommand {
name = "Push container"
commandType = push {
namesAndTags = "username/clock-web:ubuntu"
}
}
}
features {
dockerRegistryConnections {
loginToRegistry = on {
dockerRegistryId = "PROJECT_EXT_5"
}
}
}
dependencies {
dependency(Building_BuildConsoleWebLinuxX64) {
snapshot {
}
artifacts {
artifactRules = "bin => context"
}
}
}
requirements {
contains("teamcity.agent.os.name", "ubuntu-20.04")
}
})
ユーザー権限をセットアップする
管理 | ユーザー管理 セクションでは、プロジェクトごとの ユーザーロールと権限を設定できます。 次の例を考えてみましょう。
この設定では、Alice はビルドとデプロイタスクをトリガーできますが、Bob は配信を開始できません。 Bob が任意の "ビルド..." 構成のビルド結果を閲覧しても、TeamCity は "デプロイメント" セクションを表示しません。
TeamCity では現在、ビルド構成スコープにロールと権限を設定できません。 そのため、Bob が 「すべて構築」ビルドを実行できるようにしながらも、 「すべてデプロイ」ビルドをトリガーできないようにする権限を設定することはできません。 この問題を回避するには、これらの集約構成を対応するサブプロジェクトに移動します。
2026 年 9 月 11 日