DevopsgydF4y2Ba

Sitecore Headless DevOps最佳实践-第2部分gydF4y2Ba

使用Azure的Web APIgydF4y2Ba

WelcogydF4y2Ba我gydF4y2Ba回gydF4y2Ba我的gydF4y2Ba爵士gydF4y2Ba我gydF4y2Baes上gydF4y2BaDevOpsgydF4y2Ba最好PractgydF4y2Ba我gydF4y2Ba与S相关的cesgydF4y2Ba我gydF4y2Batecore无头gydF4y2Ba我gydF4y2BamplegydF4y2Ba我gydF4y2BantatgydF4y2Ba我gydF4y2Ba国家统计局gydF4y2Ba.gydF4y2Ba我gydF4y2Ban第二部分我们走了gydF4y2Ba我gydF4y2Ba吴恩达创建构建管道gydF4y2Ba年代gydF4y2Ba我gydF4y2Batecore和Next.js解决方案gydF4y2Ba并了解如何将他们纳入公关过程。如果你还没有退房gydF4y2Ba第1部分gydF4y2Ba然而,我建议在继续之前这样做。gydF4y2Ba

创建Sitecore构建管道gydF4y2Ba

FgydF4y2Ba我gydF4y2Ba首先,打开AzuregydF4y2BaDevOpsgydF4y2Ba门户,clgydF4y2Ba我gydF4y2Back在gydF4y2BaPgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba新经济学院gydF4y2Ba和clgydF4y2Ba我gydF4y2Back在gydF4y2Ba新页gydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba不gydF4y2Ba.gydF4y2Ba

创建构建管道gydF4y2Ba

接下来,选择服务器gydF4y2Ba我gydF4y2BacegydF4y2BaygydF4y2Ba欧gydF4y2BargydF4y2Ba回购gydF4y2Ba我gydF4y2Ba托利党gydF4y2Ba我gydF4y2BaS承载wgydF4y2Ba我gydF4y2Bath。我们wgydF4y2Ba我gydF4y2Ba那就是我们gydF4y2Ba我gydF4y2Bang YAML来创建gydF4y2Ba我们的gydF4y2BapgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba所以它们可以是sgydF4y2Ba我们的gydF4y2BaCe控制和sgydF4y2Ba我gydF4y2Ba由于回购gydF4y2Ba我gydF4y2Ba托里gydF4y2Ba我gydF4y2Ba年代的例子gydF4y2Ba我gydF4y2Ba年代主持gydF4y2Ba我gydF4y2Ban Azure,我们wgydF4y2Ba我gydF4y2Ba选择fgydF4y2Ba我gydF4y2BarstgydF4y2Ba赵gydF4y2Ba我gydF4y2Bace。gydF4y2Ba

构建管道回收gydF4y2Ba

然后系统将提示您选择存储YAML的存储库。我建议使用存储Sitecore和Next.js解决方案的同一个存储库。在后面的步骤中,我们将为管道yaml创建一个专用文件夹。gydF4y2Ba

后选择gydF4y2Ba我gydF4y2Ba哎呀gydF4y2Ba我gydF4y2Ba红色的回购gydF4y2Ba我gydF4y2Ba托里,向下滚动选择gydF4y2Ba起动器pgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba不gydF4y2Ba相依gydF4y2Ba我gydF4y2Ba电流的gydF4y2Ba在gydF4y2Ba我gydF4y2Ba上。gydF4y2Ba

配置管路步骤gydF4y2Ba

我们gydF4y2Ba差不多可以开始添加了gydF4y2Ba我gydF4y2BaNg任务gydF4y2Ba我们的gydF4y2BapgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2BaNe但fgydF4y2Ba我gydF4y2Ba起初,gydF4y2Ba让我们gydF4y2BaggydF4y2Ba我gydF4y2BaVe fgydF4y2Ba我gydF4y2BaLe a descrgydF4y2Ba我gydF4y2BaptgydF4y2Ba我gydF4y2Bave nagydF4y2Ba我gydF4y2Ba并确保fgydF4y2Ba我gydF4y2Bale wgydF4y2Ba我gydF4y2Ba会被储存起来gydF4y2Ba我gydF4y2BaN a dedgydF4y2Ba我gydF4y2Ba并文件夹。ClgydF4y2Ba我gydF4y2BaCk在f上gydF4y2Ba我gydF4y2Ba勒纳gydF4y2Ba我gydF4y2Ba在Ed的顶部gydF4y2Ba我gydF4y2Ba并替换默认的wgydF4y2Ba我gydF4y2BathgydF4y2BadevopsgydF4y2Ba/ pgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Banes /gydF4y2Ba年代gydF4y2Ba我gydF4y2BatecoregydF4y2Ba后端,gydF4y2Ba部gydF4y2Ba我gydF4y2Bald.ymlgydF4y2Ba.添加gydF4y2Badevops /管道gydF4y2Ba文件名的路径将在存储库中创建我们的专用文件夹。gydF4y2Ba

