您的位置:首页 > 编程语言 > ASP

基于Jenkins Pipeline的ASP.NET Core持续集成实践

2019-04-14 23:19 2361 查看

最近在公司实践持续集成,使用到了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

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: