Azure Pipelines 是更高版本的 Azure DevOps 内部版本和发布版本功能。
本文介绍了如何为 Azure Pipelines 环境设置持续集成和持续部署,以便能够自动执行 SharePoint 框架生成、单元测试和部署。
在 Azure 多级管道与 Azure DevOps 内部版本和发布版本之间进行选择
目前有两种方法可用于实现持续集成和 Azure DevOps 部署。
Azure 内部版本和发布版本为历史版本,提供了图形版体验,并将定义存储在向用户隐匿的 JSON 文档中。
Azure 多级管道依赖于在存储库中存储为 YAML 文件的管道定义,提供透明度、版本历史记录和可重复性。
针对 SharePoint 框架对这两种方法进行了描述:
Azure 内部版本和发布版本
Azure 多级管道(本文)
实现持续集成和持续测试
以下 YAML 模板介绍了持续集成和持续测试阶段。
将下面的内容复制到名为
azure-pipelines-build-template.yml
的项目的根目录处的一个新文件中。
parameters:
name: ''
jobs:
- job: ${{ parameters.name }}
pool:
vmImage: 'ubuntu-latest'
demands:
- npm
- node.js
- java
variables:
npm_config_cache: $(Pipeline.Workspace)/.npm
steps:
- checkout: self
- task: NodeTool@0
displayName: 'Use Node 10.x'
inputs:
versionSpec: 10.x
checkLatest: true
- task: CacheBeta@1
inputs:
key: npm | $(Agent.OS) | package-lock.json
path: $(npm_config_cache)
cacheHitVar: CACHE_RESTORED
- script: npm ci
displayName: 'npm ci'
- task: Gulp@0
displayName: 'Bundle project'
inputs:
targets: bundle
arguments: '--ship'
- script: npm test
displayName: 'npm test'
- task: PublishTestResults@2
displayName: Publish test results
inputs:
testResultsFormat: JUnit
testResultsFiles: '**/junit.xml'
#failTaskOnFailedTests: true #if we want to fail the build on failed unit tests
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage results'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/*coverage.xml'
- task: Gulp@0
displayName: 'Package Solution'
inputs:
targets: 'package-solution'
arguments: '--ship'
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
Contents: |
sharepoint/**/*.sppkg
TargetFolder: '$(Build.ArtifactStagingDirectory)'
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: drop'
如果你没有任何单元测试实现并且/或者不希望运行单元测试,则可以注释掉/删除 PublishCodeCoverageResults、PublishTestResults 和 npm test 任务。
可在示例中找到此文件的最新版本
实现持续部署
以下 YAML 模板介绍了持续部署阶段。
将下面的内容复制到名为 azure-pipelines-deploy-template.yml 的项目的根目录处的一个新文件中。
parameters:
# unique name of the job
job_name: deploy_sppkg
# friendly name of the job
display_name: Upload & deploy *.sppkg to SharePoint app catalog
# name of target environment deploying to
target_environment: ''
# app catalog scope (tenant|sitecollection)
m365cli_app_catalog_scope: 'tenant'
variable_group_name: ''
jobs:
- deployment: ${{ parameters.job_name }}
displayName: ${{ parameters.display_name }}
pool:
vmImage: 'ubuntu-latest'
environment: ${{ parameters.target_environment }}
variables:
- group: ${{parameters.variable_group_name}} #m365_user_login, m365_user_password, m365_app_catalog_site_url
strategy:
runOnce:
deploy:
steps:
- checkout: none
- download: current
artifact: drop
patterns: '**/*.sppkg'
- script: sudo npm install --global @pnp/cli-microsoft365
displayName: Install CLI for Microsoft365
- script: m365 login $(m365_app_catalog_site_url) --authType password --userName $(m365_user_login) --password $(m365_user_password)
displayName: Login to Microsoft 365
- script: |
CMD_GET_SPPKG_NAME=$(find $(Pipeline.Workspace)/drop -name '*.sppkg' -exec basename {} \;)
echo "##vso[task.setvariable variable=SpPkgFileName;isOutput=true]${CMD_GET_SPPKG_NAME}"
displayName: Get generated *.sppkg filename
name: GetSharePointPackage
- script: m365 spo app add --filePath "$(Pipeline.Workspace)/drop/sharepoint/solution/$(GetSharePointPackage.SpPkgFileName)" --appCatalogUrl $(m365_app_catalog_site_url) --scope ${{ parameters.m365cli_app_catalog_scope }} --overwrite
displayName: Upload SharePoint package to Site Collection App Catalog
- script: m365 spo app deploy --name $(GetSharePointPackage.SpPkgFileName) --appCatalogUrl $(m365_app_catalog_site_url) --scope ${{ parameters.m365cli_app_catalog_scope }}
displayName: Deploy SharePoint package
可在示例中找到此文件的最新版本
定义管道结构
生成和部署阶段已在其各自的模板中进行了定义,因此需要将其汇编为多级管道。
本文将介绍管道的结构以及正在使用的不同环境。
将下面的内容复制到名为 azure-pipelines.yml 的项目的根目录处的一个新文件中。
name: $(TeamProject)_$(BuildDefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)
resources:
- repo: self
trigger:
branches:
include:
- master
- develop
stages:
- stage: build
displayName: build
jobs:
- template: ./azure-pipelines-build-template.yml
parameters:
name: 'buildsolution'
- stage: 'deployqa'
# uncomment if you want deployments to occur only for a specific branch
#condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
jobs:
- template: ./azure-pipelines-deploy-template.yml
parameters:
job_name: deploy_solution
target_environment: 'qa'
variable_group_name: qa_configuration
可在示例中找到此文件的最新版本
可通过复制 deployqa 阶段和提供不同的参数来定义多个环境。 如果执行此操作,请确保阶段名称、作业名称、目标环境和可变组名称是唯一的。
可以有条件地部署到利用各种条件的不同环境中
为环境配置凭据
出于安全考虑,机密决不能提交到存储库。 上述步骤中描述的管道使用变量组将配置值保留为机密。 需要为每个环境创建变量组,并且名称需与管道定义中所述的名称匹配(此处为 qa_configuration)。
若要创建变量组,请按照下列步骤操作:
登录 Azure DevOps,导航到你的项目
在“管道”下,选择“库”
添加新的变量组,确保名称与管道定义中定义的名称相同
将以下变量添加到组中,然后选择“保存”
m365_user_login:SharePoint 租户管理员的用户登录名
m365_user_password:帐户的用户密码
m365_app_catalog_site_url:应用程序目录网站集的 URL