Web アプリケーション プロジェクト用のカスタム TFS ビルド プロセスがあり、公開も行います。これを達成するために、ビルドからコンパイル済みソースをコピーする前に、現在の発行場所を削除しようとします。
サイトにアクセスする人がいるためにファイルがロックされている場合を除いて、これは (ほとんどの場合) 機能します。ほとんどの場合、ビルドは誰もアクセスしていないときに行われるため (これらは純粋に開発および QA ビルドであるため)、通常は問題ありません。 .
パブリッシュ ディレクトリを削除できないエッジ ケースを修正するために、app_offline.htm ファイルをディレクトリにコピーし、4 秒待ってからサイトの残りの部分を削除します。これは機能し、公開が終了した後に app_offline.htm を削除しようとしても、この手順でエラーは発生しませんでした。次のエラーが表示されます。
ワークフローをキャンセルできません。エージェントを再起動する必要があります。詳細: WorkflowApplication f670d4fb-d9e3-4f33-bc3d-925faa925e04 が中止されたため、操作を実行できませんでした。
削除は、カスタム CodeActivity を使用して作成されます (TFS ワークフローには削除がないため)。
public sealed class DeleteFile : CodeActivity
{
// Define an activity input argument of type string
[RequiredArgument]
public InArgument<string> File { get; set; }
public InArgument<int?> Tries { get; set; }
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
int tries = Tries.Get(context) ?? 1;
for (int i = 0; i < tries; i++)
{
try
{
System.IO.File.Delete(File.Get(context));
break;
}
catch (System.IO.IOException)
{
if (i == tries - 1)
throw;
Thread.Sleep(TimeSpan.FromSeconds(4));
}
}
}
}
後で「Tries」引数を追加して、このエラーの原因を見つけようとしました。
ただし、ログを表示すると、上記のエラーは DeleteFile アクティビティの下には配置されず、ログの先頭にのみ配置され、他のエラーや警告は表示されないことに注意してください。
最後に、tfsbuild ユーザーは公開ディレクトリに対する削除権限を持っています (app_offline.htm だけで残りのディレクトリを削除しても問題ありません)。