概述

Azure DevOps Server(之前名TFS)是微软公司实现软件研发、测试和部署一体化的全流程解决方案。在近几年的研发过程中,Azure DevOps Server 大幅增强了软件部署过程的自动化功能。对于系统运维人员而言,确保软件的稳定运行,是自己的第一工作目标。但是,在信息技术飞速发展的今天,信息系统的升级变更已经成了家常便饭。每周升级、每天升级、甚至一天升级数次,都已经见怪不怪。

为了提高软件的变更效率和质量,许多运维部门都使用部署脚本,实现系统升级的自动化。在软件升级过程中,为了确保信息系统正常运转,最大程度的降低因为升级导致系统宕机的风险,运维人员首先考虑的是回退(Rollback)方案。即,在系统升级过程中,万一出现由于升级导致的异常状况,为了最快恢复系统的正常运行,回退到部署前的版本,是一个运维人员恢复系统正常的首选方案。

在下面的内容中,我们介绍在使用Azure DevOps Server实现部署过程中,如何应用回退方案。

回退方案

在软件部署过程中,我们可以选择多种回退方案:

1. 基于虚拟机的快照技术

在升级变更之前,为即将发生变更的服务器创建快照,当系统部署失败时,直接将虚拟机退回到创建快照时的状态。

目前Azure DevOps Server支持包括VMware, SCVMM(Hyper-V)等多种虚拟化平台。如果微软原生的技术支持,一般虚拟化平台都提供快照的API,可以将API通过PowerShell、Shell等方式集成到发布流水线中。下图是在Azure DevOps中使用VMware和SCVMM的截图:

图1:Azure DevOps Server流水线中的SCVMM任务

图2:Azure DevOps Server流水线中的vCenter任务

基于虚拟机快照的回退方案,简单粗暴,但是却非常适用。在手动部署过程中,这种方案就是运维人员常用的方式。

但是虚拟机的快照并不是万能的,它存在许多不足,例如快照会消耗大量的磁盘存储;如果是域环境中运行的虚拟机,快照还原可能出现脱域的问题;快照合并的时间较长等问题。在选择使用快照技术作为回退方案时,需要重复考虑快照还原对系统造成的影响。

2. 重新部署上一个版本

在Azure DevOps Server中,重新部署上一个版本,是最为简单和快速的方式。

Azure DevOps Server 最大的特点,是完整地保留了软件研发运维过程中的所有日志、交付物数据,并且保护交付物数据的各种版本,其中就包括部署部署过程中的每一个版本。单本次部署失败时,我们可以从上一次的部署中,选择重新部署按钮,实现一键回退功能。

例如,在下图中,由于四次部署是上一次成功的部署,并且系统运行正常,我选中重新部署,就可以重复运行上一次部署的所有任务,并且在部署过程中,使用上一次部署的升级包、环境变量等数据。

图3:在Azure DevOps Server 中重新部署

如果你熟悉IBM UrbanCode Deploy,会发现Azure DevOps Server的重新部署功能与它的“Replace with Last Deployed”有异曲同工之妙。通过重新部署上一次的版本实现回退,简单快速。但是,问题也显而易见,不一定能够实现系统回退的效果。这种方案只适合独立运行的信息系统。

例如,当系统依赖与第三方系统运行,需要和第三方系统同步升级时,重新部署只能将自己的系统回退到了上一个版本,但是并不能将系统恢复到健康状态,因为此时第三方系统已经完成了升级,可能第三方系统不能兼容你的上一个版本。同样,如果当前版本对应的数据库结构已经完成了升级,重新部署也不能恢复系统的健康状态。

3. 停止自动部署,手动修复问题

程序员和运维工程师不是万能的,相反,这是一群最容易犯错误的人,因为他们实现的大部分需求,都没有可以照搬的方案。都是在开发过程中,不断试错,实现信息系统的增量发展。同样,在部署过程中,每次都存在许多不确定因素。当发现部署问题时,分析原因找到解决方案,并修复问题,将当前环境恢复到健康状态。同事,将解决方案集成到系统源代码或者部署脚本中,作为下一个版本的部署内容。

当然,作为程序员,我们可以提升系统部署智能化,提高部署过程中错误探测和解决的自动化水平,这也是后面要重点介绍的方案。

