服务公告

服务公告 > Linux命令 > 蓝易云cdn:jenkins教程

蓝易云cdn:jenkins教程

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

下面给你一套可直接落地的 Jenkins sshPublisher(Publish Over SSH)示例:从“全局配好 SSH 目标机”到“Pipeline 一键推包 + 远程重启”。🚀
sshPublisher 属于 Publish Over SSH 插件能力,支持传文件 + 执行远程命令。(Jenkins Plugins))


1)前置条件(别跳过这一步)

  • Jenkins 版本:截至 2026-01,Publish Over SSH 插件主页显示当前版本要求 Jenkins 2.479.1+。(Jenkins Plugins)
  • 认证方式:推荐“密钥认证”(更稳定、可审计),插件也支持用户名密码或公钥认证。(Jenkins Plugins)

2)生成密钥并授权远端(部署账号建议独立)🛡️

# 1) 在 Jenkins 执行机(Controller 或跑任务的 Agent)生成密钥
ssh-keygen -t ed25519 -C "jenkins-deploy" -f ~/.ssh/jenkins_deploy -N ""

# 2) 把公钥写入远端部署用户的 authorized_keys(示例用户 deploy)
cat ~/.ssh/jenkins_deploy.pub | ssh deploy@10.0.0.12 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

解释(逐行讲清楚):

  • ssh-keygen ... -t ed25519:生成更现代的密钥类型,性能好、长度短。
  • -f ~/.ssh/jenkins_deploy:指定私钥文件名,避免覆盖默认密钥。
  • 第二段 cat ... | ssh ...:把公钥追加到远端 authorized_keys,并顺手把目录权限修正确保 SSH 不拒绝登录(权限不对是最常见坑之一)。

3)Jenkins 全局配置(一次配置,所有任务复用)✅

路径:Manage Jenkins → Configure System → Publish over SSH → SSH Servers → Add

这里的 Name 很关键:后面 Pipeline 里会用 configName 精确引用它。(Jenkins)


4)Pipeline:sshPublisher 最小可用示例(传包 + 重启)🚀

pipeline {
  agent any

  stages {
    stage('Build') {
      steps {
        sh 'mvn -q -DskipTests package'
      }
    }

    stage('Deploy') {
      steps {
        sshPublisher(
          failOnError: true,
          publishers: [
            sshPublisherDesc(
              configName: 'prod-app-01',
              verbose: true,
              transfers: [
                sshTransfer(
                  sourceFiles: 'target/*.jar',
                  removePrefix: 'target',
                  remoteDirectory: "releases/${env.BUILD_NUMBER}",
                  execCommand: """
set -e
ln -sfn /opt/app/releases/${env.BUILD_NUMBER} /opt/app/current
sudo systemctl restart myapp
"""
                )
              ]
            )
          ]
        )
      }
    }
  }
}

解释(把关键参数讲透):

  • sh 'mvn ... package':构建产物(示例是 target/*.jar)。你也可以替换成前端打包、Go build 等。
  • sshPublisher(...):核心发布步骤;failOnError: true 表示发布失败就让构建直接失败(交付口径更“硬”,适合生产)。(Jenkins)
  • configName: 'prod-app-01':绑定你在“全局配置”里定义的 SSH Server。(Jenkins)
  • sourceFiles: 'target/*.jar':要上传的文件,支持 Ant 风格匹配。(Jenkins)
  • removePrefix: 'target':上传时去掉本地路径前缀,让远端目录结构更干净(否则可能把 target/ 整个带过去)。(Jenkins)
  • remoteDirectory: "releases/${env.BUILD_NUMBER}":在远端基准目录下创建版本目录,天然具备“可回滚”结构(把 current 指向旧版本即可)。(Jenkins)
  • execCommand:文件传完后执行命令;set -e 让脚本任何一步失败都立即退出,避免“半成功半失败”的灰色状态。(Jenkins)

⚠️ 非常容易踩的点Remote Directory 更偏向“传文件路径基准”,执行命令不一定在该目录下运行,所以建议命令里用绝对路径或显式 cd。(groups.google.com)


5)两条实战建议(让交付更像企业级)

  1. 最小权限 + 可审计:deploy 用户只给必要目录写权限;重启服务用 sudo 且只放行 systemctl restart myapp(避免把服务器变成“公共遥控器”😄)。
  2. 网络复杂时:如果 Agent 到目标机网络不通,但 Controller 能通,可考虑 alwaysPublishFromMaster 让文件经由 Controller 中转(代价是链路更长、耗时更高)。(Jenkins)

如果你告诉我:你部署的是 Spring Boot / Node / PHP / Go 哪一种、以及远端是 systemd / pm2 / docker compose 哪套,我可以把 execCommand 改成更稳的“停旧起新 + 健康检查 + 失败自动回滚”版本。

已经是第一篇啦!

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