练习 - 提升到开发阶段

已完成

团队已有计划,并已准备好开始实现其发布管道。 你已设置 Azure DevOps 项目,并且 Azure 应用服务实例已准备好接收生成工件。

此时,请记住团队的管道只包括两个阶段。 第一个阶段会生成构建项目。 第二阶段将“Space Game”Web 应用部署到应用服务。 在此,你将与 Andy 和 Mara 一起修改管道。 他们将会部署到与“开发”阶段相对应的应用服务环境

“开发”阶段类似于在 Azure Pipelines 中创建发布管道模块中执行的部署阶段。 在这里,你使用了 CI 触发器来启动构建过程。 现在将执行相同的操作。

从 GitHub 中提取分支

现在,从 GitHub 中提取 release 分支。 你还可以查看或切换到该分支。

此分支会充当你的“发布”分支。 它包含在之前的模块中使用的“Space Game”项目。 它还包含要从其开始的 Azure Pipelines 配置。

要提取并切换到分支,请执行以下操作:

  1. 在 Visual Studio Code 中打开集成终端。

  2. 要从 Microsoft 存储库中提取名为 release 的分支并切换到该分支,请运行以下 git 命令。

    git fetch upstream release
    git checkout -B release upstream/release
    

    通过这些命令的格式,你可从 Microsoft GitHub 存储库获取起始代码(称作 upstream)。 稍后,你会将此分支推送到 GitHub 存储库(称为 origin)。

  3. 作为一个可选步骤,可从 Visual Studio Code 打开“azure-pipelines.yml”。 熟悉初始配置。

    该配置类似于在使用 Azure Pipelines 创建发布管道模块中创建的基本配置。 它只生成应用的发布配置。 为便于学习,此配置不会运行你在之前的模块中设置的质量或安全检查。

    注意

    可以使用更可靠的配置来指定参与生成过程的分支。 例如,为了帮助验证代码质量,你可以在每次对任何分支推送更改时运行单元测试。 你还可以将应用程序部署到执行更全面测试的环境。 但仅当你有拉取请求、候选发布或将代码合并到主分支时,才能执行此部署。

    有关详细信息,请参阅使用 Git 和 GitHub 在生成管道中实现代码工作流生成管道触发器

将更改提升到“开发”阶段

在这里,你将修改管道配置,以将生成提升到“开发”阶段

  1. 在 Visual Studio Code 中,修改“azure-pipelines.yml”

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      condition: |
        and
        (
          succeeded(),
          eq(variables['Build.SourceBranchName'], variables['releaseBranchName'])
        )
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'Resource Manager - Tailspin - Space Game'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    

    此配置与你在上一个模块中生成的配置类似。 在这里,你和团队为持续部署构建了概念证明。 但请注意以下差异,它们在前面的代码示例中已突出显示:

    • 此配置在文件开头定义变量。 这些变量用于整个管道。 它们定义了要生成的配置(Release)。 它们还定义了发布分支的名称(release)。
    • 概念证明中的“部署”阶段现在命名为“开发”
    • “开发”阶段使用一个条件,仅在上一个阶段成功且当前分支为 release 时,才指示系统运行该阶段。 此设置可确保仅将发布功能部署到“开发”环境
    • 部署步骤使用 WebAppNameDev 变量部署到与“开发”环境相关联的应用服务实例

    注意

    实际上,你可以从其他分支进行部署,例如 main。 你可以包含允许将更改从多个分支(例如 releasemain)提升到“开发”阶段的逻辑

  2. 在集成终端中,将 azure-pipelines.yml 添加到索引中。 提交更改,并将其推送到 GitHub。

    提示

    在运行这些 Git 命令之前,请保存 azure-pipelines.yml。

    git add azure-pipelines.yml
    git commit -m "Deploy to the Dev stage"
    git push origin release
    
  3. 在 Azure Pipelines 中,转到生成。 在生成运行时对其进行跟踪。

  4. 生成完成后,若要返回到摘要页,请选择返回按钮。

    A screenshot of Azure Pipelines showing the completed stages.

    你会看到部署已成功完成。

  5. 在 Web 浏览器中,转到与“开发”环境的应用服务实例关联的 URL

    如果浏览器选项卡仍处于打开状态,请刷新页面。 如果你忘记了 URL,可在 Azure 门户中的应用“服务详细信息”页上找到它。

    你会看到“Space Game”网站已部署到应用服务,并且正在运行

    A screenshot of a web browser showing the Space Game web site in the Dev environment.

  6. (可选)在 Azure Pipelines 中选择“环境”。 然后选择“开发”环境

    Azure Pipelines 记录部署历史记录。 在历史记录中,可以将环境的更改追溯到代码提交和工作项。

    A screenshot of Azure Pipelines showing the deployment history. The history shows one successful deployment.