在团队中使用TeamCity+Gitlab实现持续交付工作流

在团队中使用TeamCity+Gitlab实现持续交付工作流

先决条件:

  • 安装 Gitlab
  • 安装 TeamCity

创建TeamCity项目

  • 登陆到 TeamCity 主页
  • 点击顶部导航栏的 Administration
  • 在右侧的导航栏里选择 Projects
  • 点击 Create project 按钮
  • 在新的窗口依次键入 GitLab 项目 Url , GitLab 用户名密码 , 然后点击 Proceed

默认情况下,应该将 GitLab 用户名密码设置为 root 账号的用户名密码,同时你也可以设置 Parent project 字段为其他,你应该使用默认配置

创建TeamCity配置

  • 点击顶部导航栏的 Administration
  • 在右侧的导航栏里选择 Projects
  • 点击你创建的项目,在右侧导航栏里点击 General Settings
  • 点击 Create build configuration 按钮
  • 选择 ManuallyName 填写为 Deploy-Production , 然后点击 Create 按钮
  • 并以相同的方式创建名称为 Deploy-Test,Deploy-UAT,Test-E2E,Test-Load,Test-Security 的配置

创建持续集成工作流

配置分支

  • 点击导航栏的 Administration
  • 在右侧的导航栏里选择 Projects
  • 点击你创建的项目
  • 在右侧导航栏里点击 VCS Roots
  • 在右侧的列表中应该只有一个项 , 点击 Edit 进入设置页
  • 设置 VCS root name 字段为 Application_GitLab ,点击 Regenerate ID,在最下方点击 Show advanced options , Branch specification 字段设置为以下值:

