基于Jenkins Pipeline的ASP.NET Core持续集成实践
最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署,因此这里总结一下。
一、关于持续集成与Jenkins Pipeline
1.1 持续集成相关概念
pipeline{ agent any stages { stage('XDP Core Services Checkout') { steps{ checkout([$class: 'GitSCM', branches: [[name: '*/dev-xds']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '35b9890b-2338-45e2-8a1a-78e9bbe1d3e2', url: 'http://192.168.18.150:3000/EDC.ITC.XDP.Core/EDC.XDP.Core.git']]]) echo 'Core Services Checkout Done' } } stage('XDP Core Services Build') { steps{ bat '''cd "D:\\Jenkins\\workspace\\XDS.Dev.CI.Pipeline\\src\\services\\EDC.XDP.Core\\" dotnet build EDC.XDP.Core-All.sln''' echo 'Core Services Build Done' } } stage('Core Delivery Service Unit Test') { steps{ bat '''cd "D:\\Jenkins\\workspace\\XDS.Dev.CI.Pipeline\\src\\services\\EDC.XDP.Core\\Services\\EDC.XDP.Core.Delivery.UnitTest" dotnet test -v n --no-build EDC.XDP.Core.Delivery.UnitTest.csproj''' echo 'Core Delivery Service Unit Test Done' } } stage('XDS Delivery Service Checkout') { steps{ checkout([$class: 'GitSCM', branches: [[name: '*/dev-service']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '35b9890b-2338-45e2-8a1a-78e9bbe1d3e2', url: 'http://192.168.18.150:3000/EDC.ITC.XDP.XDS/EDC.XDP.XDS.git']]]) echo 'Core Delivery Service Checkout Done' } } stage('XDS Delivery Service Build') { steps{ bat '''cd "D:\\Jenkins\\workspace\\XDS.Dev.CI.Pipeline\\src\\services\\EDC.XDP.XDS" dotnet build EDC.XDP.XDS.sln''' echo 'XDS Service Build Done' } } stage('XDS Delivery Service Unit Test') { steps{ bat '''cd "D:\\Jenkins\\workspace\\XDS.Dev.CI.Pipeline\\src\\services\\EDC.XDP.XDS\\EDC.XDP.XDS.Delivery.UnitTest" dotnet test -v n --no-build EDC.XDP.XDS.Delivery.UnitTest.csproj''' echo 'XDS Service Unit Test Done' } } } post{ failure { emailext ( subject: '${DEFAULT_SUBJECT}', body: '${DEFAULT_CONTENT}', to: "edisonchou@qq.com,xxxxx@qq.com") } } }View Code
(2)持续发布Pipeline
持续发布Pipeline与持续集成Pipeline类似,只是在脚本处有所不同:
pipeline{ agent any stages { stage('Core Delivery Service Checkout') { steps{ checkout([$class: 'GitSCM', branches: [[name: '*/dev-xds']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '35b9890b-2338-45e2-8a1a-78e9bbe1d3e2', url: 'http://192.168.18.150:3000/EDC.ITC.XDP.Core/EDC.XDP.Core.git']]]) echo 'Core Delivery Service Dev Branch Checkout Done' } } stage('Core Delivery Service Build & Publish') { steps{ bat '''cd "D:\\Jenkins\\workspace\\XDS.API.Dev.CD.Pipeline\\src\\services\\EDC.XDP.Core" dotnet build EDC.XDP.Core-DataServices.sln dotnet publish "%WORKSPACE%\\src\\services\\EDC.XDP.Core\\Services\\EDC.XDP.Core.Delivery.API\\EDC.XDP.Core.Delivery.API.csproj" -o "%WORKSPACE%\\EDC.XDP.Core.Delivery.API/publish" --framework netcoreapp2.1 ''' echo 'Core Delivery Service Build & Publish Done' } } stage('Core Delivery Service Deploy To 190 Server') { steps{ sshPublisher(publishers: [sshPublisherDesc(configName: 'XDP-DEV-Server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker stop xdp_core_deliveryservice; docker rm xdp_core_deliveryservice; docker run --ulimit core=0 --restart=always -v /etc/localtime:/etc/localtime -d -e ASPNETCORE_ENVIRONMENT=dev --privileged=true --name=xdp_core_deliveryservice -p 8010:80 -v /XiLife/publish/EDC.XDP.Core.Delivery.API/:/app -w /app xdp_service_runtime:latest dotnet EDC.XDP.Core.Delivery.API.dll''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'EDC.XDP.Core.Delivery.API/', remoteDirectorySDF: false, removePrefix: 'EDC.XDP.Core.Delivery.API/publish/', sourceFiles: 'EDC.XDP.Core.Delivery.API/publish/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) echo 'Delivery Service Deploy To 190 Done' } } stage('Core Delivery Service Deploy To 175 Server') { steps{ sshPublisher(publishers: [sshPublisherDesc(configName: 'XDP-DEV-MT-Server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker stop xdp_core_deliveryservice; docker rm xdp_core_deliveryservice; docker run --ulimit core=0 --restart=always -v /etc/localtime:/etc/localtime -d -e ASPNETCORE_ENVIRONMENT=devmt --privileged=true --name=xdp_core_deliveryservice -p 8010:80 -v /XiLife/publish/EDC.XDP.Core.Delivery.API/:/app -w /app xdp_service_runtime:latest dotnet EDC.XDP.Core.Delivery.API.dll''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'EDC.XDP.Core.Delivery.API/', remoteDirectorySDF: false, removePrefix: 'EDC.XDP.Core.Delivery.API/publish/', sourceFiles: 'EDC.XDP.Core.Delivery.API/publish/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) echo 'Delivery Service Deploy To 175 Done' } } stage('XDS Delivery Service Checkout') { steps{ checkout([$class: 'GitSCM', branches: [[name: '*/dev-service']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '35b9890b-2338-45e2-8a1a-78e9bbe1d3e2', url: 'http://192.168.18.150:3000/EDC.ITC.XDP.XDS/EDC.XDP.XDS.git']]]) echo 'XDS Delivery Service Checkout Done' } } stage('XDS Delivery Service Build & Publish') { steps{ bat '''cd "D:\\Jenkins\\workspace\\XDS.API.Dev.CD.Pipeline\\src\\services\\EDC.XDP.XDS" dotnet build EDC.XDP.XDS.sln dotnet publish "%WORKSPACE%\\src\\services\\EDC.XDP.XDS\\EDC.XDP.XDS.Delivery.API\\EDC.XDP.XDS.Delivery.API.csproj" -o "%WORKSPACE%\\EDC.XDP.XDS.Delivery.API/publish" --framework netcoreapp2.1 ''' echo 'XDS Delivery Service Build & Publish Done' } } stage('XDS Delivery Service Deploy To 190 Server') { steps{ sshPublisher(publishers: [sshPublisherDesc(configName: 'XDP-DEV-Server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker stop xdp_xds_delivery_service;docker rm xdp_xds_delivery_service; docker run --ulimit core=0 --restart=always -v /etc/localtime:/etc/localtime -d -e ASPNETCORE_ENVIRONMENT=dev --privileged=true --name=xdp_xds_delivery_service -p 9020:80 -v /XiLife/publish/EDC.XDP.XDS.Delivery.API/:/app -w /app xdp_service_runtime:latest dotnet EDC.XDP.XDS.Delivery.API.dll''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'EDC.XDP.XDS.Delivery.API/', remoteDirectorySDF: false, removePrefix: 'EDC.XDP.XDS.Delivery.API/publish/', sourceFiles: 'EDC.XDP.XDS.Delivery.API/publish/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) echo 'XDS Delivery Service Deploy to 190 Done' } } stage('XDS Delivery Service Deploy To 175 Server') { steps{ sshPublisher(publishers: [sshPublisherDesc(configName: 'XDP-DEV-MT-Server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''docker stop xdp_xds_delivery_service;docker rm xdp_xds_delivery_service; docker run --ulimit core=0 --restart=always -v /etc/localtime:/etc/localtime -d -e ASPNETCORE_ENVIRONMENT=devmt --privileged=true --name=xdp_xds_delivery_service -p 9020:80 -v /XiLife/publish/EDC.XDP.XDS.Delivery.API/:/app -w /app xdp_service_runtime:latest dotnet EDC.XDP.XDS.Delivery.API.dll''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: 'EDC.XDP.XDS.Delivery.API/', remoteDirectorySDF: false, removePrefix: 'EDC.XDP.XDS.Delivery.API/publish/', sourceFiles: 'EDC.XDP.XDS.Delivery.API/publish/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)]) echo 'XDS Delivery Service Deploy to 175 Done' } } } }View Code
这里由于我的测试环境分为两个,一个是开发人员联调环境190,另一个是集成测试环境175,统一在一个Pipeline任务中进行发布。
对于Master分支,我们还可以将Web系统的发布也集成到同一个Pipeline任务中,实现一个一条龙的发布流水线任务,由于各个Web系统的实现技术不一样,这里就不再贴脚本了。
四、效果演示
(1)持续集成示例
(2)持续发布示例
(3)构建失败告警
(4)构建大屏显示
再来一张投屏到工作区域电视屏幕中的效果,大家抬头就可以看到构建结果,是绿了还是红了?当然,我们都喜欢“绿”的,呼呼。
五、小结
借助持续集成和持续发布,我们开发人员可以节省很多质量保证和发布部署的时间,从而减少很多因为人为QA和Deploy造成的失误影响,从另一个层面上,它也可以使我们避免996(好吧,虽然关联有点牵强)。后续,我还会探索K8S,到时候希望能够分享一个ASP.NET Core on K8S的系列文章,敬请期待。
参考资料
大宝鱼,《玩转Jenkins Pipeline》
李志强,《Jenkins高级用法 - Pipeline 安装》
李志强,《Jenkins高级用法 - Jenkinsfile 介绍及实战经验》
三只松鼠,《jenkins + pipeline构建自动化部署》
ofnhkb1,《.NET项目从CI到CD-Jenkins_Pipeline的应用》
作者:周旭龙
出处:http://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
- ASP.NET Core + Docker + Jenkins + gogs + CentOS 从零开始搭建持续集成
- ASP.NET Core+Docker+Jenkins实现持续集成的完整实例
- tl06-基于Jenkins构建企业持续集成环境——大型系统持续迭代实践
- 使用Asp.Net Core MVC 开发项目实践[第三篇:基于EF Core的扩展]
- Net 项目构建基于Jenkins + Github + Mono 的持续集成环境
- 使用Asp.Net Core MVC 开发项目实践[第四篇:基于EF Core的扩展2]
- 构建基于Jenkins + Github的持续集成环境 本人实践版
- Jenkins Pipeline 项目持续集成交互实践路径
- 【软件开发实践】基于 Jenkins 快速搭建持续集成环境
- asp.net core 通过 TeamCity 实现持续集成笔记
- 基于Asp.Net Core 2.1的简单问答社区系统源代码分享
- 基于 Jenkins 快速搭建持续集成环境
- 基于Citus和ASP.NET Core开发多租户应用
- ASP.NET Core Docker jexus nginx部署-CentOS实践版
- 搭建基于"Jenkins"的iOS持续集成环境
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-5
- [转]教你实践ASP.NET Core Authorization
- jenkins+donet core持续集成环境搭建
- Asp.Net Core 基于QuartzNet任务管理系统(这是一篇用来水的随笔)
- asp.net core 2.0 web api基于JWT自定义策略授权