Jenkins(6)流水线(pipeline)、Jenkinsfile设置、多分支构建及简单总结

2023/09 作者:ihunter 0 0

流水线(pipeline)


JJenkins的流水线(pipeline)是其最核心的内容

在流水线中,可以创建更加灵活、更加自由的配置,同时更利于团队协作

将web-Ui的操作都落地为代码,代码配合注释更加容易阅读

流水线既能作为任务的本身,也能作为Jenkinsfile,其类似于dockerfile(将启动docker的所有命令,打包成一个文件)

Jenkins的web-ui所做的操作,也可以落地到Jenkinsfile里面,与dockerfile类似去开发

语法(Jenkinsfile)

Jenkinsfile由5个必备的组成部分

pipeline:整条流水线agent:指定执行器stages:所有阶段stage:某一阶段,可有多个steps:阶段内的每一步,可执行命令

测试

第一步:新建一个项目


在这里插入图片描述


创建完成后,会进入下面的ui界面,我们会发现这个界面明显比之前的更加少一点

在这里插入图片描述


第二步:编辑流水线

在下面的位置进行编辑,也就是Jenkinsfile的编写,类似于dockerfile,如下所示

在这里插入图片描述


这里有两种方式

  1. 直接将代码内嵌到里面,如下:在这里写完后,保存,便直接提交上去

    在这里插入图片描述


从远程代码托管平台,去拉取Jenkinsfile文件,如下:

在这里插入图片描述


在这里插入图片描述


下面,便先去使用第一种方式去敲代码,直接将内容写到ui界面上面,在右侧可以去选择一些用例,选择完后,框内会自动出现例子,这里面包含了之前所说的必备的几个语法

在这里插入图片描述


说明:

pipeline:整条流水线agent:指定执行器stages:所有阶段stage:某一阶段,可有多个steps:阶段内的每一步,可执行命令

在这里插入图片描述


先将Groovy这个选项给取消掉,然后点击保存

在这里插入图片描述


如此,一个pipeline的项目就创建完成了

在这里插入图片描述

第三步:运行

点击运行,如下:在主节点运行

在这里插入图片描述

查看视图

进入,这个项目,会发现有有一个视图

在这里插入图片描述

在视图里面,可以更加清晰的去查看,下面的步骤便是之前配置的

在这里插入图片描述

查看输出日志

输出的内容如下:

在这里插入图片描述

指定阶段运行

最不一样的是其可以选择从指定阶段运行,如下:在这里便可以去重新执行某一个之前配置的阶段

在这里插入图片描述

更加漂亮的UI(Blue Ocean)

全新的流水线控制ui,可重复执行某阶段代码
插件中心搜索blue ocean安装即可

只需要安装一个插件即可,其实和老的ui界面功能差不多,就是界面更加好看一点

安装插件:

在这里插入图片描述


安装完后,在首页便可以进人查看界面了

在这里插入图片描述


进入后的界面如下:

在这里插入图片描述


点击具体的“mypipeline”,便会进入下面的界面

在这里插入图片描述


再去点击,便可以进入下面的界面,在这里可以去重新构建

在这里插入图片描述


在这个界面也可以去执行某一个阶段


使用pipeline自动打包docker镜像

Jenkinsfile配置语法

post

流水线完成后可执行的任务

  • always 无论流水线或者阶段的完成状态。

  • changed 只有当流水线或者阶段完成状态与之前不同时。

  • failure 只有当流水线或者阶段状态为"failure"运行。

  • success 只有当流水线或者阶段状态为"success"运行。

  • unstable 只有当流水线或者阶段状态为"unstable"运行。例如:测试失败。

  • aborted 只有当流水线或者阶段状态为"aborted "运行。例如:手动取消。

agent

可以指定执行节点
label 指定运行job的节点标签
any 不指定,由Jenkins分配

相关脚本片段生成器

点击下面的“流水线语法”即可进入该工具

在这里插入图片描述

点击后,进入下面的界面,在这个界面便可以去配置对应的片段

在这里插入图片描述


