36

我想用 jenkins 部署到测试环境和生产环境。为此,我需要连接到所需环境的服务器,例如 ssh/scp。

我想知道最好的方法是什么。

我找到了一些插件来做到这一点,比如 Jenkins-Deploy-Plug-in 或 Jenkins Publish over SSH Plugin。第一个有很多问题,部署到生产环境中并不值得信赖,第二个你需要更改全局配置,每次部署都是手动工作。

任何想法如何解决这个问题?也许有一些脚本或插件?

我目前唯一的想法是:将 jenkins 连接到服务器(可能使用 SSH 插件)并在那里执行连接到所需环境的脚本。但这是两个联系。这真的有必要吗?我希望有一个更直接的方法。

感谢您的任何提示。

4

3 回答 3

21

我建议以下程序:

一个单一的 shell 脚本(存储在 jenkins 服务器上的某处)可以完成所有工作。基本上,该脚本执行构建工件的 scp,然后连接到服务器 (ssh) 并执行所有必要的部署任务(设置维护页面、备份当前应用程序、部署新应用程序,...)。

在 jenkins 服务器上,至少有 2 个作业:

  • 第一个只是进行构建(使用 maven 或任何其他构建脚本)
  • 第二个工作是部署:所以这个工作只运行 shell 脚本。(我建议为每个目标环境执行一项部署工作:测试、生产……)

它不需要任何“特殊”的詹金斯插件来实现这种“一键部署”。它只要求 jenkins 用户对目标服务器具有 ssh 访问权限。

编辑

这是一个示例 shell 脚本来说明我的帖子

#This script will copy the last artifact build by the job "MyApp" to test.myserver.com
#and remotely execute the deployment script.

#copy the war to the server
#(the job "MyApp" is using maven, that's why the war can be found at this location)
scp -i <HOME_DIR>/.ssh/id_dsa $HUDSON_HOME/jobs/MyApp_Build/workspace/myapp/target/myapp.war     deployeruser@test.myserver.com:/tmp/

#connect to the server and execute the deployment script
ssh -i <HOME_DIR>/.ssh/id_dsa deployeruser@test.myserver.com 
#The following is just an example of what a deployment script can be.
#of course you must adapt it to your needs and environment
"cd <TOMCAT_DIR>;
#first copy the current war to a backup directory (additionaly, I have a cron task deleting old undeployed apps)
cp -rf myapp-apps/myapp* undeployed/myapp-apps/; 
#execute a script (stored on the server) to properly stop the app
sh bin/myapp.sh stop; 
#delete current app
rm -rf myapp-apps/myapp; 
rm -rf myapp-apps/myapp.war;
#copy the uploaded war in tomcat app directory 
cp /tmp/myapp.war myapp-apps/; 
#execute a script (stored on the server) to start the app
sh bin/myapp.sh start"
于 2012-12-20T16:45:30.363 回答
8

使用 SSH 会损害您环境的安全性,
并且很难排除故障。

最好在远程机器上安装Jenkins-Slave
并通过在 Slave 上执行 Job 来运行测试。

Slave 由 Server 监控,这为您节省了
管理连接的很多麻烦。

您可以在成功构建结束时触发远程作业并将
该构建的工件传递给它。
(也可以让第一个作业将工件存储在共享驱动器上
,并将这些工件的位置传递给下一个作业)。

看这里:

于 2012-12-21T15:46:37.813 回答
3

理想情况下,您应该使用FabricCapistrano之类的东西进行部署,并从 Jenkins 调用这些脚本。我也将 Capistrano 广泛用于 Ruby On Rails 和非 Ruby 应用程序。我看到的最大优势是:

  • 内置的智能回滚部署,以防部署时出现错误。
  • 它提供了运行一组脚本的钩子,例如数据库迁移、服务重启等。
  • 如果需要,手动回滚。
于 2014-12-14T17:20:29.630 回答