سؤال

لقد كنت أبحث في ميزات بناء ونشر جديدة TFS2010 مع MSDePloy. حتى الآن كل شيء يسير على ما يرام (على الرغم من أنه من الصعب العثور على معلومات حول سيناريوهات محددة).

هل يمكنني تعديل تعريف البناء الخاص بي لتحديد خادمين أو أكثر لنشره؟ ما أحتاج إلى القيام به هو نشر خوادم متعددة (حيث لدي اثنان في بيئة الاختبار التي تستخدم NLB).

ما لدي الآن هو تعريف البناء الذي يبنيه ، ويدير اختباراتي ، ثم ينشر في أحد خوادم الاختبار الخاصة بي (الذي يعمل على تشغيل MSDePloyagentservice). إنه يعمل بشكل جيد ، ويتم نشر كل مشروع ويب على أنه تم تكوينه في ملف المشروع. حجج MSBuild التي أستخدمها هي:

* /p:DeployOnBuild=True
* /p:DeployTarget=MsDeployPublish
* /p:MSDeployServiceURL=http://oawww.testserver1.com.au/MsDeployAgentService
* /p:CreatePackageOnPublish=True
* /p:MsDeployPublishMethod=RemoteAgent
* /p:AllowUntrustedCertificated=True
* /p:UserName=myusername
* /p:Password=mypassword 

NB: أنا لا أستخدم /p: deployiisappath = "xyz" لأنها لا تنشر جميع مشاريعي وتتجاوز تكوين المشروع الخاص بي.

هل يمكنني إضافة وسيطة بناء أخرى لجعلها تتصل بأكثر من msdeployserviceurl؟ مثل شيء مثل وسيطة ثانية /p: msdeployserviceurl التي تحدد خادمًا آخر؟

أو هل يجب أن أبحث عن حل آخر ، مثل تحرير WF؟

رأيت نفس السؤال الذي تم نشره هنا منذ شهرين تقريبًا: TFS 2010 - نشر على خوادم متعددة بعد الإنشاء ، لذلك لا يبدو أنني الشخص الوحيد الذي يحاول حل هذا.

لقد نشرت أيضًا على منتديات IIS.NET حيث تتم مناقشة MSDeploy: http://forums.iis.net/t/1170741.aspx . كان لديه الكثير من المشاهدات ، ولكن مرة أخرى ، لا توجد إجابات.

هل كانت مفيدة؟

المحلول

ليس عليك بناء المشروع مرتين للنشر على خادمين. ستقوم عملية الإنشاء بإنشاء مجموعة من ملفات النشر. يمكنك بعد ذلك استخدام InvokeProcess للنشر على خوادم متعددة.

أولاً إنشاء متغير اسمه ProjectName. ثم أضف نشاط تعيين إلى تسلسل "تجميع المشروع". يقع هذا في تسلسل "حاول تجميع المشروع". فيما يلي خصائص التعيين:

To: ProjectName
Value: System.IO.Path.GetFileNameWithoutExtension(localProject)

فيما يلي خصائص نشاط معالجة InvokeProcess الخاصة بنا التي تنشر إلى خادم الاختبار:

Arguments: "/y /M:<server> /u:<domain>\<user> /p:<password>"
FileName: String.Format("{0}\{1}.deploy.cmd", BuildDetail.DropLocation, ProjectName)

You will need to change <server>, <domain>, <user>, and <password> to the values that reflect your environment.

إذا كنت بحاجة إلى النشر يدويًا على خادم ، فيمكنك تشغيل الأمر أدناه من مجلد الإنشاء الخاص بك:

deploy.cmd /y /M:<server> /u:<domain>\<user> /p:<password>

نصائح أخرى

لم أتمكن من العثور على الحل الذي كنت أبحث عنه ، لكن هذا ما توصلت إليه في النهاية.

كنت أرغب في الحفاظ على الحل بسيطًا وقابل للتكوين ضمن وسيطات TFS بينما في نفس الوقت تتفق مع المقدمة بالفعل MSBuildArguments الطريقة التي تمت ترقيتها كثيرا. لذلك قمت بإنشاء قالب بناء جديد ، وأضفت حجة سير عمل TFS جديدة تسمى MSBuildArguments2 في علامة التبويب الحجج في سير العمل.

alt text

لقد بحثت من خلال سير عمل BuildTemplate لجميع حالات MSBuildArguments (كان هناك حدثان).

المهمتان اللذان يستخدمان MSBuildArguments وتسمى Run MSBuild for Project. أسفل هذه المهمة مباشرة ، أضفت كتلة جديدة "if" مع الحالة:

Not String.IsNullOrEmpty(MSBuildArguments2)

ثم قمت بنسخ مهمة "Run MsBuild for Project" ولصقها في كتلة IF الجديدة "ثم" ، وتحديث عنوانها وفقًا لذلك. ستحتاج أيضًا إلى تحديث خاصية ConmandLineArguments للمهمة الجديدة لاستخدام وسيطتك الجديدة.

CommandLineArguments = String.Format("/p:SkipInvalidConfigurations=true {0}", MSBuildArguments2)

بعد هذه التعديلات ، يبدو سير العمل هكذا:

alt text

