声明式流水线是最近添加到 Jenkins 流水线的,它在流水线子系统之上提供了一种更简单,更有主见的语法。
所有有效的声明式流水线必须包含在一个 pipeline 块中, 比如:
pipeline {
/* insert Declarative Pipeline here */
}在声明式流水线中有效的基本语句和表达式遵循与 Groovy的语法同样的规则
可以在jenkins中的这里学习或者编写模块


可以以文件名为Jenkinsfile在git仓库中存在
以下是jenkins的pipeline语法模板(部署服务)
服务器信息就在设置里的SSH Servers中添加,不是之前的SSH remote hosts
在post模块中的manager.addShortText变量是在上一步的更新版本信息中生成的.env文件的变量
pipeline {
agent any
parameters {
choice(
name: 'ENV',
choices: [
'',
'test'
],
description: '选择部署环境'
)
choice(
name: 'APPNAME',
choices: [
'',
'confkeeper'
],
description: '输入应用名称'
)
string(
name: 'OBJECT',
defaultValue: '',
description: '输入项目名称'
)
string(
name: 'SALTID',
defaultValue: '',
description: '输入SaltStack ID'
)
}
stages {
stage('环境检查') {
steps {
script {
if (!params.APPNAME?.trim()) {
error("应用名称不能为空")
}
def serverName = getServerConfig(params.ENV)
echo "=== 传入部署信息 ==="
echo "环境: ${params.ENV}"
echo "服务器: ${serverName}"
echo "应用名称: ${params.APPNAME}"
echo "项目名称: ${params.OBJECT}"
echo "SaltStack ID: ${params.SALTID}"
}
}
}
stage('执行部署') {
steps {
script {
def serverName = getServerConfig(params.ENV)
def deployCommand = "source /etc/profile.d/saltstack.sh && git pull && cd /data/app/saltstack && bash deploy.sh ${getDeployArgs(params.APPNAME, params.OBJECT, params.SALTID)}"
echo "在服务器 ${serverName} 上执行命令: ${deployCommand}"
// 使用Jenkins配置的SSH服务器执行命令
sshPublisher(
publishers: [
sshPublisherDesc(
configName: serverName,
transfers: [
sshTransfer(
cleanRemote: false,
excludes: '',
execCommand: deployCommand,
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: '',
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: ''
)
],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true
)
]
)
// 检查构建结果
if (currentBuild.result == 'FAILURE' || currentBuild.result == 'UNSTABLE') {
error("SSH部署执行失败,退出状态非零")
}
echo "✅ SSH部署执行成功"
}
}
}
stage('更新版本信息') {
steps {
script {
def serverName = getServerConfig(params.ENV)
def deployCommand = "env ENV=${params.ENV} bash update_vsadmin.sh ${getDeployArgs(params.APPNAME, params.OBJECT, params.SALTID)}"
sh "${deployCommand}"
}
}
}
post {
success {
echo "🎉 应用 ${params.APPNAME} 在 ${params.ENV} 环境部署成功!"
script {
load ".env"
manager.addShortText("运维版本:${VERSION}")
manager.addShortText("项目名称:${OBJECT}")
manager.addShortText("服务名称:${APPNAME}")
manager.addShortText("上线环境:${ENV}")
}
}
failure {
echo "❌ 应用 ${params.APPNAME} 在 ${params.ENV} 环境部署失败!"
}
}
}
// 获取服务器名称
def getServerConfig(String env) {
def serverMap = [
'test': 'test-server-001',
]
def serverName = serverMap[env]
if (!serverName) {
error("未知环境: ${env}。支持的环境: ${serverMap.keySet().join(', ')}")
}
return serverName
}
// 获取执行部署命令
def getDeployArgs(String appName, String object, String saltid) {
if (object && saltid) {
return "${appName} ${object} ${saltid}"
} else if (object) {
return "${appName} ${object}"
} else {
return "${appName}"
}
}