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實(shí)現(xiàn)CI到CD轉(zhuǎn)變的重要角色。什么是Pipeline,簡單來說,就是一套運(yùn)行于Jenkins上的工作流框架,將原本獨(dú)立運(yùn)行于單個(gè)或者多個(gè)節(jié)點(diǎn)的任務(wù)連接起來,實(shí)現(xiàn)單個(gè)任務(wù)難以完成的復(fù)雜發(fā)布流程。Pipeline的實(shí)現(xiàn)方式是一套Groovy DSL,任何發(fā)布流程都可以表述為一段Groovy腳本,并且Jenkins支持從代碼庫直接讀取腳本,從而實(shí)現(xiàn)了Pipeline as Code的理念。

Pipeline的幾個(gè)基本概念:

  • Stage: 階段,一個(gè)Pipeline可以劃分為若干個(gè)Stage,每個(gè)Stage代表一組操作。注意,Stage是一個(gè)邏輯分組的概念,可以跨多個(gè)Node。
  • Node: 節(jié)點(diǎn),一個(gè)Node就是一個(gè)Jenkins節(jié)點(diǎn),或者是Master,或者是Agent,是執(zhí)行Step的具體運(yùn)行期環(huán)境。
  • Step: 步驟,Step是最基本的操作單元,小到創(chuàng)建一個(gè)目錄,大到構(gòu)建一個(gè)Docker鏡像,由各類Jenkins Plugin提供。

Jenkins Pipleline插件:

https://wiki.jenkins.io/display/JENKINS/Pipeline+Plugin
使用時(shí),Jenkins需要安裝Pipeline和Maven插件。

Jenkins Pipeline語法參考

以下是完整的Jenkins Pipeline語法參考卡。 當(dāng)然,當(dāng)您添加插件或插件更新時(shí),新的流水線腳本元素將在您的環(huán)境中可用。 Pipeline代碼段生成器和UI將自動(dòng)添加這些和任何相關(guān)的幫助文本,以便您知道如何使用它們!

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插件公開了一個(gè)Docker全局變量,它為普通的Docker操作提供DSL,只需要在運(yùn)行步驟的執(zhí)行程序上使用一個(gè)Docker客戶端(在您的節(jié)點(diǎn)步驟中使用一個(gè)標(biāo)簽來定位啟用Docker的代理)。

默認(rèn)情況下,Docker全局變量連接到本地Docker守護(hù)程序。 您可以使用docker.withServer步驟連接到遠(yuǎn)程Docker主機(jī)。 圖像步驟為特定的Docker圖像提供句柄,并允許執(zhí)行其他與圖像相關(guān)的其他步驟,包括image.inside步驟。 內(nèi)部步驟將啟動(dòng)指定的容器并在該容器中運(yùn)行一個(gè)步驟:

示例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. // 鏡像中進(jìn)行單元測試

  7. stage('unit testing'){

  8. // 啟動(dòng)golnag:1.7并在golang內(nèi)編譯代碼

  9. docker.image('golang:1.7').inside {

  10. sh './script/unittest.sh'

  11. }

  12. }

  13. // 鏡像中代碼構(gòu)建

  14. stage('Build'){

  15. def confFilePath = 'conf/app.conf'

  16. def config = readFile confFilePath

  17. writeFile file: confFilePath, text: config

  18. // 啟動(dòng)golnag:1.7并在golang內(nèi)編譯代碼

  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. // 啟動(dòng)剛運(yùn)行的容器

  31. stage('deploy iamegs'){

  32. // 需要?jiǎng)h除舊版本的容器,否則會(huì)導(dǎo)致端口占用而無法啟動(dòng)。

  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. }

更多使用方法請(qǐng)參考Jenkins Pipeline docker語法。

另外可以借助Pipeline Syntax來生成基本的腳本:

image

Jenkins Pipeline war 包部署示例

Pipeline通過增強(qiáng)stage原語來提供此功能。 例如,一個(gè)階段可以具有一個(gè)定義的并發(fā)級(jí)別,以指示在任何時(shí)候只有一個(gè)線程應(yīng)該在該階段中運(yùn)行。 這實(shí)現(xiàn)了運(yùn)行部署的期望狀態(tài),就像運(yùn)行一樣快。
參考: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持續(xù)集成

持續(xù)集成 Jenkins 2.7 pipeline 功能使用介紹

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

Jenkins2 Pipeline: deploy on tomcat

更多閱讀Jenkinsfile參考:

Pipeline

Getting Started with Pipeline

Using a Jenkinsfile

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容