Можно ли разработать для sharepoint методы непрерывной интеграции?
Мы готовимся к довольно серьезной разработке Sharepoint(MOSS 2007), включая пользовательские веб-части, списки, главные страницы и макеты и т. Д. И т. Д. И т. Д.
Мы оцениваем контроль версий, и кажется, что обсуждение не стало намного глубже. Я заинтересован в том, чтобы мы могли легко развернуть систему управления исходным кодом на наших тестовых и производственных серверах с минимально возможным человеческим контактом, и желательно полностью автоматически после каждой регистрации.
Я раньше не работал с CI, поэтому чувствую себя немного неосведомленным о том, что возможно с Sharepoint, и что слишком сложно, чтобы быть разумным.
Боюсь, что если мы пойдем по слишком "легкому" пути, мы очень скоро пожалеем об этом, когда нам придется потратить полдня на настройку каждой среды после того, как мы выпустим какую-то новую функциональность.
Я даже не задумывался над тем, что происходит, когда в списки добавляются пользователи, и как это повлияет на то, что мы делаем на стороне разработчиков.
Ссылки на блоги / документацию приветствуются. Личные впечатления ОЧЕНЬ приветствуются.
3 ответа
Самый близкий у меня опыт - это проект, который использовал 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 & 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 "$(ReleaseFolder)\$(PackageFile)"" 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>
Посмотрите на Powershell ... к сожалению, это одна из основных проблем SharePoint - отсутствие хорошего процесса разработки и развертывания. Все должно быть упаковано в решения и развернуто с помощью powershell, powershell также может управлять любой очисткой информации. Для версии просто разверните решения в качестве обновления и используйте Powershell для обновления ваших приложений соответствующим образом (если вы обновляете номер версии). Это много дополнительной работы, но работает достаточно хорошо. В недавнем обновлении мне пришлось сделать версию двух веб-частей, а затем использовать powershell для циклического обхода всех ~1500 моих сайтов, удаляя старые веб-части и добавляя их обратно в новые.
По ходу дела вы должны начать разрабатывать мощную библиотеку Powershell для выполнения мощных задач обновления.
Единственная работа с SharePoint при некоторой непрерывной интеграции - это когда вы работаете с функциями и пакетами решений (wsp).
Вам просто нужно как-то получить пакет wsp со всеми необходимыми файлами /DLL и конфигурацией, а затем развернуть его. После развертывания вы можете создать пакетный скрипт для автоматической повторной активации всех функций.
Пожалуйста, имейте в виду, что все файлы, которые были настроены (не подключены), НЕ будут обновлены. Вы должны обязательно сделать сброс к определению сайта (по коду это "SPFile.RevertContentStream").
Удачи!