Можно ли разработать для sharepoint методы непрерывной интеграции? - PullRequest
6 голосов
/ 12 февраля 2009

Мы готовимся к довольно серьезной разработке Sharepoint (MOSS 2007), включая пользовательские веб-части, списки, главные страницы и макеты и т. Д. И т. Д. И т. П.

Мы оцениваем контроль версий, и похоже, что обсуждение не стало намного глубже. Я заинтересован в том, чтобы мы могли легко развернуть систему управления исходным кодом на наших тестовых и производственных серверах с минимально возможным человеческим контактом, и желательно полностью автоматически после каждой регистрации.

Я раньше не работал с CI, поэтому чувствую себя немного неосведомленным о том, что возможно с Sharepoint, и что слишком сложно, чтобы быть разумным.

Боюсь, что если мы пойдем по слишком «легкому» пути, мы очень скоро пожалеем об этом, когда нам придется потратить полдня на настройку каждой среды после того, как мы выпустим какую-то новую функциональность.

Я даже не задумывался над тем, что происходит, когда в списках добавляется реальный контент, добавленный пользователями, и как это повлияет на то, что мы делаем на стороне разработчиков.

Ссылки на блоги / документацию приветствуются. Личные впечатления ОЧЕНЬ добро пожаловать.

Ответы [ 3 ]

5 голосов
/ 12 февраля 2009

Самый близкий у меня опыт - это проект, который использовал STSDEV для создания решений для выпуска. Пользовательские действия по сборке позволили нам удалить решение sharepoint с целевого сервера, установить новые решения и сбросить требуемые пулы приложений.

Потребовалось время, чтобы построить, но это работало хорошо. Мы не выпустили для тестирования с использованием этого процесса, но это возможно.

Вот пример файла целей. К сожалению, это немного сложно.

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="DebugBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <PackageName>MyFeatures.wsp</PackageName>
    <PackageFile>MyFeatures.wsp</PackageFile>
    <TargetUrl>http://intranet</TargetUrl>
    <ProjectDeploymentFilesFolder>DeploymentFiles</ProjectDeploymentFilesFolder>
    <ProjectRootFilesFolder>$(ProjectDir)\RootFiles</ProjectRootFilesFolder>
    <WssRootFilesFolder>$(ProgramFiles)\Common Files\Microsoft Shared\web server extensions\12</WssRootFilesFolder>
    <ReleaseFolder>$(SolutionDir)Deployment</ReleaseFolder>
    <MAKECAB>"C:\Windows\System32\makecab.exe"</MAKECAB>
    <STSADM>"$(ProgramFiles)\Common Files\Microsoft Shared\web server extensions\12\bin\stsadm.exe"</STSADM>
    <STSDEV>"$(SolutionDir)..\Tools\STSDev\stsdev.exe"</STSDEV>
    <GACUTIL>"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe"</GACUTIL>
    <IISAPP>cscript c:\windows\system32\iisapp.vbs</IISAPP>    
    <WARMUPSITE>"$(SolutionDir)..\Tools\WarmUpServer\AsyncWarmup.bat" "$(SolutionDir)..\Tools\WarmUpServer\"</WARMUPSITE>
    <TIMERJOBSRESTART>net stop SPTimerV3 &amp; net start SPTimerV3</TIMERJOBSRESTART>
  </PropertyGroup>

  <ItemGroup>
    <WSSSourceFiles Include="$(ProjectDir)\RootFiles\**\*.*" />
  </ItemGroup>  

<Target Name="DebugBuild">
  <Message Text="Refreshing Deployment Files..." Importance="high" />
  <Exec Command="$(STSDEV) /refresh $(TargetName) $(ProjectDir)" ContinueOnError="true" />
  <Message Text="Deleting Solution Package File..." Importance="high" />
  <Delete Files="$(ProjectDeploymentFilesFolder)\$(PackageFile)" ContinueOnError="true" />
  <Message Text="Building Solution Package (Debug Version)" Importance="high" />
  <Exec Command="$(MAKECAB) /F $(ProjectDir)\$(ProjectDeploymentFilesFolder)\SolutionPackage.ddf /D CabinetNameTemplate=$(PackageFile)" ContinueOnError="false" />
  <Message Text="" Importance="high" />
  <Message Text="Copying WSP file to CAB" Importance="high" />
  <Delete Files="$(ProjectDeploymentFilesFolder)\$(PackageFile).cab" ContinueOnError="true" />
  <Copy SourceFiles="$(ProjectDeploymentFilesFolder)\$(PackageFile)" DestinationFiles="$(ProjectDeploymentFilesFolder)\$(PackageFile).cab" SkipUnchangedFiles="false" />
  <Message Text="Copying WSP file to release folder: $(ReleaseFolder) from $(ProjectDeploymentFilesFolder)\$(PackageFile)" Importance="high" />
  <Exec Command="attrib -r &quot;$(ReleaseFolder)\$(PackageFile)&quot;" ContinueOnError="true"></Exec>
  <Delete Files="$(ReleaseFolder)\$(PackageFile)" ContinueOnError="true" />
  <Copy SourceFiles="$(ProjectDeploymentFilesFolder)\$(PackageFile)" DestinationFolder="$(ReleaseFolder)" SkipUnchangedFiles="false" />
  <Message Text="" Importance="high" />
