pipeline语法

官方文档

声明式流水线介绍

声明式流水线是最近添加到 Jenkins 流水线的,它在流水线子系统之上提供了一种更简单,更有主见的语法。

所有有效的声明式流水线必须包含在一个 pipeline 块中, 比如:

pipeline {
    /* insert Declarative Pipeline here */
}

在声明式流水线中有效的基本语句和表达式遵循与 Groovy的语法同样的规则

编写模块

可以在jenkins中的这里学习或者编写模块

模板

可以以文件名为Jenkinsfile在git仓库中存在

以下是jenkinspipeline语法模板(部署服务)

Tip

服务器信息就在设置里的SSH Servers中添加,不是之前的SSH remote hosts

post模块中的manager.addShortText变量是在上一步的更新版本信息中生成的.env文件的变量

template.groovy
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}"
    }
}