管路名称gydF4y2Ba

现在我们可以gydF4y2Ba我gydF4y2Ba写出日志gydF4y2Ba我gydF4y2BacgydF4y2Ba我们的gydF4y2BapgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba不。用于th的YAML的副本gydF4y2Ba我gydF4y2BaS的例子如下。所以gydF4y2Ba我gydF4y2BathgydF4y2Ba我gydF4y2BaNGS应注意:gydF4y2Ba

  1. 在第1行中,变量可用于自定义管道运行的编号。详情请见gydF4y2Ba在这里gydF4y2Ba.gydF4y2Ba
  2. 在第2行,我们有一个触发器gydF4y2Ba非军事区gydF4y2Ba而且gydF4y2Ba版本/ *gydF4y2Ba分支以确保已完成的pr的构建运行gydF4y2Ba非军事区gydF4y2Ba任何时候gydF4y2Ba版本/ *gydF4y2Ba创建分支。gydF4y2Ba
  3. 我们使用Unicorn进行项目序列化,因此有几个复制任务来将这些文件/依赖项添加到我们的工件中。gydF4y2Ba
  4. 的gydF4y2BaTargetFoldergydF4y2Ba复制任务的属性对于确保工件具有正确的结构非常重要。具体地说,第53行作为这个结构在将序列化项交付给我们将在中看到的CM时是至关重要的gydF4y2Ba第3部分gydF4y2Ba.gydF4y2Ba
  5. 在第54行,我们发布工件gydF4y2Ba$ (Build.ArtifactStagingDirectory)gydF4y2Ba这是通过gydF4y2BaVSBuildgydF4y2Ba任务gydF4y2Ba在第25行和所有的复制任务。这个工件将在包含的发布管道中使用gydF4y2Ba第3部分gydF4y2Ba.gydF4y2Ba
  6. 管道的最后一个任务是快进gydF4y2Ba主gydF4y2Ba来gydF4y2Ba非军事区gydF4y2Ba我们讲过gydF4y2Ba第1部分gydF4y2Ba.gydF4y2Ba