حفظ وتحقق في سير العمل الجديد. قم بتحديث تعريف البناء الخاص بك لاستخدام سير العمل الجديد هذا ، ثم في علامة تبويب عملية تعريف Build's ، ستجد قسمًا جديدًا يسمى MISC مع الوسيطة الجديدة الجاهزة لاستخدامها. لأنني ببساطة أستخدم هذه الوسيطة الجديدة للنشر ، قمت بنسخ الوسيطات نفسها التي استخدمتها بالضبط MSBuild Arguments وتحديث msdeployserviceurl إلى خادم النشر الثاني الخاص بي.

alt text

وهذا هو الذي. أفترض أن هناك طريقة أكثر أناقة هي تحويل موثوق msbuildarges إلى مجموعة من الأوتار ثم حلقة من خلالها أثناء عملية سير العمل. لكن هذا يناسب متطلبات خادم 2.

أتمنى أن يساعدك هذا!

إن حلي لهذا هو هدف جديد يعمل بعد الحزمة. يتضمن كل مشروع يحتاج إلى إنتاج حزمة ملف الأهداف هذا ، واخترت أن تجعل هذا المشرف على خاصية "DodePloyment" خارجيًا. بالإضافة إلى ذلك ، يعرّف كل مشروع خاصية DeployerVergroup بحيث يتم ترشيح خادم (خادم) الوجهة بشكل صحيح اعتمادًا على نوع المشروع.

كما ترون نحو الأسفل ، فأنا ببساطة أقوم بتنفيذ ملف الأوامر مع قائمة الخادم ، بسيطة للغاية.

<!-- 
This targets file allows a project to deploy its package  

As it is used by all project typesconditionally included from the project file 

-->

<UsingTask TaskName="Microsoft.TeamFoundation.Build.Tasks.BuildStep" AssemblyFile="$(TeamBuildRefPath)\Microsoft.TeamFoundation.Build.ProcessComponents.dll" />

<!-- Each Server needs the Group metadatum, either Webservers, Appservers, or Batch. -->
<Choose>
    <When Condition="'$(Configuration)' == 'DEV'">
        <ItemGroup>
            <Servers Include="DevWebServer">
                <Group>Webservers</Group>
            </Servers>
            <Servers Include="DevAppServer">
                <Group>Appservers</Group>
            </Servers>
        </ItemGroup>
    </When>
    <When Condition="'$(Configuration)' == 'QA'">
        <ItemGroup>
            <Servers Include="QAWebServer1">
                <Group>Webservers</Group>
            </Servers>
            <Servers Include="QAWebServer2">
                <Group>Webservers</Group>
            </Servers>
            <Servers Include="QAAppServer1">
                <Group>Appservers</Group>
            </Servers>
            <Servers Include="QAAppServer2">
                <Group>Appservers</Group>
            </Servers>
        </ItemGroup>
    </When>
</Choose>

<!-- DoDeploy can be set in the build defintion -->
<Target Name="StartDeployment" AfterTargets="Package">

    <PropertyGroup>
        <!-- The _PublishedWebsites area -->
        <PackageLocation>$(WebProjectOutputDir)_Package</PackageLocation>

        <!-- Override for local testing -->
        <PackageLocation Condition="$(WebProjectOutputDirInsideProject)">$(IntermediateOutputPath)Package\</PackageLocation>

    </PropertyGroup>

    <Message Text="Tier servers are @(Servers)" />

    <!-- A filtered list of the servers.  DeploymentServerGroup is defined in each project that does deployment -->
    <ItemGroup>
        <DestinationServers Include="@(Servers)" Condition="'%(Servers.Group)' == '$(DeploymentServerGroup)'" />
    </ItemGroup>

    <Message Text="Dest servers are @(DestinationServers)" />

</Target>

<!-- Only perform the deployment if any servers fit the filters -->
<Target Name="PerformDeployment" AfterTargets="StartDeployment" Condition="'@(DestinationServers)' != ''">

    <Message Text="Deploying $(AssemblyName) to @(DestinationServers)" />

    <!-- Fancy build steps so that they better appear in the build explorer -->
    <BuildStep
                    TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
                    BuildUri="$(BuildUri)"
                    Message="Deploying $(AssemblyName) to @(DestinationServers)...">
        <Output TaskParameter="Id" PropertyName="StepId" />
    </BuildStep>

    <!-- The deployment command will be run for each item in the DestinationServers collection.  -->
    <Exec Command="$(AssemblyName).deploy.cmd /Y /M:%(DestinationServers.Identity)" WorkingDirectory="$(PackageLocation)" />

    <BuildStep
                    TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
                    BuildUri="$(BuildUri)"
                    Id="$(StepId)"
                    Status="Succeeded"
                    Message="Deployed $(AssemblyName) to @(DestinationServers)"/>
    <OnError ExecuteTargets="MarkDeployStepAsFailed" />
</Target>

<Target Name="MarkDeployStepAsFailed">
    <BuildStep
            TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
            BuildUri="$(BuildUri)"
            Id="$(StepId)"
            Status="Failed" />
</Target>

أنا مؤلف المنشور الآخر المماثل. لم أجد حلاً بعد. أعتقد أنه سيتم تعديل سير العمل لإضافة مهمة MSBuild -Sync بعد المعالجة. يبدو أن هذا هو الأكثر أناقة ، لكنه كان لا يزال يأمل في العثور على شيء أقل تدخلاً.

لست متأكدًا مما إذا كان ذلك قد يساعدك في TFS 2010 ، لكن لدي منشور مدونة لـ TFS 2012: نشر مشاريع ويب متعددة من TFS 2012 إلى البيئة الممكّنة لـ NLB.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top