4. 在流水线中部署回退脚本

在Azure DevOps Server 中,发布流水线由一个一个的任务组合而成。在发布过程中,系统按照流水线中配置的顺序,执行每一个阶段中的任务。当发布流水线中的中的任何任务失败时,对应环境的部署可能会失败。为了让环境恢复正常,我们可以执行一个回滚脚本Shell (on Linux)或PowerShell(on windows)。脚本本身需要具以下要求:

  • 当部署工作流中的任何任务失败时,对环境的部署可能会失败。为了让环境恢复正常,我们将执行一个回滚脚本。即使在另一个任务失败时,脚本本身也会为环境执行脚本。通过Azure DevOps的发布管理,您可以使用PowerShell或shell任务来实现此目的,并将其标记为“始终运行”。这样,无论部署成功或失败,脚本都将始终得到执行。
  • 如果前一个任务失败,则应跳过未标记为“始终运行”的任何任务,但将执行始终运行的任务。根据部署失败的任务对环境进行选择性更改。执行脚本只是任务的一半。为了避免破坏任何不需要的东西,我们需要了解更多内容。首先,我们需要检测是否有故障。如果失败了,那么什么任务失败了。目前,脚本中没有一种方法可以了解这些内容。我们需要在脚本中查询这些版本。幸运的是,Azure DevOps 的市场(https://marketplace.visualstudio.com)中扩展插件“Release Management Utility tasks”(https://marketplace.visualstudio.com/items?itemName=ms-devlabs.utilitytasks),其中包含了一个任务“Powershell to rollback”,这个任务可以协助我们,使回退脚本变得更加简便。如果你想验证下面的脚本,需要将这个扩展安装在你的Azure DevOps Server中。

下面我们来演示如何实现这个功能:

首先,编写回退脚本,并将其推送到代码库中,例如我的回退脚本如下:

echo $env:Release_Tasks

try

{

$jsonobject = ConvertFrom-Json $env:Release_Tasks

}

catch

{

Write-Verbose -Verbose "Error parsing Release_Tasks environment variable"

Write-Verbose -Verbose $Error

}

foreach ($task in $jsonobject | Get-Member -MemberType NoteProperty)

{

$taskproperty = $jsonobject.$($task.Name) | ConvertFrom-Json

echo "task name: $($taskproperty.Name)"

echo "task rank: $($task.Name)"

echo "task status: $($taskproperty.Status)"

echo "Task $($taskproperty.Name) with rank $($task.Name) has status $($taskproperty.Status)"

$task_status=$taskproperty.Status

if($task_status -eq "failed")

{

Write-Warning "This is a error generated in a PowerShell script"

}

}

然后,在发布流水线中添加回退任务。注意需要将其标记为总是运行“即使上一任务已失败,即使已经取消部署”:

最后,我们看一下回退脚本运行的结果:

在上图中,可以看到回退脚本顺利运行,下图是回退脚本的输出:

在上面第4个方案中,我们只是介绍了基于Azure DevOps Server 的回退机制,而具体的回退脚本,需要根据系统部署的内容来定。需要开发人员或者运维人员根据本次变更的具体内容编写脚本。例如文件的变动,则需要编辑将备份文件覆盖回来;如果数据结构的变动,则需要更改数据库。

微软DevOps MVP 张洪君 http://www.cnblogs.com/danzhang

--End--

在Azure DevOps Server(TFS系统)中部署回退/回滚方案(Rollback)的更多相关文章

  1. Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)

    之前写过一篇博客"探索TFS Git 库文件换行(CRLF)的处理方式",主要是针对TFVC代码库的. 下面这篇文章说明如何在TFS的Git库中处理代码换行的问题. 概述 在Azu ...

  2. 在Azure DevOps Server (TFS 2019) 流水线传递参数

    变量概述 在Azure DevOps Server的流水线中,变量是衔接不同任务和不通代理之间的桥梁,它可以使相对松散.各自独立的任务之间相关影响并共享数据.在流水线中使用变量,可以在各任务之间相互调 ...

  3. Azure DevOps Server (TFS) 代码库Repo管理培训

    Repo是分布式代码库Git中的一个专用词,用于存储和管理开发团队中特定的源代码. 使用Git,可以协调整个团队的代码更改. 即使您只是一个开发人员,版本控制也可以帮助您在修复错误和开发新功能时保持井 ...

  4. 还原Azure DevOps Server (TFS)中误删除的生成流水线

    流水线历史记录 DevOps Server流水线的历史记录有完善的版本日志,用户可以随时回退到修改过程中的任何一个版本,还能比较差异.这个历史记录功能可以和代码库中的版本控制媲美. 图一:生成历史记录 ...

  5. 在Azure DevOps Server (TFS)的流水线中编译和测试Xcode移动应用(iPhone)

    概述 Xcode是开发基于苹果macOS系统的桌面应用和移动应用的主要IDE工具.使用Azure DevOps Server (原名TFS)系统中的pipelines流水线功能,可以方便的集成Xcod ...

  6. 在Azure DevOps Server (TFS)中实现VUE项目的自动打包

    概述 Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.由于它在数据绑定.页面展示和使用简单方面有很大的优势,逐渐被越来越多的前端开发团队使用.本文 ...

  7. 集成Azure DevOps Server(TFS) 与微软Teams

    1.概述 Microsoft Teams是Office 365中团队协作的中心.将团队的所有聊天.会议.文件和应用程序放在一个位置.软件开发团队可以在一个专门的协作中心中即时访问他们所需的所有内容,T ...

  8. 在Windows操作系统的文件管理器中集成Azure DevOps Server (TFS)工具菜单

    故事场景 使用过SVN的用户,都知道在Windows的文件夹上点击鼠标右键,就会弹出Tortoise SVN的操作菜单(俗称小乌龟).通过这个功能,用户不需要打开SVN工具,可以直接在Windows的 ...

  9. Azure DevOps Server (TFS) 修改工作项附件大小限制

    1. 问题描述 当上传工作项附件时,系统提示"附件大小限制" 2.解决方案 2.1 默认设置 默认情况下,Azure DevOps Service和Team Foundation ...