比如,在这里,我想去使用git,在上面的选项中,便选择上git,过后便可以与之前一样的去配置git的一些内容,最后便会去生成对应的脚本

在这里插入图片描述

  1. 测试
    配置gitlab的地址和其分支

    在这里插入图片描述


    添加凭证,可以登陆到当前gitlab地址的账号密码

    在这里插入图片描述


    配置完后,生成后,内容如下:

    在这里插入图片描述

第一步:拉取代码

按之前的步骤去配置对应的git脚本,这里我便使用上面生成的片段

在这里插入图片描述

第二步:执行构建

git是可以不要去配置的

在jar包构建时,需要maven,所有这里需要引入一个maven
查看之前安装的maven插件

  1. 进入Globalxxx

    在这里插入图片描述


    查看maven信息

    在这里插入图片描述

  2. 在Jenkinsfile上去引入maven

    在这里插入图片描述

调用maven命令,使用三个双引号可以在这个三个双引号里面写多条命令,如下:如果直接使用sh的话,这便是另外一个命令

在这里插入图片描述

第三步:将jar包发送到测试服务器上

使用插件将jar包发送到测试服务器上

这里因为是需要使用脚本,所以还是需要去使用之前说明的片段生成器,如下:选择sshPublisherxxx

在这里插入图片描述


这个配置与之前的设置的是一样的

按之前的配置完后,点击生成流水线脚本,如下:

在这里插入图片描述

在pipeline里面进行设置,如下

在这里插入图片描述

第四步:生成清理命令

在这里插入图片描述


在这里,还是按之前的配置这样去配置,点击生成后,便会生成对应的脚本

在这里插入图片描述




创建一个多分支流水线

之前的 Jenkins 任务是 FreeStyle 的方式创建的,这种方式不够灵活,界面也不够清爽,这里选择使用声明式流水线方式(Declarative Pipeline)创建,可以多分支独立构建,便于以后的扩展。

我们这里使用 BlueOcean 这种方式来完成此处 CI/CD 的工作,BlueOcean 是 Jenkins 团队从用户体验角度出发,专为 Jenkins Pipeline 重新设计的一套 UI 界面,仍然兼容以前的 fressstyle 类型的 job,BlueOcean 具有以下的一些特性:

  • 连续交付(CD)Pipeline 的复杂可视化,允许快速直观的了解 Pipeline 的状态

  • 可以通过 Pipeline 编辑器直观的创建 Pipeline

  • 需要干预或者出现问题时快速定位,BlueOcean 显示了 Pipeline 需要注意的地方,便于异常处理和提高生产力

  • 用于分支和拉取请求的本地集成可以在 GitHub 或者 Bitbucket 中与其他人进行代码协作时最大限度提高开发人员的生产力。

如果安装的是 Jenkinsci/blueocean 镜像,默认是已经集成了 BlueOcean,没有的可前往插件管理安装对应的插件。



点击打开Blue Ocean,可以看到已经创建好的两个流水线,分别是前端和后台,需要用到不同的工具,在后面会提到,如何创建流水线。



点击创建流水线



我司用的是gitte,所以选择Git,然后填入要连接的仓库地址,需要连接到Git仓库的凭据,我们之前已经创建好了,直接选中即可,如果未创建,在下面的表单直接编辑即可,最后点击创建流水线。



到这里我们就创建了一个多分支流水线,Jenkins 会扫描仓库,带有 JenkinsFile 的分支会被检测出来,JenkinFile 是多分支流水线的配置文件,使用的是 Groovy 语法,可以直接点击创建流水线,Jenkins 会自动为你的项目创建一个 JenkinsFile。



现在可以可视化地编辑想要执行的阶段及步骤,这里加了一个打包的阶段,里面有个步骤是提示开始打包,点击保存。



填入提交信息,点击 Save & Run,会讲 JenkinsFile 上传到 git,并根据 JenkinsFile 执行一个构建任务,目前的构建步骤只有一个,是提示开始打包。



