Jenkins Pipeline and JenkinsX

作者: 燕京博士 | 来源:发表于2018-06-21 17:55 被阅读692次

    Jenkins Pipleline插件介绍

    ![sttp:https://img.haomeiwen.com/i5776456/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

    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

    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)并启动虚拟机加载该镜像

    相关文章

      网友评论

        本文标题:Jenkins Pipeline and JenkinsX

        本文链接:https://www.haomeiwen.com/subject/koscyftx.html