如何通过SSH将TFS构建的Jar包部署至目标Linux服务器?
如何通过TFS发布作业用SSH将Jar包部署到Linux服务器
我来帮你一步步搞定这个部署流程——其实TFS的发布作业里的SSH任务完全能满足需求,下面是具体的操作步骤和示例:
前期准备工作
在开始配置发布管道前,先做好这几件事:
- 测试SSH连通性:在你的Ubuntu代理机器上,手动执行
ssh username@target-linux-server-ip,确保能无密码登录目标服务器(如果用密钥认证,把代理机器的公钥添加到目标服务器的~/.ssh/authorized_keys文件里;如果用密码,后续在TFS里配置服务连接时填入即可)。 - 确认TFS的SSH任务可用:如果是较新版本的本地TFS(比如Azure DevOps Server),SSH任务是默认自带的;如果是旧版TFS,需要到Marketplace安装SSH任务扩展。
创建发布管道的具体步骤
1. 新建发布管道并关联构建工件
- 打开TFS的发布页面,点击新建发布管道,选择"Empty job"(空任务模板)。
- 在工件区域,点击添加,选择你的Maven构建作为源,指定要部署的构建版本,确认后保存。
2. 添加SSH上传文件任务
这个任务负责把构建生成的Jar包从代理机器传到目标Linux服务器:
- 在发布阶段的任务列表里,点击添加任务,搜索并选择SSH Upload Files任务。
- 配置任务参数:
- SSH service connection:点击"新建",填入目标服务器的IP、SSH端口(默认22)、用户名、认证方式(密钥或密码),保存这个连接。
- 源文件:填写
$(System.DefaultWorkingDirectory)/**/*.jar(会匹配构建工件里所有的Jar包;如果只需要特定Jar包,比如$(System.DefaultWorkingDirectory)/MyMavenBuild/drop/my-app.jar,这里的MyMavenBuild是你的构建工件名称)。 - 目标路径:填写目标服务器上的部署目录,比如
/opt/my-app/(确保这个目录存在,或者后续在脚本里创建)。
3. 添加SSH执行脚本任务
上传完Jar包后,需要执行脚本完成停止旧服务、替换Jar包、启动新服务的操作:
- 再次添加任务,搜索并选择SSH任务(选择"Run shell script"类型)。
- 配置任务参数:
- SSH service connection:选择刚才创建的目标服务器连接。
- Script:选择"Inline",然后填入以下示例脚本(根据你的实际服务管理方式调整):
# 1. 创建部署目录(如果不存在) mkdir -p /opt/my-app # 2. 停止正在运行的应用服务(假设用systemd管理,替换成你的服务名) sudo systemctl stop my-app.service # 3. 备份旧版本Jar包(带时间戳) mv /opt/my-app/my-app.jar /opt/my-app/my-app-backup-$(date +%Y%m%d%H%M).jar 2>/dev/null || true # 4. 重命名新上传的Jar包(如果有多个,取最新的或者指定名称) mv /opt/my-app/*.jar /opt/my-app/my-app.jar # 5. 启动新服务 sudo systemctl start my-app.service # 6. 验证服务状态 sudo systemctl status my-app.service
关键注意事项
- 权限问题:目标服务器的SSH用户需要有部署目录的读写权限,或者配置sudo免密执行
systemctl命令(可以编辑/etc/sudoers文件,添加username ALL=(ALL) NOPASSWD: /bin/systemctl stop my-app.service, /bin/systemctl start my-app.service, /bin/systemctl status my-app.service)。 - 工件路径验证:可以在代理机器上查看
$(System.DefaultWorkingDirectory)对应的实际路径,确保Jar包的源路径正确。 - 测试环节:先手动在代理机器上执行上传和部署脚本,确认流程能正常运行后,再放到TFS发布任务里,避免踩坑。
内容的提问来源于stack exchange,提问作者Yonnatan Bar
相关产品推荐
相关产品推荐

