前言
Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等.
本文的主要目的是引导你快速熟悉 Jenkinsfile 结构和语义, 让你读完之后可以自己写出一个 Jenkinsfile.
Jenkins 流水线分为脚本式的和声明式的. 脚本式流水线比较灵活, 可以嵌入一些 groovy 语言编程,功能比较强大, 但是对于新手而言上手比较困难, 有一定的学习门槛. 声明式流水线更具结构化, 简单直白, 减少了对 groovy 语言的依赖, 对新用户更友好.
Jenkinsfile 是什么
在 Jenkins 2 中, 流水线配置可以从 Jenkins 中分离出来. Jenkinsfile 允许你将配置文件和执行步骤以代码的形式保存, 这样就可以做到像管理 源代码一样管理 Jenkins 任务, 支持历史追溯, 差异对比等.
Jenkins2 推荐使用名为 'Jenkinsfile’的文件保存任务配置和流水线信息, 不同的项目和分支都有自己 的 Jenkinsfile, 其内容各不相同.
Jenkinsfile 基本功能
让我们先从一个简单的 Jenkinsfile 开始, 逐步了解 Jenkinsfile 的功能和用法.
Jenkinsfile Hello world
pipeline {
agent any
stages {
stage('Source') {
steps {
echo 'hello world'
}
}
}
}
- 第 1 行声明这是一个流水线.
- 第 2 行指定了执行该流水线的
agent
,agent
可以理解为一个执行环境, 可以是docker
,k8s
, 也可以是当前机器环境 - 第 4 行指定了执行该流水线所需要的步骤,
stages
里面可以保护多个stage
- 第 5 行指定了一个名字叫做
'Source'
的stage
- 第 6 行指定了该
stage
内需要执行的steps
- 第 7 行调用
echo
内置函数打印了一句'hello world'
执行 shell 脚本
在 steps 块中使用sh
来执行. 多行命令可以用"""
(三个双引号) 或者 "'
(三个单引号). 区别在于双引号里面引用 的变量会被计算展开. 例如:
steps {
// 单行shell命令
sh 'echo "Hello world"'
// 多行shell命令, 以连续的三个'或者"包围
sh '''#!/bin/bash
# multi line shell script
cd project
mkdir build && cd build
cmake .. && cmake --build .
'''
}
指定工作目录
dir
指令的功能是设定命令执行时的工作目录, 如果该目录不存在则创建它.
steps {
dir('project/build') {
sh "echo `pwd`"
}
}
拉取 GitHub/Bitbucket 代码
声明式流水线的 git 检出代码非常简单直白. 如下:
steps {
dir('code_repo') {
git credentialsId: