Dockerfile&Jenkinsfile&Pipeline

image.png

http://hulk.corp.qihoo.net:8360/help/detail/1504878254
https://jenkins.io/doc/book/pipeline/jenkinsfile/
https://blog.csdn.net/boonya/article/details/77941975

Jenkins Pipleline插件介绍

![upload-images.jianshu.io/upload_images/5776456-70d51053fd8d2e27?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

image

Advanced

image

File System

image

Flow Control

image

Docker

image
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来生成基本的脚本:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容