Jenkins Pipeline 项目持续集成交互实践路径

Jenkins Pipleline插件介绍


Jenkins 2.x的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。

Pipeline的几个基本概念:

  • Stage: 阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
  • Node: 节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
  • Step: 步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。

Jenkins Pipleline插件:

https://wiki.jenkins.io/display/JENKINS/Pipeline+Plugin  
使用时,Jenkins需要安装Pipeline和Maven插件。

Jenkins Pipeline语法参考

以下是完整的Jenkins Pipeline语法参考卡。 当然,当您添加插件或插件更新时,新的流水线脚本元素将在您的环境中可用。 Pipeline代码段生成器和UI将自动添加这些和任何相关的帮助文本,以便您知道如何使用它们!

Basics

Advanced

File System

Flow Control

Docker



Jenkins Pipleline 脚本示例

参考地址:https://www.cloudbees.com/blog/using-pipeline-plugin-accelerate-continuous-delivery-part-3

[plain]  view plain  copy
  1. stage 'build'  
  2. node {  
  3.      git 'https://github.com/cloudbees/todo-api.git'  
  4.      withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {  
  5.           sh "mvn -B –Dmaven.test.failure.ignore=true clean package"  
  6.      }  
  7.      stash excludes: 'target/', includes: '**', name: 'source'  
  8. }  
  9. stage 'test'  
  10. parallel 'integration': {   
  11.      node {  
  12.           unstash 'source'  
  13.           withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {  
  14.                sh "mvn clean verify"  
  15.           }  
  16.      }  
  17. }, 'quality': {  
  18.      node {  
  19.           unstash 'source'  
  20.           withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {  
  21.                sh "mvn sonar:sonar"  
  22.           }  
  23.      }  
  24. }  
  25. stage 'approve'  
  26. timeout(time: 7, unit: 'DAYS') {  
  27.      input message: 'Do you want to deploy?', submitter: 'ops'  
  28. }  
  29. stage name:'deploy', concurrency: 1  
  30. node {  
  31.      unstash 'source'  
  32.      withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {  
  33.           sh "mvn cargo:deploy"  
  34.      }  
  35. }  
注:m3表示Jenkins配置的maven名称。

Jenkins Pipeline Docker脚本示例

Docker Pipeline Plugin (示例)

Docker Pipeline插件公开了一个Docker全局变量,它为普通的Docker操作提供DSL,只需要在运行步骤的执行程序上使用一个Docker客户端(在您的节点步骤中使用一个标签来定位启用Docker的代理)。

默认情况下,Docker全局变量连接到本地Docker守护程序。 您可以使用docker.withServer步骤连接到远程Docker主机。 图像步骤为特定的Docker图像提供句柄,并允许执行其他与图像相关的其他步骤,包括image.inside步骤。 内部步骤将启动指定的容器并在该容器中运行一个步骤:

示例1:

[plain]  view plain  copy
  1. docker.image('maven:3.3.3-jdk8').inside('-v ~/.m2/repo:/m2repo') {  
  2.      sh 'mvn -Dmaven.repo.local=/m2repo clean package'  
  3. }  

示例2(参考:http://www.youruncloud.com/blog/127.html):

[plain]  view plain  copy
  1. node{    
  2.   // 代码检出  
  3.   stage('get Code') {  
  4.     git credentialsId: 'git-credentials-id', url: 'http://192.168.19.250/ufleet/uflow.git'  
  5.   }  
  6.     
  7.     // 镜像中进行单元测试  
  8.   stage('unit testing'){   
  9.     // 启动golnag:1.7并在golang内编译代码  
  10.     docker.image('golang:1.7').inside {  
  11.       sh './script/unittest.sh'  
  12.     }  
  13.   }  
  14.     
  15.   // 镜像中代码构建  
  16.   stage('Build'){      
  17.   
  18.     def confFilePath = 'conf/app.conf'  
  19.     def config = readFile confFilePath  
  20.   
  21.     writeFile file: confFilePath, text: config  
  22.       
  23.     // 启动golnag:1.7并在golang内编译代码  
  24.     docker.image('golang:1.7').inside {  
  25.       sh './script/build.sh'  
  26.     }  
  27.   }  
  28.     
  29.   // 编译镜像并push到仓库  
  30.   def imagesName = '192.168.18.250:5002/ufleet/uflow:v0.9.1.${BUILD_NUMBER}'    
  31.   stage('Image Build And Push'){  
  32.     docker.withRegistry('http://192.168.18.250:5002', 'registry-credentials-id') {  
  33.       docker.build(imagesName).push()  
  34.     }  
  35.   }  
  36.     
  37.   // 启动刚运行的容器  
  38.   stage('deploy iamegs'){      
  39.     // 需要删除旧版本的容器,否则会导致端口占用而无法启动。  
  40.     try{  
  41.       sh 'docker rm -f cicdDemo'  
  42.     }catch(e){  
  43.         // err message  
  44.     }  
  45.     docker.image(imagesName).run('-p 9091:80 --name cicdDemo')   
  46.   }  
  47. }  


更多使用方法请参考Jenkins Pipeline docker语法。

另外可以借助Pipeline Syntax来生成基本的脚本:



Jenkins Pipeline war 包部署示例

Pipeline通过增强stage原语来提供此功能。 例如,一个阶段可以具有一个定义的并发级别,以指示在任何时候只有一个线程应该在该阶段中运行。 这实现了运行部署的期望状态,就像运行一样快。
参考:https://jenkins.io/doc/book/pipeline-as-code/

[plain]  view plain  copy
  1. stage name: 'Production', concurrency: 1  
  2. node {  
  3.     unarchive mapping: ['target/x.war' : 'x.war']  
  4.     deploy 'target/x.war', 'production'  
  5.     echo 'Deployed to http://localhost:8888/production/'  
  6. }  

本博参考文章:

初试Jenkins2.0 Pipeline持续集成

持续集成 Jenkins 2.7 pipeline 功能使用介绍

Pipeline as Code Introduction (包含war包部署介绍)

Jenkins2 Pipeline: deploy on tomcat

更多阅读Jenkinsfile参考:

Pipeline

Getting Started with Pipeline

Using a Jenkinsfile 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值