我们刚刚开始使用Jenkins的CI - 所以我们肯定会在新手阶段。这就是我们要做的事情:
我们正在使用Publish Over SSH Jenkins插件将构建工件传输到目标服务器并传输到特定的根文件夹 - 让我们将其称为/ var / mycompany / myapp,这就是问题发生的地方。
我们已将Publish Over SSH插件配置为使用密钥以建立与目标服务器的连接。在Manage Jenkins>配置系统> SSH Servers部分我们还配置了目标ssh服务器(名称/主机名/用户名/远程文件夹等)。测试时连接成功。
构建作业已配置为"通过SSH发送工件"作为一个后期制作动作。现在这个工作正常,只要我将文件发送到目标服务器上用户的主文件夹位置(即它将创建必要的〜/ var / mycompany / mayapp文件夹结构并传输所有文件)。但是 - 如果我更改"通过SSH发布" config使用" /"的远程目录;作业失败,出现以下错误:
SSH:从主机连接[myjenkins] SSH:正在连接 配置[stage-tester] ... SSH:创建会话:用户名 [myusername],hostname [x.x.x.x],port [22] SSH:连接会话 ... SSH:连接SSH:打开SFTP通道... SSH:SFTP通道 打开SSH:连接SFTP通道... SSH:连接SSH:cd [/] SSH: OK SSH:cd [var] SSH:OK SSH:cd [mycompany] SSH:OK SSH:mkdir [myapp] SSH:FAILED:消息[Permission denied]
首先,这对我们有意义,因为密钥是由特定用户创建的,该用户不是目标Linux / Fedora服务器上的sudoer。因此,我们让用户成为一个sudoer组的成员,期望这可以解决问题。它还没有修复这个问题 - 我们继续拒绝"许可被拒绝"错误。那么问题是我们如何获取用户/密钥的服务器根目录?
任何建议表示赞赏。 谢谢!
答案 0 :(得分:2)
最后这是我使用的解决方案:
使用找到的说明here我在/var/lib/jenkins/.ssh文件夹中设置了“jenkins-chef”ssh密钥对,并将公钥传输到目标上的jenkins用户的authorizedkeys文件部署服务器。
将/var/lib/jenkins/.ssh中的密钥对(从步骤1)chown到“jenkins”用户,以便步骤3中的Jenkins ssh服务器配置可以读取密钥
在Jenkins中设置SSH服务器引用:在Manage Jenkins>下;配置系统> SSH服务器>添加了指向我的目标部署服务器的新ssh服务器ref,使用'jenkins'用户名和新密钥的路径(/var/lib/jenkins/.ssh/jenkins-chef)。此外,我们希望从目标服务器的根(/)文件夹发布到一个文件夹,结果我们将“远程目录”指定为“/”(根)
在我的Jenkins工作中,我使用“通过ssh发送文件或执行命令”插件添加了一个新的构建步骤。我将其配置为使用我在步骤3中定义的ssh服务器:
注意:如果我尝试使用初始根斜杠(/ var / my-apps / my-app)指定远程目录,则会将其复制到Jenkins用户的主文件夹,然后只创建指定的文件夹结构。这就是为什么在步骤3中指定'/'很重要。
这是詹金斯方面的。但是,当我第一次尝试运行时,我收到了这个错误:
SSH:EXEC:STDOUT / STDERR来自命令[sudo chef-client] ... sudo:没有 tty存在且没有指定askpass程序
这是因为我试图运行'sudo',它在目标服务器上发出密码质询。为了避免这种情况,我使用'visudo'命令对目标服务器上的sudoers文件进行了以下更改:在文件的底部我添加了这一行,以便jenkins用户能够在不提示输入密码的情况下运行sudo:
jenkins ALL =(ALL)NOPASSWD:ALL
一旦完成,一切都按预期工作。
答案 1 :(得分:0)
在使用Linux计算机时,您可以尝试使用SCP Plugin。
在全局配置中,您只需要定义目标服务器:
您可以使用jenkins public ssh密钥来管理身份验证或用户/密码。
接下来,在Jenkins作业中,您可以创建一个后期构建任务来复制服务器上的相关工件: