前言

本文通过一个声明式流水线的HelloWorld程序做一下流水线基础入门,对常用的流水线参数进行简要说明

什么是流水线

现实中的流水线

流水线比较好理解,类比于现实生活中的生产流水线,每个流程只做一件事,通过传送带把这些流程连接在一起,一个流程完成后的结果交由后续流程继续操作。

Jenkins的流水线简单认知

Jenkins的流水线也是这样工作的,最简单的认知是它可以把若干可通用的Shell脚本像胶水一样连接起来,虽然这个比喻比较形象,但这只是流水线的冰山一角。

Jenkins流水线的两种形式

在Jenkins升级2.x版本之前,流水线只有一种脚本式流水线(Script Pipeline),当升级2.x版本后,新增了声明式流水线(Declarative Pipeline)

什么是Jenkinsfile

无论是哪种流水线,都需要为流水线定义流水线脚本,称之为Jenkinsfile ,使用Groovy语法写成

脚本式流水线

在说明声明式流水线前,有必要了解一下脚本式流水线的基本概念,这样有利于我们知道声明式流水线的好处与脚本式流水线的限制

特征

在脚本化流水线语法中, 一个或多个 node 块在整个流水线中执行核心工作。

限制

虽然这不是脚本化流水线语法的强制性要求, 但它限制了你的流水线的在node块内的只能做两件事:

  1. 需要通过在Jenkins队列中添加一个项来调度块中包含的步骤。 节点上的执行器一空闲, 该步骤就会运行。
  2. 创建一个工作区(特定为特定流水间建立的目录),其中工作可以在从源代码控制检出的文件上完成。

基本语法

Jenkinsfile (Scripted Pipeline)

node { //需要有一个或多个node节点表示一系列操作
stage('Build') { //每个stage表示一个步骤
// Build步骤内容
}
stage('Test') {
// Test步骤内容
}
stage('Deploy') {
// Deploy步骤内容
}
}

声明式流水线的基本语法类似于脚本式流水线,但是其功能更加强大

声明式流水线基础

特征

声明式流水线最外层Jenkinsfile脚本节点是pipeline

与脚本式流水线不同点

声明式和脚本化的流水线从根本上是不同的。 声明式流水线的是 Jenkins 流水线更近的特性:

  • 相比脚本化的流水线语法,它提供更丰富的语法特性,
  • 是为了使编写和读取流水线代码更容易而设计的。

基础语法

Jenkinsfile (Declarative Pipeline)

