Jenkins模板文件
大约 8 分钟
Jenkinsfile声明模板
// Jenkinsfile声明模板
pipeline {
// Agent: 表示整个流水线或特定阶段中的步骤和命令执行的位置
// Agent any 在任何可用的代理上执行流水线
// Agent none 表示该 Pipeline 脚本没有全局的 agent 配置。当顶层的 agent 配置为 none 时, 每个 stage 部分都需要包含它自己的 agent
agent any
// 全局变量,会在所有stage中生效
environment {
NAME= 'ZHANG'
// 动态变量 returnStdout: 将命令的执行结果赋值给变量,比如下述的命令返回的是 clang,此时 CC 的值为“clang”。
CC = """${sh(
returnStdout: true,
script: 'echo -n "clang"' //如果使用shell命令的echo赋值变量最好加-n取消换行
)}"""
// 动态变量 returnStatus: 将命令的执行状态赋值给变量,比如下述命令的执行状态为 1,此时 EXIT_STATUS 的值为 1
EXIT_STATUS = """${sh(
returnStatus: true,
script: 'exit 1'
)}"""
// 加密文本
AWS_ACCESS_KEY_ID = credentials('txt1')
AWS_SECRET_ACCESS_KEY = credentials('txt2')
}
// Options: Jenkins 流水线支持很多内置指令,比如 retry 可以对失败的步骤进行重复执行 n 次,可以根据不同的指令实现不同的效果。
// buildDiscarder : 保留多少个流水线的构建记录
// disableConcurrentBuilds : 禁止流水线并行执行,防止并行流水线同时访问共享资源导致流水线失败。
// disableResume : 如果控制器重启,禁止流水线自动恢复。
// newContainerPerStage : agent 为 docker 或 dockerfile 时,每个阶段将在同一个节点的新容器中运行,而不是所有的阶段都在同一个容器中运行。
// quietPeriod : 流水线静默期,也就是触发流水线后等待一会在执行。
// retry : 流水线失败后重试次数。
// timeout : 设置流水线的超时时间,超过流水线时间,job 会自动终止。如果不加 unit 参数默认为 1 分。
// timestamps : 为控制台输出时间戳。
options {
timeout(time: 1, unit: 'HOURS') // 超时时间1小时,如果不加unit参数默认为1分
timestamps() // 所有输出每行都会打印时间戳
buildDiscarder(logRotator(numToKeepStr: '3')) //保留三个历史构建版本
quietPeriod(10) // 注意手动触发的构建不生效
retry(3) // 流水线失败后重试次数
}
// Parameters: 提供了一个用户在触发流水线时应该提供的参数列表 只能定义在 pipeline 顶层。
// 插件: imageTag | gitParameter
parameters {
string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '1') // 执行构建时需要手动配置字符串类型参数,之后赋值给变量
text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '2') // 执行构建时需要提供文本参数,之后赋值给变量
booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '3') // 布尔型参数
choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '4') // 选择形式列表参数
password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') // 密码类型参数,会进行加密
imageTag(name: 'DOCKER_IMAGE', description: '', image: 'kubernetes/kubectl', filter: '.*', defaultTag: '', registry: 'https://192.168.10.15', credentialId: 'harbor-account', tagOrder: 'NATURAL') //获取镜像名称与tag
gitParameter(branch: '', branchFilter: 'origin/(.*)', defaultValue: '', description: 'Branch for build and deploy', name: 'BRANCH', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH')
}
// 定时构建 注意: H 的意思不是 HOURS 的意思,而是 Hash 的缩写。主要为了解决多个流水线在同一时间同时运行带来的系统负载压力。
triggers {
cron('H */4 * * 1-5') // 周一到周五每隔四个小时执行一次
cron('H/12 * * * *') // 每隔12分钟执行一次
cron('H * * * *') // 每隔1小时执行一次
}
// 定义流水线
stages {
// 执行某阶段
stage('Build') {
steps {
echo 'Build'
}
}
stage('Stage For Build'){
// label: 以节点标签形式选择某个具体的节点执行 Pipeline 命令
agent { label 'role-master' }
steps {
sh """
echo 'role-master'
echo 'role-master'
"""
}
}
stage('Stage For Build'){
agent {
// node: 和 label 配置类似,只不过是可以添加一些额外的配置,比如 customWorkspace(设置默认工作目录)
node {
label 'role-master'
customWorkspace "/tmp/zhangzhuo/data"
}
}
steps {
sh "echo role-master > 1.txt"
}
}
agent {
// dockerfile: 使用从源码中包含的 Dockerfile 所构建的容器执行流水线或 stage
dockerfile {
filename 'Dockerfile.build' //dockerfile文件名称
dir 'build' //执行构建镜像的工作目录
label 'role-master' //执行的node节点,标签选择
additionalBuildArgs '--build-arg version=1.0.2' //构建参数
}
}
agent{
// docker: 相当于 dockerfile,可以直接使用 docker 字段指定外部镜像即可,可以省去构建的时间。比如使用 maven 镜像进行打包,同时可以指定 args
docker{
image '192.168.10.15/kubernetes/alpine:latest' //镜像地址
label 'role-master' //执行的节点,标签选择
args '-v /tmp:/tmp' //启动镜像的参数
}
}
// docker 的示例
stage('Example Build') {
agent { docker 'maven:3-alpine' }
steps {
echo 'Hello, Maven'
sh 'mvn --version'
}
}
stage('env1') {
// 定义在stage中的变量只会在当前stage生效,其他的stage不会生效
environment {
HARBOR = 'https://192.168.10.15'
}
steps {
sh "env"
}
}
stage('env1') {
options { // 定义在这里这对这个stage生效
timeout(time: 2, unit: 'SECONDS') // 超时时间2秒
timestamps() // 所有输出每行都会打印时间戳
retry(3) // 流水线失败后重试次数
}
steps {
sh "env && sleep 2"
}
}
// Parameters 测试
stage('git') {
steps {
// 使用gitParameter,必须有这个
git branch: "$BRANCH", credentialsId: 'gitlab-key', url: 'git@192.168.10.14:root/env.git'
}
}
// Input 字段可以实现在流水线中进行交互式操作
stage('Example') {
input {
message "还继续么?"
ok "继续"
submitter "alice,bob" // 可选,允许提交 input 操作的用户或组的名称,如果为空,任何登录用户均可提交 input;
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
}
}
steps {
echo "Hello, ${PERSON}, nice to meet you."
}
}
stage('Example Deploy') {
when {
// beforeAgent: 如果 beforeAgent 为 true,则会先评估 when 条件。在 when 条件为 true 时,才会进入该 stage
// beforeInput: 如果 beforeInput 为 true,则会先评估 when 条件。在 when 条件为 true 时,才会进入到 input 阶段;
// beforeOptions: 如果 beforeInput 为 true,则会先评估 when 条件。在 when 条件为 true 时,才会进入到 options 阶段;
// beforeOptions 优先级大于 beforeInput 大于 beforeAgent
beforeAgent true
branch 'main' // 多分支流水线,分支为main才会执行。
expression { BRANCH_NAME ==~ /(main|master)/ } // 并且 满足正则表达式
anyOf { // 并且 DEPLOY_TO 为 master 或 main
environment name: 'DEPLOY_TO', value: 'main'
environment name: 'DEPLOY_TO', value: 'master'
}
}
steps {
echo 'Deploying'
}
}
// Parallel: 很方便的实现并发构建
stage('Parallel Stage') {
failFast true // 表示其中只要有一个分支构建执行失败,就直接推出不等待其他分支构建
parallel {
stage('Branch A') {
steps {
echo "On Branch A"
}
}
stage('Branch B') {
steps {
echo "On Branch B"
}
}
stage('Branch C') {
stages {
stage('Nested 1') {
steps {
echo "In stage Nested 1 within Branch C"
}
}
stage('Nested 2') {
steps {
echo "In stage Nested 2 within Branch C"
}
}
}
}
}
}
// 静态变量
// Jenkins 有许多内置变量可以直接在 Jenkinsfile 中使用,可以通过 JENKINS_URL/pipeline/syntax/globals#env 获取完整列表。目前比较常用的环境变量如下
// BUILD_ID: 当前构建的 ID,与 Jenkins 版本 1.597+中的 BUILD_NUMBER 完全相同
// BUILD_NUMBER: 当前构建的 ID,和 BUILD_ID 一致
// BUILD_TAG: 用来标识构建的版本号,格式为: jenkins-{BUILD_NUMBER}, 可以对产物进行命名,比如生产的 jar 包名字、镜像的 TAG 等;
// BUILD_URL: 本次构建的完整 URL,比如: http://buildserver/jenkins/job/MyJobName/17/%EF%BC%9B
// JOB_NAME: 本次构建的项目名称
// NODE_NAME: 当前构建节点的名称;
// JENKINS_URL: Jenkins 完整的 URL,需要在 SystemConfiguration 设置;
// WORKSPACE: 执行构建的工作目录。
stage('STATIC_ENV') {
steps {
echo "$env.BUILD_ID"
echo "$env.BUILD_NUMBER"
echo "$env.BUILD_TAG"
}
}
//Post: 一般用于流水线结束后的进一步处理 | 一般情况下 post 部分放在流水线的底部
post {
// always: 无论 Pipeline 或 stage 的完成状态如何,都允许运行该 post 中定义的指令;
// changed: 只有当前 Pipeline 或 stage 的完成状态与它之前的运行不同时,才允许在该 post 部分运行该步骤;
// fixed: 当本次 Pipeline 或 stage 成功,且上一次构建是失败或不稳定时,允许运行该 post 中定义的指令;
// regression: 当本次 Pipeline 或 stage 的状态为失败、不稳定或终止,且上一次构建的 状态为成功时,允许运行该 post 中定义的指令;
// failure: 只有当前 Pipeline 或 stage 的完成状态为失败(failure),才允许在 post 部分运行该步骤,通常这时在 Web 界面中显示为红色
// success: 当前状态为成功(success),执行 post 步骤,通常在 Web 界面中显示为蓝色 或绿色
// unstable: 当前状态为不稳定(unstable),执行 post 步骤,通常由于测试失败或代码 违规等造成,在 Web 界面中显示为黄色
// aborted: 当前状态为终止(aborted),执行该 post 步骤,通常由于流水线被手动终止触发,这时在 Web 界面中显示为灰色;
// unsuccessful: 当前状态不是 success 时,执行该 post 步骤;
// cleanup: 无论 pipeline 或 stage 的完成状态如何,都允许运行该 post 中定义的指令。和 always 的区别在于,cleanup 会在其它执行之后执行。
always {
echo 'I will always say Hello again!'
}
failure {
echo 'I will failure say Hello again!'
}
}
}
}