服务公告

服务公告 > Linux命令 > 蓝易云cdn:sshPublisher示例

蓝易云cdn:sshPublisher示例

发布时间:2026-02-08 00:02

下面给你一个可直接落地的 sshPublisher 示例(Jenkins 的 Publish over SSH 插件),覆盖两种最常见场景:Pipeline(Jenkinsfile) 与 自由风格任务(Freestyle)。目标是做到:构建 → 传包 → 远程解压/重启 一条链闭环 ✅🙂


1)前置配置(全局一次性)

在 Jenkins:系统管理 → 系统配置(Configure System)→ Publish over SSH → SSH Servers 新增一台目标机:

  • Name / Config Name:例如 prod-app-01(后续 Pipeline 里用这个名字引用)
  • Hostname / Port:目标服务器地址与端口(默认 22)
  • Username:建议用专用发布账号(最小权限原则)
  • Authentication:优先用 SSH 私钥(比密码更稳、更可审计)
  • Test Configuration:测试连通,确保基础网络/权限没问题

企业落地建议:发布账号只给“上传目录+执行脚本”的权限,避免一把梭把生产机权限送出去(这不是谨慎,这是基本职业操守😄)。


2)Pipeline(Jenkinsfile)标准示例 ✅

Jenkinsfile 示例:上传构建产物并在远程发布

pipeline {
  agent any

  stages {
    stage('Build') {
      steps {
        sh '''
          mkdir -p dist
          echo "hello" > dist/version.txt
          tar -czf dist/app.tar.gz dist/
        '''
      }
    }

    stage('Deploy via SSH') {
      steps {
        sshPublisher(
          publishers: [
            sshPublisherDesc(
              configName: 'prod-app-01',
              verbose: true,
              transfers: [
                sshTransfer(
                  sourceFiles: 'dist/app.tar.gz',
                  removePrefix: 'dist',
                  remoteDirectory: '/opt/apps/myapp/releases/${BUILD_NUMBER}',
                  cleanRemote: false,
                  execCommand: '''
                    set -e
                    mkdir -p /opt/apps/myapp/current
                    tar -xzf /opt/apps/myapp/releases/${BUILD_NUMBER}/app.tar.gz -C /opt/apps/myapp/current
                    systemctl restart myapp
                    systemctl is-active --quiet myapp
                  ''',
                  execTimeout: 120000,
                  usePty: true
                )
              ]
            )
          ]
        )
      }
    }
  }
}

逐段解释(务实版)

① Build 阶段

  • mkdir -p dist:创建产物目录,避免目录不存在导致打包失败。
  • echo "hello" > dist/version.txt:模拟生成构建文件(真实项目这里通常是编译/打包输出)。
  • tar -czf dist/app.tar.gz dist/:把产物打成压缩包,便于传输与回滚(一个包就是一个版本)。

② Deploy via SSH 阶段(关键)

  • sshPublisher(...):插件提供的 Pipeline 步骤,用于“传文件 + 远程执行命令”。
  • configName: 'prod-app-01':引用你在全局配置里建好的那台 SSH Server。
  • verbose: true:输出更详细日志,排障时非常值钱(上线稳定后可关闭)。
  • sourceFiles: 'dist/app.tar.gz':从工作区上传这个文件(相对路径)。
  • removePrefix: 'dist':上传到远端时去掉本地路径前缀,避免远端出现多层 dist/ 目录。
  • remoteDirectory: '/opt/apps/myapp/releases/${BUILD_NUMBER}':远端落盘目录,按构建号分版本,天然支持回滚。📦
  • execCommand: ''' ... '''上传完成后在远端执行发布脚本:
    • set -e:任一命令失败立刻退出,让发布“失败即失败”,别假装成功。
    • mkdir -p ...:保证目录存在。
    • tar -xzf ... -C ...:解压到 current 目录。
    • systemctl restart myapp:重启服务。
    • systemctl is-active --quiet myapp:健康检查,不健康就让流水线失败(这叫靠谱)。✅
  • execTimeout: 120000:远程命令超时(毫秒),2 分钟;避免卡死挂流水线。
  • usePty: true:开启伪终端,解决某些 sudo / 终端依赖命令在非 tty 下无法执行的问题。

3)Freestyle(自由风格)示例(Post-build)

在任务配置里:Post-build Actions → Send files or execute commands over SSH

  • SSH Server:选 prod-app-01
  • Source filesdist/app.tar.gz
  • Remove prefixdist
  • Remote directory/opt/apps/myapp/releases/${BUILD_NUMBER}
  • Exec command:同上面的 execCommand 逻辑(解压、重启、健康检查)

**解释:**Freestyle 的字段含义与 Pipeline 基本一致,只是写法从“代码”变成“表单”。适合快速上手,但长期建议迁移到 Jenkinsfile,便于版本管理与审计。📌


4)最常见的两个坑(提前踩刹车🧯)

  1. 传了 0 个文件
    通常是 sourceFiles 路径不对(相对工作区),或者打包产物没生成。建议在上传前加一步 ls -al dist 验证。
  2. 远程命令执行成功但服务没起来
    一定要加 systemctl is-active --quiet 这类健康检查,让流水线替你“说真话”,别把风险留到用户侧。

这套配置的本质是:把部署当成产品交付流程,做到可追踪、可回滚、可验证。你会发现上线开始变得“像工程”,而不是“像祈祷”🙂✨

已经是第一篇啦!

下一篇: 服务器路由命令有哪些常用技巧?