Jenkins Pipeline
Jenkins
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
CI
CI(Continuous integration,持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
CD
CD(Continuous Delivery, 持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,完成单元测试后,可以把代码部署到连接数据库的Staging环境中进行更多的测试。如果代码没有问题,可以继续部署到生产环境。
Pipeline
Pipeline,是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。
Pipeline是Jenkins2.X的最核心的特性,帮助Jenkins实现从CI到CD与DevOps的转变
Pipeline是一组插件,让Jenkins可以实现持续交付管道的落地和实施。
持续交付管道(CD Pipeline)是将软件从版本控制阶段到交付给用户或客户的完整过程的自动化表现。软件的每一次更改(提交到源代码管理系统)都要经过一个复杂的过程才能被发布。
Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code(Jenkinsfile存储在项目的源代码库)的目的。
Stage:阶段,一个Pipeline可以划分成若干个Stage,每个Stage代表一组操作,例如:“Build”,“Test”,“Deploy”。Stage是一个逻辑分组的概念,可以跨多个Node。
Node:节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行环境。
Step:步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenklins Plugin提供,例如:sh ‘make’
Pipeline五大特性
- 代码:Pipeline以代码的形式实现,通常被检入源代码控制,使团队能够编辑、审查和迭代其CD流程。
- 可持续性:Jenklins重启或者中断后都不会影响Pipeline Job。
- 停顿:Pipeline可以选择停止并等待任工输入或批准,然后再继续Pipeline运行。
- 多功能:Pipeline支持现实世界的复杂CD要求,包括fork/join子进程,循环和并行执行工作的能力
- 可扩展:Pipeline插件支持其DSL的自定义扩展以及与其他插件集成的多个选项。
PIpeline语法
Pipeline支持两种语法:Declarative Pipeline(在Pipeline 2.5中引入,结构化方式)和Scripted Pipeline,两者都支持建立连续输送的Pipeline。
共同点:
两者都是pipeline代码的持久实现,都能够使用pipeline内置的插件或者插件提供的steps,两者都可以利用共享库扩展。
区别:
两者不同之处在于语法和灵活性。Declarative pipeline对用户来说,语法更严格,有固定的组织结构,更容易生成代码段,使其成为用户更理想的选择。但是Scripted pipeline更加灵活,因为Groovy本身只能对结构和语法进行限制,对于更复杂的pipeline来说,用户可以根据自己的业务进行灵活的实现和扩展。下面举例介绍两种语法的使用。
Declarative Pipeline
pipeline {
agent any //在可用的节点运行
stages{ stage ('Prepare'){
steps{ //清空发布目录
bat '''if exist D:\\publish\\LoginServiceCore (rd/s/q D:\\publish\\LoginServiceCore)
if exist C:\\Users\\Administrator\\.nuget (rd/s/q C:\\Users\\Administrator\\.nuget) exit''' } }
//拉取git代码仓库
stage ('Checkout'){
steps{
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [],
userRemoteConfigs: [[credentialsId: 'c6d98bbd-5cfb-4e26-aa56-f70b054b350d',
url: 'http://xxx/xxx/xxx']]])
}
}
//构建
stage ('Build'){
steps{
bat '''cd "D:\\Program Files (x86)\\Jenkins\\workspace\\LoginServiceCore\\LoginApi.Hosting.Web"
dotnet restore
dotnet build
dotnet publish --configuration Release --output D:\\publish\\LoginServiceCore'''
}
}
//部署
stage ('Deploy'){
steps{
bat '''cd D:\\PipelineScript\\LoginServiceCore
python LoginServiceCore.py'''
}
}
//自动化测试(python代码实现)
stage ('Test'){
steps{
bat'''cd D:\\PipelineScript\\LoginServiceCore
python LoginServiceCoreApitest.py'''
}
}
}
}
Scripted Pipeline
node('master') { //master节点运行,以下stage也可指定节点
stage 'Prepare' //清空发布目录
bat '''if exist D:\\publish\\LoginServiceCore (rd/s/q D:\\publish\\LoginServiceCore)
if exist C:\\Users\\Administrator\\.nuget (rd/s/q C:\\Users\\Administrator\\.nuget)
exit'''
//拉取git代码仓库
stage 'Checkout'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c6d98bbd-5cfb-4e26-aa56-f70b054b350d',
url: 'http://xxx/xxx/xxx']]])
//构建
stage 'Build'
bat '''cd "D:\\Program Files (x86)\\Jenkins\\workspace\\LoginServiceCore\\LoginApi.Hosting.Web"
dotnet restore
dotnet build
dotnet publish --configuration Release --output D:\\publish\\LoginServiceCore'''
//部署
stage 'Deploy'
bat '''
cd D:\\PipelineScript\\LoginServiceCore
python LoginServiceCore.py
'''
//自动化测试(python代码实现)
stage 'Test'
bat'''
cd D:\\PipelineScript\\LoginServiceCore
python LoginServiceCoreApitest.py
'''
}
参考文章:
Jenkins详细教程
玩转Jenkins Pipeline
jenkins + pipeline构建自动化部署