Jenkins
Jenkins 的本质,其实是将原来平时手工操作的测试、部署用脚本实现自动化,并提供了一个可视化的界面,来查看自动化操作之后的结果。它让很多常规的测试和部署工作在操作一次,后续可以重复使用,提高了开发效率;
流水线 pipeline
pipeline 是一个不错的理念,它通过 DSL(支持声明式或脚本式两种风格),将前述的自动化操作,用代码的方式表达出来,这样让每个团队成员更容易阅读理解,并可以随着代码进行版本管理,实现跟实际代码版本的匹配,以及实现可追溯;
名称解释
pipeline: 用来定义构建流程,包括构建、测试、部署等环节;
node:节点,表示一台机器,是构建环境的组成部分,可用来执行 pipeline 代码;
stage: 阶段,流水线任务中的不同阶段,例如构建阶段、测试阶段、部署阶段等;每个阶段由1到多个任务组成,
step: 任务,用来告知 jenkins 在某个时点,应该做的操作,例如执行某个 shell 命令;
声明式 Pipeline
使用 Pipeline
前提条件
- Jenkins 2.x 以上版本;
- 已安装 Pipeline 插件;
定义 Pipeline
有三种方法:
- 使用 Blue Ocean 插件;
- 使用 UI 界面;
- 在源代码中手写 Jenkinsfile 文件;
自动生成代码片段
创建 Pipeline 项目后,在项目主页的左侧,有一个 Pipeline Syntax 菜单项,可以用来学习如何写 Jenkinsfile;
使用全局变量
- env
- params
- currentBuild
使用 Jenkinsfile
将 Jenkinsfile 放入代码所在的文件夹,一同纳入版本管理后,当 git push 到 github 后,通过 github 的 webhook,会触发 Jenkins 的自动构建;之后 Jenkins 会从 github 摘取最新版本的代码,并按照 Jenkinsfile 中写法的 pipeline 内容自动进行构建、测试和部署等操作;
字符串
def str = “World”
注意需要使用双引号来包含字符串,因为只有双引号括起来的字符串,后续才可以使用美元符 $ 进行引用,例如: ${str}
环境变量
- BUILD_ID
- BUILD_NUMBER
- BUILD_TAG
- BUILD_URL
- EXECUTOR_NUMBER
- JAVA_HOME
- JENKINS_URL
- JOB_NAME:项目名称
- NODE_NAME:机器节点名称,例如 master
- WORKSPACE: WORKSPACE 绝对路径
环境变量通过 $ {env.变量名} 进行访问,例如:”${env.BUILD_ID}”
设置静态环境变量
设置动态环境变量
调用 sh 执行命令,获取 returnStdout 或者 returnStatus 的返回结果,赋值给相应的变量;
处理机密信息
文本、用户名、密码和机密文件
声明式的 Pipeline 通过在 environment 指令中使用 credentials(“凭据ID”) 函数来读取在全局凭据中提前设置好的文本、用户名、密码、机密文件等机密信息,并赋值给相应的变量,以便后续阶段可用凭据 ID 进行调用;
处理参数
使用 parameters 指令,可以在运行时接用户指定的参数;
处理失败
通过在 post 代码块中,指定一些构建结束后要运行的操作;
使用多个 agents
适用一些复杂的用例,例如构建后,在不同平台(linux\windows)进行测试
可选的命令参数
命令的参数可以不用括号,并直接指定参数名称;
以下两种格式都是可以的:
当命令只有一个参数时,则还可以省略参数名
高级的指令
并行执行
使用 Docker
当在 Jenkinsfile 中指定了镜像后,Jenkins 会自动创建基于该镜像的容器,并在容器中执行相应的指令;
容器数据缓存
通过映射本地目录,可以存储容器中的数据