我这里不知道为什么会卡在这个地方不动,所以我在 vscode 直接创建并编辑 JenkinsFile,这种方式更灵活,我更推荐这种方式,下面我会先简单介绍下 JeninsFile 的基础语法,仅包含本项目用到的,对于中小企业的构建需求,基本够用了。

JenkinsFile 基础语法

只需先了解大致的语法,具体的用法会在后面说明:

// 前端项目JenkinsFile配置,后端项目配置稍有不同,后面会区分说明
pipeline {
  agent any
  environment {
    HOST_TEST = 'root@121.41.16.183'
    HOST_ONLINE = 'jenkins@39.101.219.110'
    SOURCE_DIR = 'dist/*'
    TARGET_DIR = '/data/www/kuaimen-yunying-front'
  }
  parameters {
    choice(
      description: '你需要选择哪个环境进行部署 ?',
      name: 'env',
      choices: ['测试环境', '线上环境']
    )
    string(name: 'update', defaultValue: '', description: '本次更新内容?')
  }
  triggers {
    GenericTrigger(
     genericVariables: [
      [key: 'ref', value: '$.ref']
     ],
     causeString: 'Triggered on $ref',
     token: 'runcenter-front-q1w2e3r4t5',
     tokenCredentialId: '',
     printContributedVariables: true,
     printPostContent: true,
     silentResponse: false,
     regexpFilterText: '$ref',
     regexpFilterExpression: 'refs/heads/' + BRANCH_NAME
    )
  }
  stages {
    stage('获取git commit message') {
     steps {
       script {
         env.GIT_COMMIT_MSG = sh (script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim()
       }
     }
  }
    stage('打包') {
      steps {
        nodejs('nodejs-12.16') {
          echo '开始安装依赖'
          sh 'yarn'
          echo '开始打包'
          sh 'yarn run build'
        }
      }
    }
    stage('部署') {
      when {
        expression {
          params.env == '测试环境'
        }
      }
      steps {
        sshagent(credentials: ['km-test2']) {
          sh "ssh -o StrictHostKeyChecking=no ${HOST_TEST} uname -a"
          sh "scp -r ${SOURCE_DIR} ${HOST_TEST}:${TARGET_DIR}"
          sh 'echo "部署成功~"'
        }
      }
    }
    stage('发布') {
      when {
        expression {
          params.env == '线上环境'
        }
      }
      steps {
        sshagent(credentials: ['km-online']) {
          sh "ssh -o StrictHostKeyChecking=no ${HOST_ONLINE} uname -a"
          sh "scp -r ${SOURCE_DIR} ${HOST_ONLINE}:${TARGET_DIR}"
          sh 'echo "发布成功~"'
        }
      }
    }
  }
  post {
    success {
      dingtalk (
        robot: '77d4c82d-3794-4583-bc7f-556902fee6b0',
        type: 'MARKDOWN',
        atAll: true,
        title: '你有新的消息,请注意查收',
        text:[
          '# 运营管理系统发布通知',
          '---',
          '#### **所属:前端**',
          "#### **构建任务:${env.BUILD_DISPLAY_NAME}**",
          "#### **Git commit:${env.GIT_COMMIT_MSG}**",
          "#### **本次更新内容:${params.update}**",
          "#### **部署环境:${params.env}**",
          '#### **构建结果:成功**'
        ]
      )
    }
  }
}
  • pipeline 必须在最外层

  • agent 定义了在哪个环境里执行,默认any

  • stages 阶段,标识构建流程的标签块,子节点是stage

  • steps 执行步骤

  • post 所有阶段执行完成后执行一些逻辑

  • when 可以控制该阶段是否执行

  • environment 环境变量,在这里定义的变量,JenkinsFile的任何地方都可以访问

  • tools 项目使用到的构建工具,声明系统配置中已经定义好的工具,如maven

  • parameters 定义参数,可以提供用户输入或者选择

  • post 构建结束后会执行这里,有success、failure、success,本示例将在success(构建成功时)发起钉钉通知


赞(0) 更多分享

上篇: 如何使用开源组件搭建完整的K8S-Devops平台方案
下篇: Jenkinsfile创建多分支流水线