Jenkins Pipeline and JenkinsX

Jenkins Pipleline插件介绍

![sttp://upload-images.jianshu.io/upload_images/5776456-7e58d447d4baa536?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

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

《Jenkins Pipeline and JenkinsX》 image

Advanced

《Jenkins Pipeline and JenkinsX》 image

File System

《Jenkins Pipeline and JenkinsX》 image

Flow Control

《Jenkins Pipeline and JenkinsX》 image

Docker

《Jenkins Pipeline and JenkinsX》 image
《Jenkins Pipeline and JenkinsX》 image

Jenkins Pipleline 脚本示例

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

[plain] view plaincopy

<embed id=”ZeroClipboardMovie_1″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_1″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=1&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

<embed id=”ZeroClipboardMovie_5″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_5″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=5&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

  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 plaincopy

<embed id=”ZeroClipboardMovie_2″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_2″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=2&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

<embed id=”ZeroClipboardMovie_6″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_6″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=6&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

  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 plaincopy

<embed id=”ZeroClipboardMovie_3″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_3″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=3&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

<embed id=”ZeroClipboardMovie_7″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_7″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=7&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

  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. stage(‘unit testing’){

  8. // 启动golnag:1.7并在golang内编译代码

  9. docker.image(‘golang:1.7’).inside {

  10. sh ‘./script/unittest.sh’

  11. }

  12. }

  13. // 镜像中代码构建

  14. stage(‘Build’){

  15. def confFilePath = ‘conf/app.conf’

  16. def config = readFile confFilePath

  17. writeFile file: confFilePath, text: config

  18. // 启动golnag:1.7并在golang内编译代码

  19. docker.image(‘golang:1.7’).inside {

  20. sh ‘./script/build.sh’

  21. }

  22. }

  23. // 编译镜像并push到仓库

  24. def imagesName = ‘192.168.18.250:5002/ufleet/uflow:v0.9.1.${BUILD_NUMBER}’

  25. stage(‘Image Build And Push’){

  26. docker.withRegistry(‘http://192.168.18.250:5002’, ‘registry-credentials-id’) {

  27. docker.build(imagesName).push()

  28. }

  29. }

  30. // 启动刚运行的容器

  31. stage(‘deploy iamegs’){

  32. // 需要删除旧版本的容器,否则会导致端口占用而无法启动。

  33. try{

  34. sh ‘docker rm -f cicdDemo’

  35. }catch(e){

  36. // err message

  37. }

  38. docker.image(imagesName).run(‘-p 9091:80 –name cicdDemo’)

  39. }

  40. }

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

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

《Jenkins Pipeline and JenkinsX》 image

Jenkins Pipeline war 包部署示例

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

[plain] view plaincopy

<embed id=”ZeroClipboardMovie_4″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_4″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=4&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

<embed id=”ZeroClipboardMovie_8″ src=”https://csdnimg.cn/public/highlighter/ZeroClipboard.swf” loop=”false” menu=”false” quality=”best” bgcolor=”#ffffff” width=”15″ height=”16″ name=”ZeroClipboardMovie_8″ align=”middle” allowscriptaccess=”always” allowfullscreen=”false” type=”application/x-shockwave-flash” pluginspage=”http://www.macromedia.com/go/getflashplayer” flashvars=”id=8&width=15&height=16″ wmode=”transparent” style=”box-sizing: border-box; outline: 0px; word-break: break-all;”>

  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

1.在本地安装jx命令行工具

curl -L https://github.com/jenkins-x/jx/releases/download/v1.1.40/jx-linux-amd64.tar.gz | tar xzv

mv jx /usr/local/bin

2.使用jx创建一个k8s集群,并自动安装Jenkins X(http://jenkins-x.io/getting-started/create-cluster/)或在已经存在的k8s集群上安装Jenkns x(http://jenkins-x.io/getting-started/install-on-cluster/)

通过已存在的k8s上安装只需要执行 #jx install即可

这里说下使用JX创建一个k8s集群安装jenkins X的注意点:

.执行命令#jx create cluster minikube 会默认下载minikube,kubectl和helm到~/.jx/bin目录下,所以这里需要将该路径加入到系统PATH下;

.安装一款虚拟机软件支持kvm,virtualbox,no(使用docker的话选此选项,注意一定要为其指定专门的网桥)

.根据提示输入内存(默认4096M)输入CPU核数(默认3),选择虚拟机,确定会自动下载Minikube ISO(142.22M)并启动虚拟机加载该镜像

    原文作者:IT诸葛亮
    原文地址: https://www.jianshu.com/p/cdb328d6e972
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