logo
tt's Note
  • 运维
    • 数据库
    • linux
    • vpn
    • 日志
    • 中间件
    • 服务
    • 监控
    • shell
    • windows
    • 语言
    • 云服务
    • 其他
  • 开发
    • 工具
  • 软件
    • 浏览器
    • 多端
    • win
    • mac
    • 网站
  • 项目
    • 效率工具
    • 兴趣
  • 脚本
    • jenkins
    语言概览
    jinja语法
    pipeline语法
    上一页jinja语法

    #pipeline语法

    官方文档

    #声明式流水线介绍

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

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

    pipeline {
        /* insert Declarative Pipeline here */
    }

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

    #编写模块

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

    #模板

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

    以下是jenkins的pipeline语法模板(部署服务)

    Tip

    服务器信息就在设置里的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}"
        }
    }