</Target>

<Target Name="DebugInstall" DependsOnTargets="DebugBuild">
  <Message Text="Installing Solution..." Importance="high" />
  <Exec Command="$(STSADM) -o addsolution -filename $(ProjectDeploymentFilesFolder)\$(PackageFile)" ContinueOnError="true" />
  <Exec Command="$(STSADM) -o execadmsvcjobs" />
  <Message Text="" Importance="high" />
</Target>

<Target Name="DebugDeploy" DependsOnTargets="DebugInstall">
  <Message Text="Deploying Solution..." Importance="high" />
  <Exec Command="$(STSADM) -o deploysolution -name $(PackageName) -immediate -allowgacdeployment -url http://intranet" />
  <Exec Command="$(STSADM) -o execadmsvcjobs" />
  <Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="C:\WINDOWS\assembly\GAC_MSIL\MyFeatures\1.0.0.0__ce271be627d58c77" SkipUnchangedFiles="" />
  <Message Text="$(TargetDir)$(TargetName).pdb copied to GAC for debugging." Importance="high" />
  <Message Text="" Importance="high" />
</Target>

<Target Name="DebugDeployForce" DependsOnTargets="DebugInstall">
  <Message Text="Deploying Solution..." Importance="high" />
  <Exec Command="$(STSADM) -o deploysolution -name $(PackageName) -immediate -allowgacdeployment -url http://intranet -force" />
  <Exec Command="$(STSADM) -o execadmsvcjobs" />
  <Copy SourceFiles="$(TargetDir)$(TargetName).pdb" DestinationFolder="C:\WINDOWS\assembly\GAC_MSIL\MyFeatures\1.0.0.0__ce271be627d58c77" SkipUnchangedFiles="" />
  <Message Text="$(TargetDir)$(TargetName).pdb copied to GAC for debugging." Importance="high" />
  <Message Text="" Importance="high" />
</Target>

<Target Name="DebugRedeploy" >
  <Message Text="" Importance="high" />
  <Message Text="Starting sequence of Retract/Delete/Build/Install/Deploy" Importance="high" />
  <CallTarget Targets="DebugRetract" />
  <CallTarget Targets="DebugDelete" />
  <CallTarget Targets="DebugBuild" />
  <CallTarget Targets="DebugInstall" />
  <CallTarget Targets="DebugDeployForce" />
  <Message Text="" Importance="high" />
</Target>      

  <Target Name="DebugRetract" >
  <Message Text="Retracting Solution" />
  <Exec Command="$(STSADM) -o retractsolution -name $(PackageName) -immediate -url http://intranet" ContinueOnError="true" />
  <Exec Command="$(STSADM) -o execadmsvcjobs" />
  <Message Text="" Importance="high" />
</Target>

<Target Name="DebugDelete" DependsOnTargets="DebugRetract">
  <Message Text="Deleting Solution Package from Farm Solution Package Store" />
  <Exec Command="$(STSADM) -o deletesolution -name $(PackageName)" ContinueOnError="true" />
  <Exec Command="$(STSADM) -o execadmsvcjobs" />
  <Message Text="" Importance="high" />
</Target>

   </Project>
3 голосов
/ 13 февраля 2009

Посмотрите на Powershell ... к сожалению, это одна из основных проблем SharePoint - отсутствие хорошего процесса разработки и развертывания. Все должно быть упаковано в решения и развернуто с помощью powershell, powershell также может управлять любой очисткой информации. Для версии просто разверните решения в качестве обновления и используйте Powershell для обновления в своих приложениях соответствующим образом (если вы обновляете номер версии). Это много дополнительной работы, но работает достаточно хорошо. В недавнем обновлении мне пришлось сделать версию двух веб-частей, а затем использовать powershell для циклического обхода всех ~ 1500 моих сайтов, удаляя старые веб-части и добавляя обратно новые.

По ходу дела вы должны начать разрабатывать мощную библиотеку Powershell для выполнения мощных задач обновления.

1 голос
/ 14 февраля 2009

Работа с SharePoint при некоторой непрерывной интеграции была только при работе с функциями и пакетами решений (wsp).

Вам просто нужно как-то получить пакет wsp со всеми необходимыми файлами / DLL и конфигурацией, а затем развернуть его. После развертывания вы можете создать пакетный скрипт для автоматической повторной активации всех функций.

Имейте в виду, что все файлы, которые были настроены (не приведены), не будут обновлены. Вы должны обязательно сделать сброс к определению сайта (по коду это "SPFile.RevertContentStream").

Удачи!

...