name: $(SourceBranchName).$(Rev:r) trigger: batch: true branches: include: - dmz - releases/* pool: vmImage: 'windows-latest' jobs: - job: Job_1 displayName: Agent job 1 pool: vmImage: windows-latest steps: - checkout: self clean: true persistCredentials: true - task: NuGetCommand@2 displayName: NuGet restore inputs: solution: windows/src/HeadlessExample. zip。sln selectOrConfig: config nugetConfigPath: windows/src/nuget。相依我g- task: VSBuild@1 displayName: Build solution windows/src/HeadlessExample.sln inputs: solution: 'windows/src/HeadlessExample.sln' msbuildArgs: '/p:DeployOnBuild=true /p:PublishProfile=IISProfile.pubxml /p:DeployDefaultTarget=WebPublish /p:DesktopBuildPackageLocation=$(Build.ArtifactStagingDirectory)' platform: 'Any CPU' configuration: 'Release' clean: true - task: CopyFiles@2 displayName: Copy Unicorn Assembly inputs: SourceFolder: '$(Build.SourcesDirectory)/windows/src/Project/HeadlessExample/bin' Contents: | MicroCHAP.dll TargetFolder: '$(Build.ArtifactStagingDirectory)' - task: CopyFiles@2 displayName: Copy Unicorn Module inputs: SourceFolder: '$(Build.SourcesDirectory)/devops' Contents: | Unicorn.psm1 TargetFolder: '$(Build.ArtifactStagingDirectory)' - task: CopyFiles@2 displayName: Copy Unicorn Files inputs: SourceFolder: '$(Build.SourcesDirectory)/windows/src/Serialization' Contents: | ** TargetFolder: '$(Build.ArtifactStagingDirectory)/Serialization/App_Data/Unicorn' - task: PublishPipelineArtifact@1 displayName: Publish Pipeline Artifact inputs: targetPath: '$(Build.ArtifactStagingDirectory)' artifact: 'BackendOutput' publishLocation: 'pipeline' - script: | ECHO clean git add . && git reset --hard ECHO git checkout master --quiet git checkout master --quiet ECHO git merge origin/dmz --ff-only --quiet git merge origin/dmz --ff-only --quiet ECHO git push origin master --quiet git push origin master --quiet displayName: Fast-forward master to dmz failOnStderr: true condition: and(eq(variables['Build.SourceBranch'], 'refs/heads/dmz'), ne(variables['Build.Reason'], 'PullRequest'), not(canceled()))

后添加gydF4y2Ba我gydF4y2Bang / confgydF4y2Ba我gydF4y2Ba电流的gydF4y2Ba我gydF4y2Ba将所有任务Ng到pgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba不,clgydF4y2Ba我gydF4y2Ba把旁边的箭头勾起来gydF4y2Ba保存并运行gydF4y2Ba我gydF4y2BaN上rgydF4y2Ba我gydF4y2BaGHT角并选择gydF4y2Ba保存gydF4y2Ba.gydF4y2Ba

节省管道gydF4y2Ba

我gydF4y2BaN dgydF4y2Ba我gydF4y2Ba对数wgydF4y2Ba我gydF4y2Ba打开,选择gydF4y2Ba为th创建一个新分支gydF4y2Ba我gydF4y2Ba年代通讯gydF4y2Ba我gydF4y2BatgydF4y2Ba要确保gydF4y2Ba开始一个拉请求gydF4y2Ba我gydF4y2Ba年代选择gydF4y2Ba.gydF4y2Ba更新通讯gydF4y2Ba我gydF4y2BatgydF4y2Ba我gydF4y2Ba并添加描述符gydF4y2Ba我gydF4y2BaptgydF4y2Ba我gydF4y2Ba在gydF4y2Ba我gydF4y2Baf desgydF4y2Ba我gydF4y2Ba红色然后保存。gydF4y2Ba

保存管道PrgydF4y2Ba

最后,转到gydF4y2Ba把请求gydF4y2Ba并完成gydF4y2Ba公关gydF4y2Ba由上面的保存操作创建。gydF4y2Ba

把请求gydF4y2Ba

Next.js管道gydF4y2Ba

作为gydF4y2Ba我gydF4y2Ba有gydF4y2Ba我gydF4y2BantgydF4y2Ba我gydF4y2Ba了上一页gydF4y2Ba我gydF4y2Ba在,gydF4y2Ba我们的gydF4y2BaNext.js:gydF4y2Ba我gydF4y2Ba猫gydF4y2Ba我gydF4y2Ba在gydF4y2Ba我gydF4y2Ba年代去gydF4y2Ba我gydF4y2BaNg被托管wgydF4y2Ba我gydF4y2BathgydF4y2BaVercelgydF4y2Ba.当我们部署时gydF4y2Ba我们的gydF4y2Ba:gydF4y2Ba我gydF4y2Ba猫gydF4y2Ba我gydF4y2Ba在gydF4y2BaVercelgydF4y2Ba,gydF4y2Ba我gydF4y2Bat wgydF4y2Ba我gydF4y2Bai’我同意gydF4y2Ba我gydF4y2Ba艾德gydF4y2Ba在gydF4y2Ba的gydF4y2Ba我gydF4y2Bar bugydF4y2Ba我gydF4y2BaLd代理商之前gydF4y2Ba我gydF4y2Bang dgydF4y2Ba我gydF4y2BastrgydF4y2Ba我gydF4y2Ba但对边缘节点的网络。为了抓住任何强有力的gydF4y2Ba我gydF4y2Ba阿尔布gydF4y2Ba我gydF4y2BaldgydF4y2Ba我gydF4y2Ba四之前gydF4y2Ba推gydF4y2Ba我gydF4y2Bang,gydF4y2BaVercelgydF4y2Ba,我们gydF4y2Ba我gydF4y2Ba创建一个sgydF4y2Ba我gydF4y2Bample pgydF4y2Ba我gydF4y2Ba图像的基本单位gydF4y2Ba我gydF4y2Ba我去检查一下gydF4y2Ba我gydF4y2Ba纬度gydF4y2Ba我gydF4y2Ba的Next.js应用程序gydF4y2Ba我gydF4y2Ba猫gydF4y2Ba我gydF4y2Ba作为的一部分gydF4y2Ba公关gydF4y2Ba的过程。gydF4y2Ba

按照与上一节相同的步骤创建新的管道。确保将YAML存储在gydF4y2BadevopsgydF4y2Ba/管道gydF4y2Ba并给它一个描述性的名称。下面是本例中使用的YAML的副本。gydF4y2Ba一些需要注意的事情:gydF4y2Ba

  1. 5号线,我们正在使用gydF4y2Baubuntu-latestgydF4y2Ba使我们的生成代理与Vercel使用的生成代理保持一致。gydF4y2Ba
  2. 在第20行,我们将工作目录设置为gydF4y2Ba前端gydF4y2Ba它是存储库中Next.js应用程序所在文件夹的名称。gydF4y2Ba
  3. 由于该管道纯粹用于验证贡献给Next.js应用程序的新代码,因此不会生成任何工件。gydF4y2Ba
job:—job: Job_1 displayName: Agent job 1 pool: vmImage: ubuntu-latest steps:—checkout: self clean: true—task: NodeTool@0 displayName: Install Node.js inputs: versionSpec: 14。脚本输入:targetType:内联脚本:| npm install npm run next:build workingDirectory: frontend . x - task: PowerShell@2 displayName: PowerShell脚本输入:targetType:内联脚本:| npm install npmgydF4y2Ba

按照上面列出的相同步骤保存管道、创建PR并完成PR。gydF4y2Ba

使用管道进行PR验证gydF4y2Ba

现在我们已经创建了两个管道,我们需要重新访问的分支策略gydF4y2Ba非军事区gydF4y2Ba并要求这些管道在之前取得成功gydF4y2Ba新gydF4y2Ba代码可以合并gydF4y2Ba在。gydF4y2Ba如果需要了解如何访问分支策略,请参见gydF4y2Ba第1部分gydF4y2Ba.gydF4y2Ba

一旦你得到分支策略设置gydF4y2Ba非军事区gydF4y2Ba,向下滚动,然后单击gydF4y2Ba”gydF4y2Ba+ 'gydF4y2Ba图标。gydF4y2Ba构建验证gydF4y2Ba部分。gydF4y2Ba

构建验证gydF4y2Ba

为我们用以下设置创建的两个管道添加一个策略:gydF4y2Ba

  • 路径过滤器gydF4y2Ba:gydF4y2Ba
    • Sitecore构建管道:gydF4y2Ba/ windows / src / *gydF4y2Ba
    • Next.js管道:gydF4y2Ba/前端/ *gydF4y2Ba

路径过滤器设置对于确保在检测到对其中一个或两个应用程序的更改时运行正确的管道非常重要。gydF4y2Ba

  • 触发gydF4y2Ba:自动gydF4y2Ba
  • 政策要求gydF4y2Ba要求:gydF4y2Ba
  • 建立过期gydF4y2Ba:当gydF4y2Ba非军事区gydF4y2Ba更新gydF4y2Ba

建立政策gydF4y2Ba

最后,确保添加的两个构建验证策略是启用的。gydF4y2Ba

启用构建策略gydF4y2Ba

总结gydF4y2Ba

至此,我们的应用程序和DevOps资源都有了一个单一的存储库,其中有适当的分支、策略和安全性,以与Git DMZ Flow保持一致。我们有一个构建管道,它将验证添加到Next.js应用程序中的任何代码,然后再将其发送到Vercel。我们有第二个构建管道,它将验证添加到Sitecore应用程序中的任何代码,输出已编译的代码和序列化的Unicorn项目的工件,并根据Git DMZ Flow规则自动执行主快进。gydF4y2Ba

在gydF4y2Ba第3部分gydF4y2Ba这是本系列的最后一部分,我们将看看如何使用Azure DevOps发布和Vercel CLI在遵循蓝/绿模型的情况下部署两个应用程序。在那儿见!gydF4y2Ba

关于“Sitecore无头DevOps最佳实践-第2部分”的思考gydF4y2Ba

留下回复gydF4y2Ba

你的电邮地址将不会公布。gydF4y2Ba必填字段已标记gydF4y2Ba*gydF4y2Ba

这个网站使用Akismet来减少垃圾邮件。gydF4y2Ba了解如何处理您的评论数据gydF4y2Ba.gydF4y2Ba

路加福音步伐gydF4y2Ba

Luke是一名高级技术顾问,他在Sitecore开始他的职业生涯时是一名经过认证的后端开发人员,但在过去的5年里已经过渡到DevOps。gydF4y2Ba

更多来自作者gydF4y2Ba

关注我们gydF4y2Ba
推特gydF4y2Ba LinkedingydF4y2Ba 脸谱网gydF4y2Ba YoutubegydF4y2Ba InstagramgydF4y2Ba