pipeline { // pipeline是声明式流水线的一种特定语法,在块内定义了整个流水线的所有内容
agent any // agent是声明式流水线的一种特定语法,它指示 Jenkins 为整个流水线分配一个执行器 (在节点上)和工作区,等效于脚本式流水线node块
stages { // 所有流程(状态)的外层块,仅有一个
stage('Build') { //每个stage为一流程,与脚本式基本一致,每个stage可以定义名称
steps { //步骤块,内部包含具体操作
sh 'make' // sh操作,其引号间的文字会当成shell直接执行
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml' //junit使用匹配的定义测试xml进行单元测试
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}

声明式流水线HelloWorld

有了上边的基础,我们来写一个最简单的HelloWorld声明式流水线吧!

创建项目

点击左上角的新建项目(new item)

我们这里选择流水线,输入工程名称Hello Pipeline , 确定

这里的流水线与多分支流水线的区别我认为有两个:

  • 一个是流水线只能指定一个分支的Jenkinsfile,还可以把脚本直接写到工程中,而多分支流水线可以指定多个分支的Jenkinsfile,但是不能把脚本写在工程中;
  • SCM插件也支持多分支流水线,而单分支流水线没有

填写描述,勾选This project is parameterized

添加参数,选择String parameter

这里我们加一个参数,一个字符串参数,这样我们在Jenkinsfile中就可以取到这个值了

添加这个参数是为了让大家先有个参数化构建的准备

往下滑动,找到流水线定义处可选直接写脚本还是走版本控制,这里直接使用脚本

脚本处输入如下内容

pipeline {
agent any;
environment { //环境变量
GREETING="Hello";
}
stages{
stage('打招呼') {
steps{
sh 'echo "$GREETING $TITLE"'
}
}
}
post { //构建完成后置操作
aborted { //如果构建中断,则执行
echo '构建被中止!'
}
success { //构建成功执行
echo '构建成功!'
}
failure { //构建失败执行
echo '构建失败!'
}
}
}

语法不会写怎么办?上边的图中有流水线语法(Pipeline-Syntax),通过这个语法功能就可以生成部分脚本

点保存,我们去准备构建这个工程

点击Build with Parameters

这里我们看到刚才定义的参数值是可以修改的,有兴趣可以改下试试,然后开始构建

输出如下

把鼠标放在打招呼下边的绿色框上,点出现的logs

我们可以看到输出了预期的值

查看下Post Actions的日志

我们可以通过左下角的构建版本号,如当前是#1,点进去,选择Console Output查看详细的执行日志

细心会发现构建的工作空间在我们指定的Jenkins家目录/workspace/当前工程名

声明式流水线HelloWorld工程就先写这些

后记

在家里的笔记本装的Debian用了一年了快,这次写文章截图用的Gimp

Jenkins教程——从安装到部署Docker服务(二)声明式流水线HelloWorld的更多相关文章

  1. Jenkins教程——从安装到部署Docker服务(一)安装Jenkins

    前言 写了好久Jenkins的脚本了,写得虽然不是太好,但是可以基本满足需要,最近比较忙,这个月也没怎么更新博客,开始更新Jenkins这个系列的文章,打算从安装Jenkins -> 流水线工程 ...

  2. Linux系统如何在离线环境或内网环境安装部署Docker服务和其他服务

    如何在离线环境或纯内网环境的Linux机器上安装部署Docker服务或其他服务.本次我们以Docker服务和Ansible服务为例. 获取指定服务的所有rpm包 保证要获取rpm包的机器能够上网. 本 ...

  3. suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务

    文章目录 1.4.部署docker 1.4.0.下载docker二进制文件 1.4.1.配置docker镜像加速 1.4.2.配置docker为systemctl管理 1.4.3.启动docker服务 ...

  4. Jenkins初体验-安装与部署服务

    一.概述 1.简介 在工作中接触到CD/CI,Devops相关的技术,本文记录Jenkins的基本使用.Jenkins是一款开源的持续集成工具,能够集成一套自动化部署任务. 目标 通过jenkins从 ...

  5. Jenkins教程(五)构建Java服务Docker镜像

    本文主旨 主要记录下如何使用Jenkins构建Java服务的Docker镜像,以及手动部署测试下 前期准备 已安装Jenkins 为jenkins用户添加到docker组内 本地装有maven,配置或 ...

  6. 安装、部署... Windows服务 .net程序 安装 命令

    @echo offInstallutil.exe 程序目录 F:\test\TestWindows.exe 服务程序目录@sc start "服务名称"@sc config &qu ...

  7. Linux环境下的Docker的安装和部署、学习二

    DockerFile体系结构(保留字指令) FROM:基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER:镜像维护者的姓名和邮箱地址 RUN:容器构建时需要运行的命令 EXPOSE:当前容器对 ...

  8. 安装指定版本的docker服务

    参考博客:Docker CE 镜像源站 参考博客:docker启动异常driver not supported 1. 说明 之前部署docker服务的时候都是安装最新的docker版本,并使用dock ...

  9. docker学习-----docker服务的安装

    docker 以下观点个人理解,只做参考 一.docker本身的优势 1.docker他本身是一个容器,用来方便我们项目打包,做服务器虚拟化,统一开发者环境等多种优势:运行于docker上的项目可以快 ...

随机推荐

  1. HTML--表格与表单(练习做注册页面)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 【JDK】JDK源码分析-TreeMap(1)

    概述 前面数据结构与算法笔记对红黑树进行了分析,而 TreeMap 内部就是基于红黑树实现的.示意图: 它的查找.插入.删除操作的时间复杂度均为 O(logn). TreeMap 类的继承结构如下: ...

  3. android 基于wifi模块通信开发

    这篇文章主要是我写完手机与wifi模块通信后所用来总结编写过程的文章,下面,我分几点来说一下编写的大概流程. 一.拉出按钮控件并设置它的点击事件 二.设置wifi权限 三.打开和关闭wifi 四.扫描 ...

  4. 面试必谈的哈希,.Net 程序员温故而知新

    引言: 作为资深老鸟,有事没事,出去面试:找准差距.定位价值. 面试必谈哈希, Q1:什么是哈希? Q2:哈希为什么快? Q3:你是怎么理解哈希算法利用空间换取时间的? Q4:你是怎么解决哈希冲突的? ...

  5. Mybatis与Spring集成时都做了什么?

    Mybatis是java开发者非常熟悉的ORM框架,Spring集成Mybatis更是我们的日常开发姿势. 本篇主要讲Mybatis与Spring集成所做的事情,让读过本文的开发者对Mybatis和S ...

  6. Extjs的文件上传问题

    最近做一个ExtJs4.0的文件上传.发现在没有添加 xtype:filefield,   时提交数据form的数据,修改form都能提交,而且返回正常.但是当加入xtype:filefield后,返 ...

  7. JavaSE(一)Java程序的三个基本规则-组织形式,编译运行,命名规则

    一.Java程序的组织形式       Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位.       J ...

  8. LASSO原作者的论文,来读读看

    Regression Shrinkage and Selection via the lasso 众所周知,Robert Tibshirani是统计领域的大佬,这篇文章在1996年提出了LASSO,之 ...

  9. Unittest 支持 case 失败后自动截图功能的另外两种方式

    原生的unittest框架是不支持case失败后自动截图的功能的,网上看了大家的解决办法,大体上分为两种:1.要么加装饰器2.也有人封装断言这里我们看看还有没有其他的更加方便的方法值得大家一起探讨一下 ...

  10. ArrayList 的使用方法【摘要】

    ArrayList 的使用方法 1.什么是ArrayList ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: (1)动态的增加和减少元素 ...