Pipeline功能语法
一、options全局配置
options {
timestamps () // 打印日志时间
timeout(time: 10, unit: 'MINUTES') // 设置流水线执行超时时间 天(DAYS) 时(HOURS) 分钟(MINUTES) 秒(SECONDS)
}
二、tools全局工具
tools {
maven "M3" // 定义maven build的使用工具,M3是在jenkins中全局工具中定义的名称
}
三、post构建后的操作
post {
success {
junit '**/target/surefire-reports/TEST-*.xml' // 将所有符合 **/target/surefire-reports/TEST-*.xml 模式的文件作为 JUnit 测试报告发布,以便在 Jenkins UI 中展示测试结果。
archiveArtifacts 'target/*.jar' // 将所有符合 target/*.jar 模式的文件归档,这些通常是构建好的 JAR 文件,便于后续发布或部署使用(可以直接通过web页面下载jar包)
}
}
success:构建成功时执行的操作。
failure:构建失败时执行的操作。
always:无论构建成功还是失败,总是执行的操作。
unstable:构建不稳定时执行的操作。
changed:构建状态发生变化时执行的操作。
notBuilt:构建未执行时执行的操作。
四、Tag参数化构建
parameters {
gitParameter name: 'BRANCH_TAG', // 参数的名称
type: 'PT_BRANCH_TAG', // 构建参数(分支或标签)
// branchFilter: 'origin/(.*)', // 正则表达式匹配所有分支或标签
branchFilter: 'refs/tags/*', // 只使用标签参数化构建
defaultValue: 'v1.0', // 默认版本(必须真实存在)
selectedValue: 'DEFAULT',
sortMode: 'DESCENDING_SMART', // 根据提交的标签时间来选择排序
description: '请选择您的标签' // 构建描述
}
stage('Git') {
steps {
checkout([$class: 'GitSCM',
branches: [[name: "${params.BRANCH_TAG}"]],
doGenerateSubmoduleConfigurations: false,
extensions: [],
gitTool: 'Default',
submoduleCfg: [],
userRemoteConfigs: [[url: 'http://192.168.93.102/gitlab-instance-d7dfeb22/web.git',credentialsId: '45a7db8a-55fc-4802-bed1-6ca83bcbf527',]]
])
}
}
五、environment 化境变量
pipeline {
agent any
environment {
CI = 'true' // 定义一个名称CI的变量值为true
}
stages {
stage('ENV') {
steps {
echo "${CI}"
}
}
}
}
}
六、Pipeline执行远程命令代码
6.1、远程主机执行shell命令
pipeline {
agent any
stages {
stage('Remote SSH') {
steps {
script {
def name = 'root' // 定义局部变量
def password = 'wzh.2005'
def remote = [:] // 定义一个名为remote的变量
remote.name = '执行shell' // 起个名字
remote.host = '192.168.93.102' // 要执行的远程主机IP
remote.user = "${name}" // 远程主机用户名(root)
remote.password = "${password}" // 远程主机密码
remote.allowAnyHosts = true // 跳过密钥匹配
sshCommand remote: remote, command: "rm -rf /root/*" // 在远程主机执行的命令
sshCommand remote: remote, command: "touch /root/1.txt"
sshCommand remote: remote, command: "date > /root/1.txt"
sshCommand remote: remote, command: "cat /root/1.txt"
}
}
}
}
}
6.2、获取远程主机文件/目录
pipeline {
agent any
stages {
stage('Remote SSH-GET') {
steps {
script {
def name = "root"
def password = 'wzh.2005'
def remote = [:]
remote.name = '获取远程主机文件或目录'
remote.host = '192.168.93.102'
remote.user = "${name}"
remote.password = "${password}"
remote.allowAnyHosts = true
stage ('Remote SSH-GET') {
// 把远程主机/etc/hosts文件,复制到jenkins本机的/root目录下名叫wzh-hosts
// override: true:目标文件在本地已经存在时将覆盖本地文件
sshGet remote: remote, from: '/etc/hosts', into: '/root/wzh-hosts', override: true
// 获取远程目录(提前进行tar打包) sshGet remote: remote, from: '/tmp/mydirectory.tar.gz', into: '/root/mydirectory.tar.gz', override: true
}
}
}
}
}
}
6.3、发送本机文件/目录到远程主机
pipeline {
agent any
stages {
stage('Remote SSH-PUT') {
steps {
script {
def name = "root"
def password = 'wzh.2005'
def remote = [:]
remote.name = '将本地文件或目录放到远程主机上'
remote.host = '192.168.93.102'
remote.user = "${name}"
remote.password = "${password}"
remote.allowAnyHosts = true
stage ('Remote SSH-PUT') {
// abc.sh文件路径为jenkins工程目录里面
writeFile file: 'abc.sh', text: 'ls -lrt' // 创建一个abc.sh文件往里面写入ls -lrt内容
sshPut remote: remote, from: 'abc.sh' , into: '/root' // 将jenkins本机abc.sh文件发送到远程主机/root下
}
}
}
}
}
}
6.4、删除远程主机或目录
pipeline {
agent any
stages {
stage('Remote SSH-Remove') {
steps {
script {
def name = "root"
def password = 'wzh.2005'
def remote = [:]
remote.name = '将本地文件或目录放到远程主机上'
remote.host = '192.168.93.102'
remote.user = "${name}"
remote.password = "${password}"
remote.allowAnyHosts = true
stage ('Remote SSH-Remove') {
sshRemove remote: remote, path: "/root/abc.sh"
}
}
}
}
}
}
6.5、在远程主机执行脚本
pipeline {
agent any
stages {
stage('Remote SSH-Remove') {
steps {
script {
def name = "root"
def password = 'wzh.2005'
def remote = [:]
remote.name = '将本地文件或目录放到远程主机上'
remote.host = '192.168.93.102'
remote.user = "${name}"
remote.password = "${password}"
remote.allowAnyHosts = true
stage ('Remote SSH-Remove') {
writeFile file: 'abc.sh', text: 'ls -lrt' // 创建一个abc.sh文件往里面写入ls -lrt内容
sshPut remote: remote, from: 'abc.sh' , into: '/root' // 将jenkins本机abc.sh文件发送到远程主机/root下
sshScript remote: remote, script: "/root/abc.sh"
}
}
}
}
}
}
七、使用Docker代理
pipeline {
agent {
docker {
image 'node:6-alpine' // 镜像可以随意选择,根据自己的项目需要进行选择
args '-p 3000:3000 -p 5000:5000' // 运行容器时开启的端口
}
}
environment {
CI = 'true'
CD = 'true'
}
stages {
stage('Build') {
steps {
script {
sh 'cat /etc/hosts'
}
}
}
stage('Test') {
steps {
echo "${CI}"
}
}
}
}
五、when条件判断
5.1、基础构建结果的条件判断
pipeline {
agent any
stages {
stage('Build') {
steps {
echo "Building..."
// sh 'exit 1'
}
}
stage('Deploy') {
when {
expression { return currentBuild.result == 'SUCCESS' } // 使用表达式来检查构建状态
}
steps {
echo "Deployment"
}
}
}
}
5.1、基于环境变量的条件判断
pipeline {
agent any
environment {
ENV_VAR = 'prod' // 设置环境变量
}
stages {
stage('Build') {
steps {
echo "Building..."
}
}
stage('Deploy') {
when {
expression { return env.ENV_VAR == 'prod' } // 只有变量ENV_VAR的值等于prod的时候才会构建此步骤
}
steps {
echo "Deployment"
}
}
}
}
六、Input人机交互
pipeline {
agent any
stages {
stage('传入image版本') {
steps {
script {
// 获取输入并存储为环境变量
def userInput = input(
message: "----是否继续----",
ok: "是",
submitter: "admin",
parameters: [
string(name: "api", defaultValue: "", description: "发布的镜像版本(api)"),
string(name: "im", defaultValue: "", description: "发布的镜像版本(im)")
]
)
// 将输入参数赋值给环境变量
env.API_VERSION = userInput.api
env.IM_VERSION = userInput.im
}
}
}
stage('发版到101') {
steps {
script {
// 现在可以使用全局环境变量
echo "在 101 阶段: API 版本: ${env.API_VERSION}"
echo "在 101 阶段: IM 版本: ${env.IM_VERSION}"
}
}
}
stage('发版到102') {
steps {
script {
// 现在可以使用全局环境变量
echo "在 102 阶段: API 版本: ${env.API_VERSION}"
echo "在 102 阶段: IM 版本: ${env.IM_VERSION}"
}
}
}
}
}
七、Pipeline Push Git Code
stage('Git Push Application') {
steps {
script {
// 使用 withCredentials 来提供 Git 推送所需的凭据
withCredentials([usernamePassword(credentialsId: 'gitlab', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
// 执行 shell 命令来更新 deploy.yaml 并推送更改
sh """
pwd
rm -rf /var/jenkins_home/workspace/xzs-argocd/xzs-application
git clone http://192.168.93.102/root/xzs-application.git
cd xzs-application
sed -i "s#^ *image: .*# image: 192.168.93.103:80/xzs-argocd/xzs:${BUILD_NUMBER}#" deploy.yaml
git config --local user.name "my-dlq"
git config --local user.email "mynamedlq@163.com"
git add .
git commit -m "v1"
git push --set-upstream http://\${GIT_USERNAME}:\${GIT_PASSWORD}@192.168.93.102/root/xzs-application.git main
"""
// 注意:上面的 git push 命令中使用了直接的用户名和密码,这通常不是安全的做法。
// 更安全的方法是使用 SSH 密钥进行身份验证,或者在 Jenkins 中配置一个安全的凭据存储机制。
// 上面的命令仅作为示例,您可能需要根据您的 Git 服务器配置进行调整。
}
}
}
}