+:refs/merge-requests/*/head
+:refs/tags/*
+:refs/heads/(master)

  • 勾选 Enable to use tags in the branch specification ,将 Username style 设置为 Author Name and Email , 点击 Save 按钮

配置持续集成流程

  • Prjects 主页里找到你项目下的 Build 配置,点击进去的页面的右上角点击 Edit Configuration Sttings.

  • 打开 Build 的配置页面,进入 Trigger ,如果没有任何 Trigger 则按照下述操作创建新的 Trigger ,否则点击 Edit 按钮:

Add new trigger => VCS Trigger

  • 之后在 Branch filter 富文本框里填入以下内容

+:*
-:<default>

  • 在右侧导航栏点击 Build Features

  • 点击 Add build feature

  • 选择 Commit status publihser

  • VCS Root 中选择 Application_GitLab , Publisher 选择 GitLab ,然后填写 GitLab 地址+/api/v4,填写账号的 Private Token

默认情况下,应该使用 GitLab root 账号所创建的 Private Token

  • 在右侧导航栏点击 General Settings
  • Build number format 设置为 %build.vcs.number%
  • 在右侧导航栏里点击 Build Steps
  • Add build step

以 .NET Core 项目为例 Runner type 选择 .NET CLI(dotnet),step name 设置为 Restore App Packages ,command 设置为 restore,以相同的方式添加新的 .NET CLI(dotnet) 的 Step ,command 为 test

  • 然后添加Runner type 为 Docker 的step,command选中为 build,指定 Dockerfile的位置,将Image name:tag 字段设置为 <镜像名称>:%teamcity.build.branch%,同时删除内容 --pull .
  • 以相同的方式添加新的 Docker Step 并选中 command 为 push,相同的方式指定push的镜像名称和tag

创建部署工作流

Deploy-Production,Deploy-Test,Deploy-UAT 分别配置不同环境的部署工作流

  • 点击导航栏的 Administration
  • 在右侧的导航栏里选择 Projects
  • 点击你创建的项目
  • 在右侧导航栏里点击 VCS Roots
  • 点击 Create VCS root
  • Type of VCS 选择 Git
  • 设置 VCS root name 字段为 DeployYamls_GitLab
  • 在最下方点击 Show advanced options
  • Branch specification 字段设置为以下值

+:refs/heads/*

  • Fetch URL 设置为运维所管理的部署YAML所在的GIT仓库,如kubernetes/docker-compose等描述文件
  • Authentication method 设置为 Password 并键入用户名和密码,然后丢点击 Save

配置部署流程

  • 进入对应环境的配置的配置页面
  • 点击右侧导航栏的 Dependencies
  • Add new snapshot dependency
  • 勾选对应当前Teamcity项目的Build,其他选项保持默认值
  • 点击右侧导航栏的 Triggers
  • Add new trigger
  • Finish Build Trigger
  • 选中 Build 并勾选 Trigger after successful build only ,同时 Branch filter 下键入以下值

对于生产环境 Deploy-Production 配置为:


+:*PROD

对于测试环境 Deploy-Test 配置为:


+:*
-:*UAT
-:*PROD

对于灰度/预发布环境 Deploy-UAT 配置为:


+:*UAT

  • 继续点击 Add new trigger,选择 VCS Trigger 并设置 branch filter 中按下述设置

对于生产环境 Deploy-Production 配置为:


+:<default>

对于测试环境 Deploy-Test 配置为:


+:test

对于灰度/预发布环境 Deploy-UAT 配置为:


+:uat

  • 点击右侧导航栏中的 Build Steps 设置部署工作流

以容器化应用为例,持续集成会构建好镜像并推送到远程仓库,添加 Runner typeSSH Exec,输入对应环境的IP地址,设置认证方式和执行命令,你可以在配置中点击右侧的小文本图标来获取可用的配置,如镜像tag,找到 dep开头的配置,通常格式如 %dep.<projectname>_Build.teamcity.build.branch%"

  • 然后点击右侧导航栏的 General Settings 设置 Build configuration typeDeployment,然后 Save

推荐做法是,将服务器的ip地址或发布后的host作为参数传递给下一个工作流,如在配置中设置服务器用于运维的主ip和该服务部署后所在的host地址

创建测试工作流

  • 继续配置 Test-E2E,Test-Load,Test-Security 的三个配置,并设置其 Dependencies 设置为多个,分别为 Deploy-Production,Deploy-Test,Deploy-UAT
  • 继续配置 Test-E2E,Test-Load,Test-Security 的三个配置,并设置其 Trigger 设置为多个,分别为 Deploy-Production,Deploy-Test,Deploy-UAT,VCS Trigger

注意:往往不需要对生产环境中的服务进行负载测试,请在Test-Load取消对应对应的 DependenciesTrigger

尝试在现有工作流进行开发

  1. 需求确定,开发者在 issue 创建新的议题
  2. 在议题创建 merge-request,并指定功能分支
  3. 开发者在功能分支开发代码
  4. 持续提交,每次提交触发CI
  5. 由于开发需要增加新的环境变量配置,如新需求需要连接消息队列
  6. 对于环境变更,由运维在自身的GIT Yaml项目中提交配置变更的代码到test分支
  7. 运维的变更会触发测试环境的部署工作流
  8. 部署工作流完成,能正确部署,手动/自动合并代码到uat分支仿真环境
  9. 由于是新增配置,不会影响现有环境,仿真执行完成后合并代码到master生产环境
  10. 配置增加完成
  11. 测试需要测试开发者的代码,如果开发修改了功能,可能会影响到现有测试用例的失败,需要开发修改代码,保证不能影响到现有用例,即破坏性更新开发需要以版本号形式迭代api接口
  12. 如果开发新增了功能,测试在git上提交新的测试用例,触发对应的测试工作流
  13. 所有测试完成后,项目经理点击merge-request的合并按钮
  14. 项目经理创建tag 如 20190101-UAT
  15. 创建tag触发CI工作流,CI工作流完成后触发部署工作流,部署工作流完成后触发测试工作流
  16. 测试将测试脚本变更合并到测试项目中的uat分支,再次运行新的测试工作流
  17. 所有测试完成,创建 tag 如 20190101-PROD,完成生产环境的部署
  18. 测试合并测试脚本变更到master
posted @ 2019-02-22 16:11  吴亚锋  阅读(858)  评论(0)    收藏  举报