pipeline语法

官方文档

声明式流水线介绍

声明式流水线是 Jenkins 流水线的新特性,它在流水线子系统之上提供了一种更简单、更有主见的语法。

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

pipeline {
    /* insert Declarative Pipeline here */
}

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

编写模块

可以在 Jenkins 的以下位置学习或编写模块:

模板

可以以 Jenkinsfile 为文件名存储在 Git 仓库中。

以下是 Jenkins Pipeline 语法模板(用于部署服务):

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}"
    }
}