| 编辑推荐: | 
                                   
                                   
                                    | 本文来自于网络,文章主要介绍如何搭建一套基于Team 
                                      Foundation Server的数据库CI、CD流水线。 | 
                                   
                                  | 
                             
                           
                          概述: 
                            部分企业在实施DevOps过程中,发现数据库的升级成为企业DevOps流水线上的核心瓶颈,应用程序发布频率越来越快,但是数据库依然采用手工更新的方式,导致数据库升级效率低下、风险较大。所以建立一套完整的应用+数据库的DevOps流水线是至关重要的。接下来小编将带大家手把手搭建一套基于Team 
                            Foundation Server的数据库CI、CD流水线。 
                          方案: 
                            基于数据库升级\迁移脚本:采用像编写应用代码一样的方式去编写数据库升级脚本,对脚本文件进行顺序编号并迁入代码库,在持续发布阶段按照编号依次顺序执行数据库升级脚本。完成数据库的升级\变更动作。 
                          工具: 
                            
                          
                            可以使用Flyway,Evolve, Liquebase等工具完成数据库脚本的升级\迁移。 
                          为了灵活应对各种场景,平台、语言,以及方便大家学习,小编开发了一个简单的跨平台小工具SQLToolkit来完成数据库脚本的顺序执行, 
                            并开源到Github: 
                            https://github.com/lean-soft/SQLToolkit 
                          DevOps流水线图: 
                            
                          
                            流水线概述: 
                            开发人员在编写应用逻辑的同时,编写SQL升级脚本,确保将应用代码以及SQL升级脚本一并迁入到配置库。 
                            配置库变更后触发持续集成,自动编译应用,以及发布数据库升级脚本。 
                            发布服务在测试环境数据库按编号依次顺序执行SQL升级脚本完成数据库升级,并完成应用升级部署。 
                            测试环境经过测试后,执行QA以及Staging环境的数据库升级以及应用升级部署。 
                            相关环境测试没有问题,相关人员对应用以及数据库升级脚本进行评审,并完成生产环境的自动化部署。 
                            注意:这里的数据脚本评审需要针对数据库上下文进行评审。而不是仅仅评估脚本,这样 
                            才能保证数据的完整性。 
                            优点: 
                            1. 代码与升级脚本同时迁入到配置库,保证了应用程序与数据库统一版本,避免出现应用程序与数据库无法对应版本的问题。 
                            2. 通过数据库脚本记录可以方便的跟踪数据库变更历史。 
                            3. 通过数据库升级脚本中的事务可以控制回滚。 
                            4. 通过对数据对象以及数据的灵活处理保证数据的完整性。 
                          流水线搭建: 
                            项目结构: 
                            首先需要在应用目录下创建一个文件夹,用来存放对应的数据库升级脚本。 并按照顺序编号存储对应的脚本文件,如下图所示: 
                            
                          脚本内容参考:01-****.sql 
 								 
         							
                               Use devopslabs
                                
  CREATE TABLE [dbo].[Configuration] 
                                  ( 
                                  [Id] [int] IDENTITY(1,1) NOT NULL, 
                                  [Description] [nvarchar](MAX) NULL, 
                                  [Key] [nvarchar](MAX) NULL, 
                                  [Value] [nvarchar](MAX) NULL, 
                                  [DisplayName] [nvarchar](MAX) NULL 
                                  ) 
                                  ALTER TABLE [dbo].[Configuration] ADD CONSTRAINT 
                                  PK_Configuration  
                                  PRIMARY KEY ([Id]) | 
   								 
  							 
                            脚本内容参考:02-****.sql 
 								 
         							
                               Use devopslabs 
                                Insert into Configuration(DisplayName,[Key],Value,[Description])Values 
                                (N'站点名称','GeneralSetttings_SiteName','','SiteName') | 
   								 
  							 
                            持续集成搭建 
                          在持续集成中,将SQL升级脚本文件夹发布到Build Artifacts,供持续部署使用,如下图所示: 
                            
                          发布结果如下: 
                           
                          持续部署搭建 
                            在持续部署步骤中,通过SQLToolkit工具完成数据库备份以及升级: 
                            
                          备份脚本命令如下: 
                          
 								 
         							
                               SQLToolkit Backup 
                                -s $(DATABASE_SERVER) -n $(DATABASE_NAME) -u  
                                $(DATABASE_USERNAME) -p $(DATABASE_PASSWORD)  
                                -path /home/sqlbackup/database.bak | 
   								 
  							 
                            升级脚本命令如下: 
                          
 								 
         							
                               SQLToolkit RunScripts 
                                -s $(DATABASE_SERVER) -n $(DATABASE_NAME)  
                                -u $(DATABASE_USERNAME) -p $(DATABASE_PASSWORD) 
                                 
                                -path ~/LabsUpgrade/SQLScripts_Up | 
   								 
  							 
                            执行结果如下: 
                           
 
                            数据库: 
                            数据库自动生成ST_DatabaseVersion表,用来存储当前应用程序的数据库版本。 
                            包括数据库脚本名称、执行结果、执行时间等。 这样下次升级时,工具会判断当前数据库版本,并从当前数据库版本的基础上顺序执行“未执行的数据库脚本” 
                            。即便是环境版本不一致依然可以完成数据库的升级动作。 
                             
                          总结: 
                            通过搭建数据库的CI、CD可以消除应用流水线的核心瓶颈,让应用程序发布与数据库发布保持一致。减少了DBA手工操作带来的效率低下,人为错误,安全风险等问题。让DBA专注于更有价值的工作。结合基于功能分支的开发方式,可以方便的跟踪数据库变更对应的功能。 
                          由于数据是公司的核心价值,在数据库升级过程中一定要确保数据得到有效的备份,在出现问题时可以顺利回滚,已确保数据的完整性,所以有效的备份以及回滚脚本至关重要。  |