随机推荐

  1. 微信调用itchat库 实现发消息

    import itchat,timefrom itchat.content import * itchat.auto_login(enableCmdQR=-1)while True: for i in ...

  2. linux使用privoxy将55转为http代理

    =============================================== 2018/3/21_第3次修改                       ccb_warlock 更新 ...

  3. [C语言]进阶|程序结构

    ------------------------------------------------------------------------------------ 全局变量: // main.c ...

  4. XSLT 创建CDATA节点

    创建文本结点 (1)直接写入文本: text1 (2)通过<xsl:text>创建文本结点: <xsl:text>text2</xsl:text> (3)通过< ...

  5. 私活利器,docker快速部署node.js应用

    http://cnodejs.org/topic/53f494d9bbdaa79d519c9a4a 最近研究了几天docker的快速部署,感觉很有新意,非常轻量级和方便,打算在公司推广一下,解放运维, ...

  6. 2018面向对象程序设计(Java)第16周学习指导及要求

    2018面向对象程序设计(Java)第16周学习指导及要求(2018.12.13-2018.12.16)   学习目标 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程 ...

  7. 第一章 C++语言入门

            标准数据类型         C++语言提供了丰富的数据类型,如整数类型.实数类型(浮点数).字符类型等.每种数据类型均有均值范围,Dev-C++(4.9.9.2)是Windows平台 ...

  8. 英雄联盟lol登录错误:登录服务器未响应、您可能遇到了一个网络问题、请检查您的网络。

    第一方法cmd 用管理员命令打开,输入  netsh winsock reset.重启 第二种方法  win+r 输入 regedit  在 HKEY_CURRENT_USER\Software\Mi ...

  9. linux resin 基本站点配置

    进入配置文件目录: [root@linuxidc resin-]# cd /usr/local/resin/conf/ 查看都有哪些配置文件: [root@linuxidc conf]# ls app ...

  10. 浅谈卷积和C++实现

    1 信号处理中的卷积 无论是信号处理.图像处理还是其他一些领域,我们经常会在一些相互关联的数据处理中使用卷积.卷积可以说是算法中一个非常重要的概念.这个概念最早起源于信号处理之中. 假设对于一个线性系 ...